Search code examples
androidlocale

Android - Change app locale manually on button click


I want to change the application's Locale (language) to change programmatically when user wants to switch between Hindi and English using change language button.

I have a code to change language in place but it works only when I call in in the onCreate() of an activity before setContentView() method.

Any help is much appreciated.


Solution

  • See here my answer

    Android Font in more then one langauge on single screen

    for example if you want your application to support both English and Arabic strings (in addition to the default strings), you can simply create two additional resource directories called /res/values-en (for the English strings.xml) and /res/values-ar (for the Arabic strings.xml).

    Within the strings.xml files, the resource names are the same.

    For example, the /res/values-en/strings.xml file could look like this:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="hello">Hello in English!</string>
    </resources>
    

    Whereas, the /res/values-ar/strings.xml file would look like this:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="hello">مرحبا في اللغة الإنجليزية</string>
    </resources>
    

    also , the /res/values-ur_IN/strings.xml file would look like this for urdu:

    ur_IN for india ur_PK for pakisthan

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="hello">انگریزی میں خوش!!</string>
    </resources>
    

    A default layout file in the /res/layout directory that displays the string refers to the string by the variable name @string/hello, without regard to which language or directory the string resource is in.

    The Android operating system determines which version of the string (French, English, or default) to load at runtime.A layout with a TextView control to display the string might look like this:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/hello" >
    </LinearLayout>
    

    The string is accessed programmatically in the normal way:

    String str = getString(R.string.hello);
    

    For change the language you need to like that change lang..

    btn_english.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    Locale locale = new Locale("en"); 
                      Locale.setDefault(locale);
                      Configuration config = new Configuration();
                      config.locale = locale;
                      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                      Toast.makeText(this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show();
    
                }
            });
    
    
    
     btn_arbice.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                     Locale locale = new Locale("ar"); 
                      Locale.setDefault(locale);
                      Configuration config = new Configuration();
                      config.locale = locale;
                      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                      Toast.makeText(this, getResources().getString(R.string.lbl_langSelecURdu), Toast.LENGTH_SHORT).show();
    
                }
            });
    
    
     btn_urdu.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    Locale locale = new Locale("ur_IN"); 
                      Locale.setDefault(locale);
                      Configuration config = new Configuration();
                      config.locale = locale;
                      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                      Toast.makeText(HomeActivity.this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show();
    
                }
            });