-4

I have an Android app that contains two languages, I want to add switcher When pressed, the application is in English, When pressed, the application becomes Arabic

Alex K
  • 21,796
  • 18
  • 106
  • 231

2 Answers2

0

Call the below function to update the language.

private void updateLanguage(String languageCode)  //languageCode ex. 'en' for english 
{
    Context context = LocaleHelper.setLocale(MainActivity.this, languageCode);
    Log.v("langcode", languageCode);
    Resources resources = context.getResources();
}

Create a class named LocaleHelper to do the things.

class LocaleHelper {

private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

public static Context onAttach(Context context) {
    String lang = getPersistedData(context, Locale.getDefault().getLanguage());
    return setLocale(context, lang);
}

public static Context onAttach(Context context, String defaultLanguage) {
    String lang = getPersistedData(context, defaultLanguage);
    return setLocale(context, lang);
}

public static String getLanguage(Context context) {
    return getPersistedData(context, Locale.getDefault().getLanguage());
}

public static Context setLocale(Context context, String language) {
    persist(context, language);

    Log.v("abcdef", Locale.getDefault().getLanguage());

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Log.v("Updatinglocale","Nougat");
        return updateResources(context, language);
    }

    return updateResourcesLegacy(context, language);
}

public static String getPersistedData(Context context, String defaultLanguage) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
}

private static void persist(Context context, String language) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putString(SELECTED_LANGUAGE, language);
    editor.apply();
}

@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);

    return context.createConfigurationContext(configuration);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;

    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;
}

}
Rishabh Sharma
  • 270
  • 5
  • 17
0

Try this...

By default android considers English as primary language and loads the string resources from res ⇒ values ⇒ strings.xml. When you want to add support for another language, you need to create a values folder by appending an Hyphen and the ISO language code

In your language update method

If(strlanguageToLoad.contentEquals("en"){
  Locale locale = new Locale(strlanguageToLoad);
  Locale.setDefault(locale);
  Configuration config = new Configuration();
  config.locale = locale;
  getBaseContext().getResources().updateConfiguration(config,
        getBaseContext().getResources().getDisplayMetrics());

//save strlanguageToLoad in sharedPreference to check later
  sharePref_Editor = sharePrefs.edit();
  sharePref_Editor.putString(“SAVED_LANGUAGE”, "en");
  sharePref_Editor.commit();

//refresh the activity 

}else{
//for arabic “ar”
//Do the same here like “en” above
}

onCreate

Check the sharedPreference for the language on each and every activity and do the follow

if (sharePrefs.getString(“SAVED_LANGUAGE”, "").equalsIgnoreCase("ar")) {
    String languageToLoad = "ar"; // your language
    Locale locale = new Locale(languageToLoad);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());

} else {
    String languageToLoad = "en";
    Locale locale = new Locale(languageToLoad);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());
}

For sample check here

Arnold Brown
  • 1,242
  • 10
  • 25