Mi aplicación admite 3 (pronto 4) idiomas. Dado que varias configuraciones regionales son bastante similares, me gustaría darle al usuario la opción de cambiar la configuración regional en mi aplicación, por ejemplo, una persona italiana podría preferir el español al inglés.
¿Hay alguna manera para que el usuario seleccione entre las configuraciones regionales que están disponibles para la aplicación y luego cambie la configuración regional que se usa? No lo veo como un problema para establecer la configuración regional para cada actividad, ya que es una tarea sencilla de realizar en una clase base.
android
locale
user-defined
Roland
fuente
fuente
Respuestas:
Para las personas que todavía buscan esta respuesta, dado que
configuration.locale
fue desaprobada de API 24, ahora puede usar:Tenga en cuenta que minSkdVersion para este método es API 17.
Código de ejemplo completo:
No olvide que, si cambia la configuración regional con una actividad en ejecución, deberá reiniciarla para que los cambios surtan efecto.
EDITAR 11 de mayo de 2018
A partir de la publicación de @ CookieMonster, es posible que tenga problemas para mantener el cambio de configuración regional en versiones de API más altas. Si es así, agregue el siguiente código a su Actividad base para actualizar la configuración regional de contexto en cada creación de Actividad:
Si usa esto, no olvide guardar el idioma en SharedPreferences cuando configure la configuración regional con
setLocate(locale)
EDITAR 7 DE ABRIL 2020
Es posible que experimente problemas en Android 6 y 7, y esto sucede debido a un problema en las bibliotecas de Androidx al manejar el modo nocturno. Para esto, también deberá anular
applyOverrideConfiguration
su actividad base y actualizar la configuración regional en caso de que se cree una nueva configuración regional nueva.Código de muestra:
fuente
androidx.appcompat:appcompat:
versión de1.0.2
a1.1.0
no funciona en Android 7, pero funciona en Android 9.1.1.0
androidxappcompat:1.1.0
se puede solucionar conappcompat:1.2.0-alpha02
y codificar en elSet<Locale> set = new LinkedHashSet<>(); // bring the target locale to the front of the list set.add(locale); LocaleList all = LocaleList.getDefault(); for (int i = 0; i < all.size(); i++) { // append other locales supported by the user set.add(all.get(i)); } Locale[] locales = set.toArray(new Locale[0]); configuration.setLocales(new LocaleList(locales));
interior@TargetApi(Build.VERSION_CODES.N) updateResourcesLocale()
Espero que esta ayuda (en onResume):
fuente
Tuve un problema con la configuración regional mediante programación con dispositivos que tienen Android OS N y superior . Para mí, la solución fue escribir este código en mi actividad base:
(si no tiene una actividad base, entonces debe hacer estos cambios en todas sus actividades)
tenga en cuenta que aquí no es suficiente llamar
también necesita obtener el contexto que devuelve este método y luego establecer este contexto en el
attachBaseContext
método.fuente
updateBaseContextLocale
métodoonCreate
de su actividad principal / base.Como no hay una respuesta completa para la forma actual de resolver este problema, trato de dar instrucciones para una solución completa. Comente si falta algo o podría hacerse mejor.
Información general
Primero, existen algunas bibliotecas que quieren resolver el problema pero todas parecen anticuadas o les faltan algunas características:
Además, creo que escribir una biblioteca podría no ser una forma buena / fácil de resolver este problema porque no hay mucho que hacer, y lo que hay que hacer es cambiar el código existente en lugar de usar algo completamente desacoplado. Por lo tanto, compuse las siguientes instrucciones que deberían estar completas.
Mi solución se basa principalmente en https://github.com/gunhansancar/ChangeLanguageExample (como ya está vinculado por localhost ). Es el mejor código que encontré para orientar. Algunas observaciones:
updateViews()
en cada Actividad para actualizar manualmente todas las cadenas después de cambiar la configuración regional (usando el habitualgetString(id)
) que no es necesario en el enfoque que se muestra a continuaciónLo cambié un poco, desacoplando la parte que persiste en la configuración regional elegida (ya que uno podría querer hacerlo por separado, como se sugiere a continuación).
Solución
La solución consta de los siguientes dos pasos:
Paso 1: cambiar la configuración regional
Use la clase
LocaleHelper
, basada en LocaleHelper de gunhansancar :ListPreference
en aPreferenceFragment
con los idiomas disponibles (debe mantenerse cuando los idiomas deben agregarse más adelante)Crea un me
SettingsFragment
gusta de la siguiente manera:Cree un recurso que
locales.xml
enumere todas las configuraciones regionales con las traducciones disponibles de la siguiente manera ( lista de códigos locales ):En su
PreferenceScreen
puede usar la siguiente sección para permitir al usuario seleccionar los idiomas disponibles:que utiliza las siguientes cadenas de
strings.xml
:Paso 2: haga que la aplicación use la configuración regional personalizada
Ahora configure cada actividad para usar el conjunto de configuraciones regionales personalizadas. La forma más fácil de lograr esto es tener una clase base común para todas las actividades con el siguiente código (donde está el código importante
attachBaseContext(Context base)
yonResume()
):Lo que hace es
attachBaseContext(Context base)
para usar la configuración regional que anteriormente persistía conLocaleHelper
Notas sobre esta solución
Volver a crear una actividad no actualiza el título de ActionBar (como ya se observó aquí: https://github.com/gunhansancar/ChangeLanguageExample/issues/1 ).
setTitle(R.string.mytitle)
en elonCreate()
método de cada actividad.Permite al usuario elegir la configuración regional predeterminada del sistema, así como la configuración regional predeterminada de la aplicación (que puede denominarse, en este caso, "inglés").
fr-rCA
Hasta ahora, solo se admiten códigos de idioma, ninguna región (país) y códigos de variantes (como ). Para admitir las especificaciones locales completas, se puede utilizar un analizador similar al de la biblioteca de idiomas de Android (que admite regiones pero no códigos de variantes).fuente
attachBaseContext(Context base)
yonResume()
hacia una clase separada) puede ser la solución. Entonces todo lo que tiene que hacer es declarar un objeto en cada clase base de actividad y delegar esas dos llamadas.Simplemente use este método auxiliar para forzar la configuración regional específica.
UDPATE 22 AGOSTO 2017. Mejor use este enfoque .
fuente
Agregue una clase auxiliar con el siguiente método:
Y llámalo en tu actividad de inicio, como
MainActivity.java
:fuente
simple y fácil
donde "en" es el código del idioma y "EE. UU." es el código del país.
fuente
conf.locale=locale;
está en desuso, y también lo esupdateConfiguration
.Válido para API16 a API28 Simplemente coloque este método en algún lugar:
Inserte este código en todas sus actividades usando:
o llame a localeUpdateResources sobre fragmentos, adaptadores, etc., donde necesite el nuevo contexto.
Créditos: Yaroslav Berezanskyi
fuente
Hay una forma super simple.
en BaseActivity, Activity o Fragment override attachBaseContext
extensión
fuente
He encontrado el
androidx.appcompat:appcompat:1.1.0
fallo también puede ser fijado simplemente llamandogetResources()
enapplyOverrideConfiguration()
fuente
fuente
Para quienes intentaron todo pero no funcionaron . Compruebe que si configuró
darkmode
conAppCompatDelegate.setDefaultNightMode
y el sistema no está oscuro,Configuration.setLocale
no funcionará por encima de Andorid 7.0 .Agregue este código en todas sus actividades para resolver este problema:
fuente
Pon este código en tu actividad
fuente