Tengo una aplicación de Android con cadenas en inglés en values / strings.xml. Para cada cadena en ese archivo, tengo una entrada en valores-ja/strings.xml con la traducción al japonés de esa cadena. Si configuro el emulador, un Nexus One o un Nexus S en japonés, la interfaz de usuario muestra texto en japonés en todas partes. La mayor parte del tiempo¿Por qué Resources.getString() devolver cadenas de manera intermitente desde la configuración incorrecta?
A veces, parte de la IU aparecerá en inglés, aunque la configuración actual sea ja-JP. Por ejemplo, he escrito este código de prueba en el método onCreate() de una de mis actividades:
Log.e(TAG, "Default locale = '" + Locale.getDefault().toString() + "'");
Log.e(TAG, "My string = '" + getResources().getString(R.string.my_string) + "'");
veces voy a ver en LogCat:
Default locale is 'ja_JP'
My string is '日本'
Otras veces voy a ver:
Default locale is 'ja_JP'
My string is 'English'
A veces, este problema se resuelve girando el teléfono. A veces se resuelve saliendo y reiniciando la aplicación. A veces, solo una parte de una sola pantalla está en inglés. A veces, este problema se produce con cadenas que se extraen de los recursos mediante código y, a veces, se produce con cadenas a las que solo hace referencia un diseño. En ninguna parte de mi aplicación llamo a Locale.setDefault(), así que eso no está causando el problema.
ACTUALIZACIÓN
he encontrado una manera de corregir el problema para una actividad específica. En onCreate de que la actividad():
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() + "'");
Esto se traduce en lo siguiente en 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}'
Como se puede ver en el registro, no hay nada en los cambios de configuración actuales, pero getString() da diferentes resultados.
No es práctico utilizar esta solución en todos los lugares de mi aplicación donde se podría usar un recurso, pero espero que esto proporcione una pista sobre lo que está pasando mal.
¿Has probado el rastreador de fallas de google android? http://code.google.com/p/android/issues/ –
¿qué versión de AVD estás usando? – rockeye
Revisé cada defecto en el rastreador de errores que contiene "idioma" o "configuración regional". No vi a nadie más informando este problema. –