我有下面这段代码:
/**
* Sets a new Locale for the APP.
* @param newLocale - Valid new locale.
*/
private static void setLocale( String newLocale )
{
Locale locale = new Locale( newLocale );
Locale.setDefault( locale );
Configuration config = new Configuration();
config.locale = locale;
context.getResources().updateConfiguration( config, context.getResources().getDisplayMetrics() );
}
简单。
然而,当我在一个智能手机(4.1.1)上运行它时,它完美地工作。设备会更改字符串以匹配语言。
但是在平板电脑(4.3)上,它不起作用。如果我输出像这样的内容:
Log.d("TAG",Locale.getDefault());
语言环境在两个设备上都被更改了,但是字符串没有被翻译成正确的语言。我已经进行了大量的调试,并且发现了对象之间的差异:
查看4.1.1上的配置对象:
然后再看看平板电脑(4.3)上的配置对象:
可以看到,唯一显著的区别是平板电脑上的 userSetLocale
设置为 False。
因此,我查看了 Google SourceCode (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/res/Configuration.java),它指出:
/**
* Locale should persist on setting. This is hidden because it is really
* questionable whether this is the right way to expose the functionality.
* @hide
*/
public boolean userSetLocale;
看起来这个问题正在影响我。因此,由于无法通过getter / setter或公共访问来访问此值,我使用了反射来更改它。
然而,在用反射更改它之后,即使我已经看到它在内部更改了(布尔值在反射后被设置为false),仍然存在相同的问题。
你们有什么建议吗?
与此同时,我会继续测试。
谢谢。 测试:
- Nexus 10 - 4.4.2 - 正常
- Nexus 5 - 4.4.2 - 正常
- 平板电脑 320 dpi - 4.4.2 - 正常
- 智能手机 480 dpi - 4.3 - 正常
- 智能手机 160 dpi - 4.1.1 - 正常
- 平板电脑 160 dpi - 4.3 - 不正常
- 智能手机 320 dpi - 4.1.1 - 正常
locale
这样的应用程序来解决这个问题。Locale 将被设置,但大部分文本将保持未翻译状态。这个问题没有通用的解决方案,只有解决方法。你唯一能做的就是为该设备自己编译带有适当语言的 Android。你可以在 Android 设置菜单中检查安装和可用的语言。 - Alex van den HoogenLocale.getAvailableLocales()
检查了可用的语言环境,并且有几个语言环境与我的新语言环境匹配,例如es_ES
。下周我将尝试弄清楚这是否仅发生在单个设备(Genymotion模拟器)上,还是在真实设备上也会发生。同时,如果您有一些想法,欢迎分享 =) - Reinherd