Change app language programmatically in Android

前端 未结 30 3050
面向向阳花
面向向阳花 2020-11-21 04:34

Is it possible to change the language of an app programmatically while still using Android resources?

If not, is it possible to request a resource in an specific lan

30条回答
  •  忘了有多久
    2020-11-21 05:07

    According to this article. You will need to download LocaleHelper.java referenced in that article.

    1. Create MyApplication class that will extends Application
    2. Override attachBaseContext() to update language.
    3. Register this class in manifest.

      public class MyApplication extends Application {
         @Override
         protected void attachBaseContext(Context base) {
          super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
         }
      }
      
      
      
    4. Create BaseActivity and override onAttach() to update language. Needed for Android 6+

      public class BaseActivity extends Activity {
        @Override
        protected void attachBaseContext(Context base) {
          super.attachBaseContext(LocaleHelper.onAttach(base));
        }
      }
      
    5. Make all activities on your app extends from BaseActivity.

      public 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);
      
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
              return updateResources(context, language);
          }
      
          return updateResourcesLegacy(context, language);
      }
      
      private 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);
          configuration.setLayoutDirection(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;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
              configuration.setLayoutDirection(locale);
          }
      
          resources.updateConfiguration(configuration, resources.getDisplayMetrics());
      
          return context;
      }
      }
      

提交回复
热议问题