我们的应用程序中有默认的英语和其他几种语言的翻译。
当用户启动应用时,我们会调用Locale.setDefault()
将其设置为我们翻译的区域设置。例如,手机以西班牙语运行,但我们没有西班牙语翻译,我们称之为Locale.setDefault(Locale.US)
。我们需要这个用于时间格式化,因为libs使用Locale.getDefault()
。
它完美地工作到android 24. Android 24"忽略" Locale.setDefault()
。并且所有日期都使用设备语言格式化,但不是应用语言。
答案 0 :(得分:2)
因此,解决方案不仅要更改区域设置,还要更改配置内的区域设置。
在应用程序类
中@Override
protected void attachBaseContext(Context base) {
LocaleUtil.getInstance().invalidateCurrentLocale(base);
super.attachBaseContext(base);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LocaleUtil.getInstance().invalidateCurrentLocale(this);
}
这是LocaleUtil方法
public void invalidateCurrentLocale(Context context) {
updateResources(context,
getLocaleOrDefault(getConfigLocale(context.getResources().getConfiguration())));
}
public Locale getConfigLocale(Configuration configuration) {
if (Build.VERSION.SDK_INT < 24) {
return configuration.locale;
} else {
return configuration.getLocales().get(0);
}
}
private Locale getLocaleOrDefault(Locale locale) {
if (AVAILABLE_LOCALES.contains(locale)) {
return locale;
}
return DEFAULT_LOCALE;
}
private void updateResources(Context context, Locale locale) {
Locale.setDefault(locale);
Resources res = context.getResources();
Configuration config = new Configuration(res.getConfiguration());
config.setLocale(locale);
res.updateConfiguration(config, res.getDisplayMetrics());
}
答案 1 :(得分:1)
在API 24中添加了新方法setDefault (Locale.Category category,Locale newLocale)
使用oficial docks