Quiero que mi aplicación admita tres idiomas: español, portugués e inglés. Y dar la opción de seleccionar el idioma en la aplicación.
1) 3 carpetas dibujables drawable-es, drawable-pt, drawable.
2) Carpeta de 3 valores valores-es, valores-pt, valores. Cambiar los valores String.xml según los idiomas.
Tengo imageView para seleccionar el idioma. Al hacer clic en él, se abre el menú que consta de la opción Inglés, español, portugués.
Configuré Locale dentro de la aplicación en la selección de opciones con este código
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.en:
Locale locale = new Locale("en");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
break;
case R.id.pt:
Locale locale2 = new Locale("pt");
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;
getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
break;
case R.id.es:
Locale locale3 = new Locale("es");
Locale.setDefault(locale3);
Configuration config3 = new Configuration();
config3.locale = locale3;
getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
break;
}
return super.onOptionsItemSelected(item);
}
He declarado en Manifest- android: configChanges = "locale"
Funciona pero tiene algún problema.
Problema:-
1) Cuando se selecciona el idioma, la pantalla que consta de la imagen de la selección del idioma no cambia, pero sí cambian otras pantallas.
2) Después de cambiar la orientación, la aplicación restaura el idioma de acuerdo con la configuración regional del teléfono.
fuente
android:configChanges="locale"
para su actividad dentro de AndroidManifest.xmlRespuestas:
Es un extracto de la página web: http://android.programmerguru.com/android-localization-at-runtime/
Es simple cambiar el idioma de su aplicación cuando el usuario la selecciona de la lista de idiomas. Tenga un método como el siguiente que acepta la configuración regional como String (como 'en' para inglés, 'hola' para hindi), configure la configuración regional para su aplicación y actualice su actividad actual para reflejar el cambio en el idioma. La configuración regional que aplicó no se cambiará hasta que la vuelva a cambiar manualmente.
Asegúrese de haber importado los siguientes paquetes:
agregar en el manifiesto a la actividad android: configChanges = "locale | orientación"
fuente
finish()
necesita ser llamado antesstartActivity(refresh)
. De lo contrario, la aplicación puede cerrarse en lugar de reiniciar la actividad.Las buenas soluciones se explican bastante bien aquí. Pero aquí hay uno más.
Cree su propia
CustomContextWrapper
extensión de claseContextWrapper
y utilícela para cambiar la configuración regional para la aplicación completa. Aquí hay un GIST con uso.Y luego llame al
CustomContextWrapper
con el identificador de configuración regional guardado,'hi'
por ejemplo, para el idioma hindi en el método del ciclo de vida de la actividadattachBaseContext
. Uso aquí:fuente
MyContextWrapper.warp
enonAttach
de un solo fragmento de mi aplicación, pero el idioma se cambió para toda la aplicación, pero los títulos de actividad no ha cambiado, creo que es porque los títulos del manifiesto tienen prioridad, pero si llamo al mismo método enonAttachBaseContex
mi subclase de aplicación, los títulos de la actividad también cambian al idioma seleccionado, pero luego los cambios solo se aplican al fragmento que llamé en el método warp, ¿por qué ?warp
enonAttach
el fragmento, anteriormente dije que solo necesitaba hacerlo con el fragmento de actividad principal y el idioma cambiado en toda la aplicación es cierto, pero para todos los demás fragmentos, el idioma cambia al inglés en el cambio de configuración, por lo que necesitoonattach
ingresar todos los fragmentos y, en lugar de manifiesto, configuré los títulos de la barra de acciones en el código, ahora la aplicación funciona como se esperaba. graciasattachBaseContext
función. Y eso lo hace para todas las pantallas. ¿Ha creado una "BaseActivity" para todas las actividades en su aplicación?wrap()
código debe ejecutarse en cada cambio de configuración, así que lo puse en el Actividad abstracta de la que se extienden todas las demás actividades, ahora está funcionandoDebes eliminar
android:configChanges="locale"
del manifiesto, lo que provocará que la actividad se recargue, o anular elonConfigurationChanged
método:fuente
todo el código anterior de @ Uday es perfecto, pero solo falta una cosa (configuración predeterminada en build.gradle)
}
El mío no funcionaba solo porque los idiomas no se mencionaron en el archivo de configuración (build.gradle)
después de eso, todos los idiomas comenzaron a funcionar
fuente
Aquellos que obtienen el problema de la versión prueban este código.
fuente
El código de muestra de Udhay funciona bien. Salvo la pregunta de Sofiane Hassaini y Chirag SolankI, para el reingreso, no funciona. Intento llamar al código de Udhay sin reiniciar la actividad en onCreate (), antes de super.onCreate (SavedInstanceState) ;. ¡Entonces está bien! Solo un pequeño problema, las cadenas del menú aún no han cambiado a la configuración regional establecida.
fuente
Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh);
?