Cómo obtener la cadena de diferentes locales en Android?
Por lo tanto, quiero obtener el valor de una cadena en varias localidades 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)
- Recursos de Menú Diferentes de Android
- Intentando crear un proyecto después de agregar la carpeta values-21 y está mostrando error
- ¿Qué es "android:" prefijo en el módulo android framework-res
- Habilitar a terceros independientes para localizar aplicaciones de Android; Datos de localización fuera del APK de la aplicación
- GetColor (int id) obsoleta en Android 6.0 Marshmallow (API 23)
¿Cómo podría hacer eso?
Gracias
- ¿Hay un punto que tiene res / drawable-ldpi en android?
- ¿Es posible leer un archivo de texto sin referencia de contexto en un proyecto de biblioteca de Android?
- Programe de forma programática el recurso de fondo de EditText en campo transparente
- Cómo probar la integridad de string.xml
- ¿Reutiliza Android las imágenes cargadas desde el recurso?
- Definición de attrs personalizados
- Cómo obtener programaticamente lista de idiomas compatibles en un proyecto de Android (dispositivo NOT)
- Android Home As Up Indicator nombre de archivo o ubicación
NOTA Si su API mínima es 17+, vaya directamente al final de esta respuesta. De lo contrario, siga leyendo …
Si tiene varias carpetas de res para diferentes locales, 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, sólo puede reiniciar su actividad utilizando el método señalado por @jyotiprakash.
NOTA Llamar al constructor de Resources
como este cambia algo internamente en Android. Tendrás que invocar al constructor con tu entorno original para que las cosas vuelvan a estar como antes.
EDITAR Una receta ligeramente diferente (y algo más limpia) para recuperar recursos de una localidad 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 utilizar conf.setLocale()
lugar de establecer directamente conf.locale
. Esto actualizará correctamente la dirección de disposición de la configuración si sucede que está cambiando entre locales de derecha a izquierda y de izquierda a derecha. (La dirección del diseño fue introducida en 17.)
No tiene sentido crear un nuevo objeto Configuration
(como @Nulano sugiere en un comentario) porque llamar a updateConfiguration
va a cambiar la configuración original obtenida llamando res.getConfiguration()
.
No dudaría en getString(int id, String locale)
en un método getString(int id, String locale)
si va a cargar varios recursos de cadena para una configuración regional. Cambiar los entornos locales (usando cualquiera de las dos recetas) requiere que el marco realice un montón de trabajo para volver a conectar todos los recursos. Es mucho mejor actualizar localidades una vez, recuperar todo lo que necesita y, a continuación, establecer la configuración regional de nuevo.
EDIT (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 varios objetos Resource
, uno para cada entorno regional 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, sólo recuperar los recursos que te gusta del objeto de Resource
localizados devueltos por este método. No hay necesidad de restablecer nada una vez que haya recuperado los recursos.
Aquí está 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"), id, R.string.name);
Nota
Como ya se dijo en la respuesta original, podría ser más eficiente para reemplazar la llamada múltiple del código anterior con un único cambio de configuración y varias llamadas resources.getString ().
Lo que estás buscando se llama la clase ResourceBundle. Aquí está el enlace:
Google Docs para ResourceBundle
- AdjustPan no impide que el teclado cubra EditText
- ¿Es seguro utilizar .getWidth en la pantalla aunque su versión obsoleta