Ho un'applicazione Android con stringhe in inglese in valori/strings.xml. Per ogni stringa in quel file, ho una voce in values-ja/strings.xml con la traduzione giapponese di quella stringa. Se imposto l'emulatore, un Nexus One o Nexus S in giapponese, l'interfaccia utente mostra il testo giapponese in tutto. La maggior parte delle volte.Perché Resources.getString() potrebbe restituire a intermittenza le stringhe dalle impostazioni locali errate?
A volte, alcune parti dell'interfaccia utente vengono visualizzate in inglese, anche se la locale corrente è ja-JP. Per esempio, ho scritto questo codice di prova nel metodo onCreate() di una delle mie attività:
Log.e(TAG, "Default locale = '" + Locale.getDefault().toString() + "'");
Log.e(TAG, "My string = '" + getResources().getString(R.string.my_string) + "'");
A volte mi vedrò in LogCat:
Default locale is 'ja_JP'
My string is '日本'
Altre volte mi vedrò:
Default locale is 'ja_JP'
My string is 'English'
A volte questo problema viene risolto ruotando il telefono. A volte è risolto uscendo e riavviando l'app. A volte solo una porzione di un singolo schermo è in inglese. A volte questo problema si verifica con le stringhe che vengono estratte dalle risorse tramite codice e talvolta si verifica con stringhe a cui viene fatto riferimento solo da un layout. Da nessuna parte nella mia applicazione chiamo Locale.setDefault(), quindi questo non causa il problema.
UPDATE
ho trovato un modo per correggere il problema per una specifica attività. In onCreate di quella attività():
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() + "'");
Il risultato è il seguente in 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}'
Come si può vedere dal registro, nulla nelle modifiche alla configurazione attuale, ma getString() dà diverso risultati.
Non è pratico utilizzare questa soluzione alternativa in ogni punto della mia applicazione in cui è possibile utilizzare una risorsa, ma si spera che ciò fornisca un suggerimento su cosa non funziona.
Hai provato il bug tracker di google android? http://code.google.com/p/android/issues/ –
quale versione dell'AVD stai usando? – rockeye
Ho esaminato tutti i difetti del bug tracker che contiene "lingua" o "locale". Non ho visto nessun altro che segnalasse questo problema. –