android - studio - Obtenga una cadena de la configuración regional predeterminada utilizando una cadena en una configuración regional específica
string value android (8)
Ok, sé que el título suena loco :)
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 en inglés. Mi configuración predeterminada de la aplicación Inglés.
Por ejemplo, tengo matriz:
- Las manzanas
- Naranjas
- Duraznos
Tengo matriz localizada:
- Яблоки
- Апельсины
- Персики
Cuando el usuario ruso ve la lista y selecciona elementos de pareja, necesito las versiones en inglés correspondientes.
¿Supongo que mi respuesta se reduce a cómo hacer getString () y pasar la configuración regional? ¿O cómo consigo Array en locale específico?
Combiné los dos enfoques necesarios para trabajar en todas las versiones de Android. Vea mi respuesta aquí .
Creo que esta es la forma segura de hacerlo (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!
El siguiente código recuperará la cadena localizada para el idioma de polaco incluso si la configuración regional predeterminada en el 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 aplique a otros tipos de recursos como array, por lo que debería ser suficiente para reemplazar "pl" con "en" ...
Esta localización "forzada" no funcionará si sus dispositivos no tienen la configuración regional que está forzando.
No puedo probar esto "como este", pero justo ahora estoy luchando con este problema, donde estoy obligando a que el recurso esté en la ubicación / idioma que no está instalado en el dispositivo (en Android 2.3.3), y aún sigo recibiendo cuerdas de valores-en (inglés) recursos.
En otros dispositivos, con la configuración regional que está forzando (pero no es necesario establecer como configuración regional actual), obtendrá los recursos correctos.
Este no tiene efectos secundarios: API17 y superior
Configuration config = new Configuration(context.getResources().getConfiguration());
config.setLocale(locale);
return context.createConfigurationContext(config).getResources();
Si usa JB 2.2.xo superior (básicamente API> = 17) puede usar createConfigurationContext do:
public String translate(Locale locale, int resId) {
Configuration config = new Configuration(context.getResources().getConfiguration());
config.setLocale(locale);
return context.createConfigurationContext(config).getText(resId);
}
Tienes 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.
Tuve el mismo problema con ListPreference que guardaba las preferencias de "nombre de estado" y "figura del 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 localizadas (inglés y hebreo).
Finalmente utilicé 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 mostraba la cadena localizada para el usuario (como resumen), pero guardaba la cadena en inglés en la memoria de preferencias que finalmente se envió al servidor.