values/strings.xml に英語の文字列を含む Android アプリケーションがあります。そのファイル内の各文字列について、values-ja/strings.xml にその文字列の日本語訳を含むエントリがあります。エミュレーター、Nexus One または Nexus S を日本語に設定すると、UI 全体に日本語のテキストが表示されます。ほとんどの時間。
現在のロケールが ja-JP であっても、UI の一部が英語で表示されることがあります。たとえば、アクティビティの 1 つの 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'
この問題は、電話を回転させることで解決される場合があります。アプリを終了して再起動することで解決する場合があります。場合によっては、1 つの画面の一部だけが英語で表示されます。この問題は、コードを介してリソースから引き出された文字列で発生することもあれば、レイアウトによってのみ参照される文字列で発生することもあります。アプリケーションのどこにも 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() では異なる結果が得られます。
アプリケーション内のリソースが使用される可能性のあるすべての場所でこの回避策を使用するのは現実的ではありませんが、問題の原因についてのヒントが得られることを願っています。