studio programacion herramientas fundamentos con avanzado aplicaciones android locale android-resources

programacion - cómo obtener una cadena de diferentes lugares en Android?



manual de android en pdf (3)

Por lo tanto, quiero obtener el valor de una cadena en varias configuraciones regionales, independientemente de la configuración regional actual del dispositivo / aplicación. ¿Cómo debo hacer eso?

Básicamente, lo que necesito es una función getString(int id, String locale) lugar de getString(int id)

¿Cómo podría hacer eso?

Gracias


Aquí hay una versión combinada de los enfoques descritos por Ted Hopp . De esta manera, el código funciona para cualquier versión de Android:

public static String getLocaleStringResource(Locale requestedLocale, int resourceId, Context context) { String result; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // use latest api Configuration config = new Configuration(context.getResources().getConfiguration()); config.setLocale(requestedLocale); result = context.createConfigurationContext(config).getText(resourceId).toString(); } else { // support older android versions Resources resources = context.getResources(); Configuration conf = resources.getConfiguration(); Locale savedLocale = conf.locale; conf.locale = requestedLocale; resources.updateConfiguration(conf, null); // retrieve resources from desired locale result = resources.getString(resourceId); // restore original locale conf.locale = savedLocale; resources.updateConfiguration(conf, null); } return result; }

Ejemplo de uso:

String englishName = getLocaleStringResource(new Locale("en"), R.string.name, context);

Nota

Como ya se indicó en la respuesta original, podría ser más eficiente reemplazar la llamada múltiple del código anterior con un único cambio de configuración y múltiples llamadas a resources.getString ().



NOTA Si su API mínima es 17+, vaya directamente al final de esta respuesta. De lo contrario, sigue leyendo ...

Si tiene varias carpetas de res para diferentes configuraciones regionales, puede hacer algo como esto:

Configuration conf = getResources().getConfiguration(); conf.locale = new Locale("pl"); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); Resources resources = new Resources(getAssets(), metrics, conf); String str = resources.getString(id);

Alternativamente, puedes reiniciar tu actividad usando el método al que @jyotiprakash apunta.

NOTA Llamar al constructor de Resources esta manera cambia algo internamente en Android. Deberá invocar al constructor con su configuración original para que las cosas vuelvan a estar como estaban.

EDITAR Una receta ligeramente diferente (y algo más limpia) para recuperar recursos de una configuración regional específica es:

Resources res = getResources(); Configuration conf = res.getConfiguration(); Locale savedLocale = conf.locale; conf.locale = desiredLocale; // whatever you want here res.updateConfiguration(conf, null); // second arg null means don''t change // retrieve resources from desired locale String str = res.getString(id); // restore original locale conf.locale = savedLocale; res.updateConfiguration(conf, null);

A partir del nivel 17 de API, debe usar conf.setLocale() lugar de establecer directamente conf.locale . Esto actualizará correctamente la dirección del diseño de la configuración si está cambiando entre las configuraciones regionales de derecha a izquierda y de izquierda a derecha. (La dirección del diseño se introdujo en 17.)

No tiene sentido crear un nuevo objeto de Configuration (como sugiere @Nulano en un comentario) porque llamar a updateConfiguration va a cambiar la configuración original obtenida llamando a res.getConfiguration() .

Yo dudaría en agrupar esto en un método getString(int id, String locale) si va a cargar varios recursos de cadena para una configuración regional. Cambiar las configuraciones regionales (usando cualquiera de las recetas) requiere que el marco haga mucho trabajo para volver a enlazar todos los recursos. Es mucho mejor actualizar las configuraciones regionales una vez, recuperar todo lo que necesita y luego restablecer la configuración regional.

EDITAR (Gracias a @Mygod):

Si su nivel mínimo de API es 17+, hay un enfoque mucho mejor, como se muestra en esta respuesta en otro hilo. Por ejemplo, puede crear múltiples objetos de Resource , uno para cada localidad que necesite, con:

@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) { Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(desiredLocale); Context localizedContext = context.createConfigurationContext(conf); return localizedContext.getResources(); }

A continuación, solo recupere los recursos que desee del objeto de Resource localizado devuelto por este método. No es necesario restablecer nada una vez que haya recuperado los recursos.