Search code examples
androidlocalizationmultilingual

Enabling multi language support for android application


I'm developing an android application which should support both English and Arabic.I have done a. Created values folder for English and Arabic and updated the strings used. b. Created an Application class for localization c. Implemented the code on button click in Activity

See my Application file

MyApp.java

import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import java.util.Locale;
public class MyApp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
    }

    public static void setLocaleAr (Context context){
        Locale locale = new Locale("ar");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getApplicationContext().getResources().updateConfiguration(config, null);
    }

    public static void setLocaleEn (Context context){
        Locale locale = new Locale("en_US");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getApplicationContext().getResources().updateConfiguration(config, null);
    }
}

My activity class using button click

MainActivity.java

    import android.app.Activity;
    import android.content.Intent;
    import android.content.res.Configuration;
    import android.content.res.Resources;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.DisplayMetrics;
    import android.view.View;
    import android.view.Window;
    import android.widget.Button;
    import android.widget.SimpleAdapter;

    import java.util.Locale;

    public class SplashActivity extends Activity implements View.OnClickListener{

        // Splash screen timer
        private static int SPLASH_TIME_OUT = 3000;
        Button buttonEnglish,buttonArabic;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);


            buttonEnglish =(Button) findViewById(R.id.buttonEnglish);
            buttonArabic =(Button) findViewById(R.id.buttonArabic);

            buttonEnglish.setOnClickListener(this);
            buttonArabic.setOnClickListener(this);

        }
        @Override
        public void onClick(View view) {
           switch(view.getId()) {
               case R.id.buttonEnglish:
                   MyApp.setLocaleEn(SplashActivity.this);
                   setLocale("en");
                   break;
               case R.id.buttonArabic: {
                   //buttonArabic.setBackground(getDrawable(R.color.white));
                   MyApp.setLocaleAr(SplashActivity.this);
                   setLocale("ar");
                   break;
               }
           }
        }
    }

Solution

  • Just forget everything and just implement the below code Snippet

    Inside your build.gradle file

    defaultConfig
     {
        resConfigs "en", "ar"
     }
    

    And inside your activity:

     @Override
        public void onClick(View view) 
        {
           switch(view.getId()) 
           {
               case R.id.buttonEnglish:
    
                   updateLanguage("en");
    
                   break;
               case R.id.buttonArabic: 
    
                    updateLanguage("ar");
    
                   break;
           }
        }
    
    @Override
    public void recreate()
    {
        if (android.os.Build.VERSION.SDK_INT >= 14)
        {
            super.recreate();
        }
        else
        {
            startActivity(getIntent());
            finish();
        }
    }
    
    private void updateLanguage(String language)
    {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    
        SharedPreferences languagepref = getSharedPreferences("language",MODE_PRIVATE);
        SharedPreferences.Editor editor = languagepref.edit();
        editor.putString("languageToLoad",language);
        editor.apply();
    
        recreate();
    }