我在 values/strings.xml 中有一个带有英文字符串的 Android 应用程序。对于该文件中的每个字符串,我在 values-ja/strings.xml 中有一个条目,其中包含该字符串的日语翻译。如果我将模拟器、Nexus One 或 Nexus S 设置为日语,UI 会始终显示日语文本。大多数时候。
有时,即使当前语言环境是 ja-JP,UI 的某些部分也会以英文显示。例如,我在我的一项活动的 onCreate() 方法中编写了这个测试代码:
Log.e(TAG, "Default locale = '" + Locale.getDefault().toString() + "'");
Log.e(TAG, "My string = '" + getResources().getString(R.string.my_string) + "'");
有时我会在 LogCat 中看到:
Default locale is 'ja_JP'
My string is '日本'
其他时候我会看到:
Default locale is 'ja_JP'
My string is 'English'
有时这个问题可以通过旋转手机来解决。有时可以通过退出并重新启动应用程序来解决。有时,单个屏幕只有一部分是英文的。有时,通过代码从资源中提取的字符串会出现此问题,有时会出现仅由布局引用的字符串。在我的应用程序中,我没有调用 Locale.setDefault(),所以这不会导致问题。
更新
我找到了一种方法来纠正特定活动的问题。在该活动的 onCreate() 中:
Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'");
Log.e(TAG, "getResources().getConfiguration(): '" +
getResources().getConfiguration().toString() + "'");
Log.e(TAG, "getResources().getDisplayMetrics(): '" +
getResources().getDisplayMetrics().toString() + "'");
Log.e(TAG, "Setting configuration to getConfiguration()");
getResources().updateConfiguration(getResources().getConfiguration(),
getResources().getDisplayMetrics());
Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'");
Log.e(TAG, "getResources().getConfiguration(): '" +
getResources().getConfiguration().toString() + "'");
Log.e(TAG, "getResources().getDisplayMetrics(): '" +
getResources().getDisplayMetrics().toString() + "'");
这会在 LogCat 中产生以下结果:
getString: 'English'
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}'
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}'
Setting configuration to getConfiguration()
getString: '日本'
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}'
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}'
从日志中可以看出,当前配置没有任何变化,但 getString() 给出了不同的结果。
在我的应用程序中可能使用资源的每个地方都使用此解决方法是不切实际的,但希望这可以提供有关问题所在的提示。