Android изменит и установит локаль по умолчанию в приложении

Я работаю над глобализацией приложения для Android. Я должен предоставить варианты выбора разных локалей из приложения. Я использую следующий код в своей деятельности (HomeActivity), где я предоставляю возможность изменить локаль

Configuration config = new Configuration();
config.locale = selectedLocale; // set accordingly 
// eg. if Hindi then selectedLocale = new Locale("hi");
Locale.setDefault(selectedLocale); // has no effect
Resources res = getApplicationContext().getResources();
res.updateConfiguration(config, res.getDisplayMetrics());

Это работает отлично, пока не происходит никаких изменений конфигурации, таких как поворот экрана, где локаль по умолчанию соответствует языку системы уровня Android, а не языку, заданному кодом.

Locale.setDefault(selectedLocale);

Одним из решений, о котором я могу думать, является сохранение выбранного пользователем языка с помощью SharedPreferences, и в каждом из действий onCreate() метод locale устанавливается на постоянную локаль, так как onCreate() вызывается снова и снова для каждого изменения конфигурации. Есть ли лучший способ сделать это, чтобы мне не приходилось делать это в каждой деятельности.

В принципе, я хочу, чтобы: - Как только я изменил/установил какой-то язык в своей HomeActivity, я хочу, чтобы все действия в моем приложении использовали этот язык независимо от любых изменений конфигурации.... если и до тех пор, пока он не будет изменен на другой локаль из приложения HomeActivity, которое предоставляет опции для изменения локали.

Ответы

Ответ 1

Хотя решение, указанное в этом ответе, работает в общем случае, я обнаружил, что добавляю к экрану предпочтений:

 <activity android:name="com.example.UserPreferences"
     android:screenOrientation="landscape"
     android:configChanges="orientation|keyboardHidden|screenSize">
 </activity>

Это связано с тем, что когда приложение находится в ландшафтном режиме, а экран предпочтений в портретном режиме, изменение языка и возврат к приложению могут вызвать проблемы. Установка обоих режимов в альбомном режиме предотвратит это.

Общее решение

Вам нужно изменить языковой стандарт на уровне приложения, чтобы его эффекты были повсюду.

public class MyApplication extends Application
{
  @Override
  public void onCreate()
  {
    updateLanguage(this);
    super.onCreate();
  }

  public static void updateLanguage(Context ctx)
  {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
    String lang = prefs.getString("locale_override", "");
    updateLanguage(ctx, lang);
  }

  public static void updateLanguage(Context ctx, String lang)
  {
    Configuration cfg = new Configuration();
    if (!TextUtils.isEmpty(lang))
      cfg.locale = new Locale(lang);
    else
      cfg.locale = Locale.getDefault();

    ctx.getResources().updateConfiguration(cfg, null);
  }
}

Затем в вашем манифесте вы должны написать:

<application android:name="com.example.MyApplication" ...>
  ...
</application>