NOTA Si su API mínima es de 17+, ir directamente a la parte inferior de esta respuesta. De lo contrario, siga leyendo ...
Si tiene varias carpetas res para distintos lugares, se 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, usted puede reiniciar su actividad utilizando el método apuntado por @ jyotiprakash.
NOTA Llamar al constructor Resources
de 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 la recuperación de los recursos de un lugar específico 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 de la API 17, se debe utilizar conf.setLocale()
en lugar de fijar 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. (Dirección Layout se introdujo en 17.)
No hay ningún punto en la creación de un nuevo Configuration
objeto (como @Nulano sugiere en un comentario) porque llamando updateConfiguration
va a cambiar la configuración original obtenida llamando res.getConfiguration()
.
No me gustaría incluir 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 de API mínima es de 17+, hay un enfoque mucho mejor, como se muestra en this answer en otro hilo. Por ejemplo, puede crear múltiples Resource
objetos, uno para cada lugar que necesita, 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 le gusten de la Resource
objeto localizado devuelto por este método. No es necesario restablecer nada una vez que haya recuperado los recursos.
¿cómo implementaron esto realmente? Por favor responda :) –
como la respuesta aceptada –
se supone que 'ResourceBundle' se refiere a los activos ?? o pueden acceder a nuestra carpeta res? –