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>