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

Linked List in Java - Collections Framework- DSA

Gist: A Linked list is dynamic array where a group of object can be stored while following the insertion order and allow duplicates, the 2 type of linked list is singly and double linked lists, the default one is single linked list where the elements can be traversed only in forward direction this is because unlike array here the elements are stored at random locations and only the node of each element knows the address of the next element. A simple example would be our circut board here a point X may be connection to Y and Y connectioned to pont Z here the insertion order is preserved and we can know the next point only by following the signals from the previous point. Same as the example but in Linked list each element has 2 parts in singly linked list where 1 part is the node with the adress to the next node and the other which is the actua data of that element like a post letter the envelop has the address and inside the contents. but in doubly linked list there are 3 parts ...

Designer PDF Viewer - HackerRank Problems

Difficulty: EASY Problem : The objective here is to find the size of the highlighted area, and we are given the size's of all the alphabets, we have to find the largest alphabet in the highlighted word and then calculate the size of the rectangle so if the tallest character is 3 then the size of the box will be 3 * number of characters given. Visual representation of the selection : abc def ghij Inputs An array with the sizes of all alphabets a-z in order. A String of highlighted words. Important points to note The array which holds the height of each character in ascending order which means the arrays 0th index will have the height of a 1st index will have the height of b and so on and so forth in the end the hight of z will be there so it's easy to locate each character. A String with the highlighted word. This means we have got the characters inside the rectangle, all we have to find is ...

Naming Conventions in Java

Naming Conventions in Java As the movies are rated G, PG, U, A depending on the age restriction and by just gazing through the rating our parents decide the movie to watch together, or a book with diffrent labels to keep track of the sections and just by seeing them we know what they represent, the same labeling method has been introduced by Java team to diffrenciate variables, methods, classes, constants etc.. and we will be going through them all here. Type Naming Convention Example Variables Must start with a lower case and every other word capitalized int counter; Constants Must all be upper case and _ for diffrenciating every other word final int MAX_HEALTH = 100; Methods Must start with a lower case and every other word capitalized. can be distingiused from the variable by the () next to the method name void printNum(){..} Class Must start an upper case letter and every other word must ...