Skip to main content

Implementing In-app and pre-locale language selection in Android

Modern Android App Architecture

One of the essential features for a globalized app is the ability to provide users with the option to choose their preferred language within the application. In this blog post, we will guide you through the process of implementing in-app language selection in an Android app.

Step 1: Create Locale String Resource

Create a string resource file for each respective locale by navigating to res > new > Android Resource File. Select Locale and create a
string.xml
file. Copy and paste the translations of your app content into these files.

Step 2: Configure Locale Preferences

In the res/xmlfolder, create a new file called locales_config.xml and specify the locales of your choice. for example look at the following code:

<?xml version="1.0" encoding="utf-8"?> <locale-config xmlns:android="http://schemas.android.com/apk/res/android"> <locale android:name="en" /> //English <locale android:name="ta" /> //Tamil <locale android:name="hi" /> //Hindi <locale android:name="ml" /> //Malayalam </locale-config>

Step 3: Add resource.properties file

Switch to project view and in the resfolder, create a new file called resources.properties and specify the default locales of your choice, this will be the fallback locale if the requested one is un-available,for example look at the following code:

unqualifiedResLocale=en

Step 4: Update Module Gradle File

The list of language tags need to added to resourseConfiguration make sure you add all the language tags, have shared the updated code below as per my sample app:

android { ... androidResources { generateLocaleConfig = true } ... defaultConfig { ... resourceConfigurations.plus(listOf("ta", "en", "hi", "your-language-tag")) } }

Step 5: Manifest Configuration

You can let the device handle the locales, for that we are going to use a service called androidx.appcompat.app.AppLocalesMetadataHolderService with the following configuration, you can just copy paste the following code

<application ...> <service android:name="androidx.appcompat.app.AppLocalesMetadataHolderService" android:enabled="false" android:exported="false"> <meta-data android:name="autoStoreLocales" android:value="true" /> </service> </application>

Step 6: Implement Locale Selection Function

fun localeSelection(context: Context, localeTag: String) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { context.getSystemService(LocaleManager::class.java).applicationLocales = LocaleList.forLanguageTags(localeTag) } else { AppCompatDelegate.setApplicationLocales( LocaleListCompat.forLanguageTags(localeTag) ) } }

Step 7: Usage Example

val context = LocalContext.current Button(onClick = { localeSelection(context = context, localeTag = Locale("ta").toLanguageTag()) }) { Text(text = "Tamil") }

That's it! You've successfully implemented in-app language selection in your Android app. Feel free to check out the sample app on GitHub for a hands-on example.

If you encounter any issues or have questions, please leave a comment, and will do my best to assist you.

Comments

Popular posts from this blog

Chocolate Feast - Problem Solving - Hacker Rank Solution.

The expectation is to find the total number of choclate one can consume by taking full advantage of the offer, Here there are 3 inputs n which holds the value of initial amount of money for buying choclate, c is the cost price of each candy if paid by cash and m is the exchange rate for the candy. Inputs n Initial cash to buy candy. c Coast of each candy if paid by cas.h m Exchange rate for a new candy in offer. The initial count of choclate will be the cash / coast and the wrappers in hand will be the same value of choclate, and from there we loop through until the wrap count is less than the exchange rate, inside the loop the choclate count will still hold the same fourmula as before but divided with exchange rate. The wrap count is the tricky part... the wrap will be wrap/ exchange rate(the no. choclate) + the remainder of this division(THIS IS VERY IMPORTANT) because for example if the count of wrapper is 3 and the exchange rate is 2 you can only buy 1 c...

Search Textfield with options and clear button ideal for app TopBar- Jetpack Compose Component

In this blog post, we'll explore a simple yet effective implementation of a search bar in Jetpack Compose. The provided SearchTextField composable offers a basic text field with a placeholder, suitable for building the app top bar. Screen Shot of the Component from my Jot-app The following code can be used to your project directly and it should work as expected, the idea was to have a search bar for a top app which can also hst the buttons on either ends,do check the code below If you have any suggestions or improvements for the code, let's have a conversation below. Your feedback is valuable to me