2011-06-29 25 views
16

Ok, sé que el título suena loco :)Obtener la cadena de la configuración regional predeterminada mediante una cadena en la configuración regional específica

Esto es lo que quiero. Mi aplicación está localizada para el usuario del dispositivo, pero la información que envío al servidor debe ser todo en inglés. Mi configuración predeterminada de la aplicación es inglés.

Por ejemplo, tengo array:

  • Manzanas
  • Naranjas
  • Peaches

He localizada array:

  • Яблоки
  • Апельсины
  • Персики

Cuando ruso usuario ve la lista y selecciona elementos par - que necesito para obtener versiones en inglés correspondiente.

Supongo que mi respuesta se reduce a cómo hacer getString() y pasar la configuración regional? ¿O cómo obtengo Array en una configuración regional específica?

Respuesta

1

Tiene que identificar el elemento por otra cosa, como una identificación, o incluso el nombre en inglés.

No es posible obtener la cadena original para una cadena localizada determinada. Una de las razones es que la localización de cadenas no es una función transitiva, pero hay muchas otras razones por las cuales esta no es una buena dirección.

+0

Eso es lo que pensé ... – katit

23

El código de abajo va a recuperar cadena localizado en el idioma polaco, incluso si la configuración regional predeterminada del dispositivo es diferente:

Configuration conf = getResources().getConfiguration(); 
conf.locale = new Locale("pl"); 
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
Resources resources = new Resources(getAssets(), metrics, conf); 
/* get localized string */ 
String str = resources.getString(R.string.hello); 

espero que esto también se aplica a otros tipos de recursos como la matriz, por lo que debería ser suficiente para reemplazar "pl" con "en" ...

+0

Realmente no creo que sea una buena forma de operar una localidad así. Si lo entiendo correctamente, necesito asegurarme de que el idioma correcto no vuelva a aparecer antes de que todo el contenido localizado no se vuelva loco ... – katit

+0

@katit No probé eso, pero si seguirás llamando a 'getResources()' su objeto de contexto en lugar de usar los recursos creados para una configuración regional determinada, siempre debe devolver los recursos localizados adecuadamente con respecto a la configuración regional actual del dispositivo y no tiene que volver atrás, espero haber entendido correctamente sus preocupaciones – wjeshak

+0

Las métricas de visualización necesarias para construir los nuevos 'Recursos' también pueden ser recuperados por' getResources(). getDisplayMetrics() '. No es necesario involucrar al administrador de ventanas. –

1

Esta localización de "fuerza" no funcionará si sus dispositivos no tienen la configuración regional que está forzando.

No puedo probar esto "solo así", pero ahora estoy luchando con ese problema, donde estoy forzando a que el recurso esté en el idioma/idioma que no está instalado en el dispositivo (en Android 2.3.3) , y aún obteniendo cadenas de recursos de values-en (inglés).

En otros dispositivos, con la configuración regional que está forzando (pero que no es necesario establecer como la configuración regional actual), obtendrá los recursos correctos.

0

creo, este es el camino seguro para ir (sin tocar la configuración actual):

Configuration conf = new Configuration(); 
conf.setToDefaults(); // That will set conf.locale to null (current locale) 
// We don't want current locale, so modify it 
conf.locale = new Locale(""); // Or conf.locale = Locale.ROOT for API 9+ 
           // or conf.setLocale(Locale.ROOT) for API 14+ 
// Since we need only strings, we can safely set metrics to null 
Resources rsrcDflt = new Resources(getAssets(), null, conf); 
String apples = srcDflt.getString(R.string.apples); // Got it at last! 
+2

En realidad, los nuevos recursos del constructor (getAssets(), null, conf) anulan la configuración del sistema para su APK. Entonces, después de crear ese objeto, siempre obtendrás la versión predeterminada de la cadena. – ddmytrenko

2

Si utiliza 2.2.x JB o superior (básicamente API> = 17) se puede utilizar createConfigurationContext hacer:

public String translate(Locale locale, int resId) { 
    Configuration config = new Configuration(context.getResources().getConfiguration()); 
    config.setLocale(locale); 
    return context.createConfigurationContext(config).getText(resId); 
} 
0

Tuve el mismo problema con ListPreference que guardaba las preferencias de "nombre de estado" y "figura de cuerpo". ListPreference obtiene sus valores y entradas de una matriz guardada en las carpetas de "valores" localizados. Los valores de la lista eran los mismos (inglés) pero las entradas estaban traducidas (inglés y hebreo).

finalmente utiliza el siguiente código:

public void OnSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) 
{ 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    Preference pref = settings.findPreference(key); 
    pref.setSummary(sharedPreferences.getString(key, "")); 

    if (key.equalsIgnoreCase(PREF_STATE) 
     || key.equalsIgnoreCase(PREF_BODY_FIGURE)) 
    { 
     editor.putString(key, ((ListPreference) pref).getValue()); 
     editor.commit(); 
    } 
} 

De esa manera la preferencia siempre mostró la cadena localizada al usuario (como el resumen), pero salvó la cadena de Inglés en la memoria de la preferencia que fue enviado en última instancia, a la servidor.

1

Ésta no tiene efectos secundarios: API17 y mayores

Configuration config = new Configuration(context.getResources().getConfiguration()); 
config.setLocale(locale); 
return context.createConfigurationContext(config).getResources(); 
+0

Esto funcionó para mí, gracias! Nota: para admitir nope4561759

0

que combinan los dos enfoques necesarios para trabajar en todas las versiones de Android. See my answer here.

Cuestiones relacionadas