¿Es posible cambiar el idioma de una aplicación mediante programación mientras sigo utilizando recursos de Android?
Si no, ¿es posible solicitar un recurso en un idioma específico?
Me gustaría permitir que el usuario cambie el idioma de la aplicación desde la aplicación.
android
localization
resources
hpique
fuente
fuente
Respuestas:
Es posible. Puede establecer la configuración regional. Sin embargo, no recomendaría eso. Lo hemos intentado en las primeras etapas, básicamente está luchando contra el sistema.
Tenemos el mismo requisito para cambiar el idioma, pero decidimos conformarnos con el hecho de que la interfaz de usuario debe ser la misma que la del teléfono. Funcionaba a través de la configuración regional, pero tenía demasiados errores. Y tiene que configurarlo cada vez que ingresa a la actividad (cada actividad) desde mi experiencia. aquí hay un código si aún necesita esto (nuevamente, no lo recomiendo)
Si tiene contenido específico de idioma, puede cambiar esa base en la configuración.
actualización el 26 de marzo de 2020
fuente
Context.createConfigurationContext()
que se introdujo el nivel 17 de API , que se puede usar para ajustar el contexto predeterminado con la configuración específica de la configuración regional y luego invocarlogetResources
sin tener que actualizar la configuración en los propios objetos de recursos.conf.setLayoutDirection(locale)
, puede reemplazarconf.locale = new Locale(...))
conconf.setLocale(new Locale(...))
. Se llamará internamentesetLayoutDirection
.Este código realmente funciona:
Ingrese su código de idioma en
languageToLoad
variable:fuente
Resources.updateConfiguration
método. He sangrado el código para hacerlo más claro.Estaba buscando una manera de cambiar el lenguaje del sistema mediante programación. Si bien entiendo completamente que una aplicación normal nunca debería hacer eso y en su lugar tampoco:
era necesario cambiar realmente el lenguaje del sistema mediante programación.
¡Esta es una API no documentada y, por lo tanto, no debe usarse para aplicaciones de mercado / usuario final!
De todos modos, aquí está la solución que encontré:
fuente
android.permission.CHANGE_CONFIGURATION
, solo se puede otorgar mediante una aplicación firmada con la tecla de ejecución.Si desea mantener el idioma cambiado en toda su aplicación, debe hacer dos cosas.
Primero, cree una Actividad base y haga que todas sus actividades se extiendan a partir de esto:
Tenga en cuenta que guardo el nuevo idioma en una referencia compartida.
En segundo lugar, cree una extensión de aplicación como esta:
Tenga en cuenta que getLocale () es el mismo que el anterior.
¡Eso es todo! Espero que esto pueda ayudar a alguien.
fuente
Application
es y cómo usarlo. mobomo.com/2011/05/how-to-use-application-object-of-androidconfiguration.locate
está en desuso, setLocale requiere API 17+ y updateConfiguration está en desusoDe acuerdo con este artículo . Deberá descargar la
LocaleHelper.java
referencia en ese artículo.MyApplication
clase que se extiendaApplication
attachBaseContext()
para actualizar el idioma.Registre esta clase en manifiesto.
Crear
BaseActivity
y anularonAttach()
para actualizar el idioma. Necesario para Android 6+Haga que todas las actividades en su aplicación se extiendan desde
BaseActivity
.fuente
Solo agregué una pieza extra que me hizo tropezar.
Mientras que las otras respuestas funcionan bien con "de" por ejemplo
Lo anterior no funcionará con, por ejemplo, la
"fr_BE"
configuración regional, por lo que usaría lavalues-fr-rBE
carpeta o similar.Necesita el siguiente ligero cambio para trabajar con
"fr_BE"
fuente
activity.recreate()
android.content.res.Configuration conf = res.getConfiguration();
lugar de crear una nuevaConfiguration
instancia? ¿Hay algún beneficio por usar uno nuevo?He cambiado el idioma alemán para que mi aplicación se inicie por sí misma.
Aquí está mi código correcto. Alguien quiere usar esto igual para mí .. (Cómo cambiar el idioma en Android mediante programación)
mi código:
fuente
Sé que es tarde para responder, pero encontré este artículo aquí . Lo que explica muy bien todo el proceso y le proporciona un código bien estructurado.
Clase de ayuda local:
Debe anular attachBaseContext y llamar a LocaleHelper.onAttach () para inicializar la configuración regional en su aplicación.
Todo lo que tienes que hacer es agregar
donde quiera cambiar la configuración regional.
fuente
createConfigurationContext
, eso fue útilCrear una clase Extiende
Application
y crea un método estático. Entonces puede llamar a este método en todas las actividades anterioressetContentView()
.Uso en actividades:
fuente
Para Android 7.0 Nougat (y versiones inferiores) sigue este artículo:
Cambiar idioma de forma programada en Android
Respuesta anterior
Esto incluye soporte RTL / LTR:
fuente
La única solución que funciona completamente para mí es una combinación del código de Alex Volovoy con el mecanismo de reinicio de la aplicación:
fuente
activity.recreate()
Estaba enfrentando el mismo problema. En GitHub encontré la biblioteca Android-LocalizationActivity .
Esta biblioteca hace que sea muy simple cambiar el idioma de su aplicación en tiempo de ejecución, como puede ver en el ejemplo de código a continuación. Un proyecto de muestra que incluye el código de muestra a continuación y más información se puede encontrar en la página de github.
LocalizationActivity extiende AppCompatActivity, por lo que también puede usarlo cuando usa Fragmentos.
fuente
Tiempo para una debida actualización.
En primer lugar, la lista en desuso con la API en la que estaba en desuso:
configuration.locale
(API 17)updateConfiguration(configuration, displaymetrics)
(API 17)Lo que ninguna pregunta contestada recientemente ha sido correcta es el uso del nuevo método .
createConfigurationContext es el nuevo método para updateConfiguration.
Algunos lo han usado de forma independiente así:
... pero eso no funciona. ¿Por qué? El método devuelve un contexto, que luego se utiliza para manejar las traducciones de Strings.xml y otros recursos localizados (imágenes, diseños, lo que sea).
El uso adecuado es así:
Si acaba de copiar y pegar eso en su IDE, puede ver una advertencia de que la API requiere que apunte a la API 17 o superior. Esto se puede solucionar poniéndolo en un método y agregando la anotación
@TargetApi(17)
Pero espera. ¿Qué pasa con las API más antiguas?
Necesita crear otro método usando updateConfiguration sin la anotación TargetApi.
No necesita devolver un contexto aquí.
Ahora, gestionarlos puede ser difícil. En API 17+ necesita el contexto creado (o los recursos del contexto creado) para obtener los recursos apropiados basados en la localización. Como manejas esto?
Bueno, así es como lo hago:
Este código funciona al tener un método que realiza llamadas al método apropiado en función de qué API. Esto es algo que he hecho con muchas llamadas diferentes en desuso (incluido Html.fromHtml). Tiene un método que toma los argumentos necesarios, que luego lo divide en uno de dos (o tres o más) métodos y devuelve el resultado apropiado según el nivel de API. Es flexible ya que no tiene que verificarlo varias veces, el método de "entrada" lo hace por usted. El método de entrada aquí es
setLanguage
POR FAVOR LEA ESTO ANTES DE USARLO
Debe usar el Contexto devuelto cuando obtiene recursos. ¿Por qué? He visto otras respuestas aquí que usan createConfigurationContext y no usan el contexto que devuelve. Para que funcione así, se debe llamar a updateConfiguration. Lo cual está en desuso. Use el contexto devuelto por el método para obtener recursos.
Ejemplo de uso :
Constructor o algún lugar similar:
Y luego, donde quieras obtener los recursos que haces:
Usar cualquier otro contexto (en teoría) romperá esto.
AFAIK todavía tiene que usar un contexto de actividad para mostrar diálogos o tostadas. para eso puedes usar una instancia de una actividad (si estás afuera)
Y finalmente, use
recreate()
en la actividad para actualizar el contenido. Atajo para no tener que crear una intención de actualizar.fuente
Si tú escribes
En cada actividad (en el archivo de manifiesto), no es necesario configurarlo cada vez que ingrese
Activity
.fuente
configChanges
usa para un truco para preservar el estado de Actividad en rotaciones / etc.Actualización importante:
Tenga en cuenta que en SDK> = 21, debe llamar a 'Resources.updateConfiguration ()' ; de lo contrario, los recursos no se actualizarán.
fuente
Context ctx = createConfigurationContext(args);
y obtén recursos de esofuente
activity.recreate()
Locale
configuration
debe establecerse en cada unoactivity
antes de configurar el contenido:this.setContentView(R.layout.main);
fuente
activity.recreate()
Al principio cree multi string.xml para diferentes idiomas; luego use este bloque de código en el
onCreate()
método:fuente
Aquí hay un código que me funciona:
Fuente: aquí
fuente
Ninguna de las soluciones enumeradas aquí me ayudó.
El idioma no se activó en Android> = 7.0 si AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)
Este LocaleUtils funciona bien: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe
LocaleUtils
Agregó este código a la aplicación
Código en actividad
fuente
La respuesta de Alex Volovoy solo funciona para mí si está en el método onCreate de la actividad.
La respuesta que funciona en todos los métodos está en otro hilo
Cambiar idioma mediante programación en Android
Aquí está la adaptación del código.
Espero que ayude.
fuente
Tenga en cuenta que esta solución
updateConfiguration
ya no funcionará con el lanzamiento de Android M en unas pocas semanas. La nueva forma de hacer esto ahora es usar elapplyOverrideConfiguration
método deContextThemeWrapper
ver API docPuede encontrar mi solución completa aquí ya que yo mismo enfrenté el problema: https://stackoverflow.com/a/31787201/2776572
fuente
Hay algunos pasos que debes implementar
Primero, debe cambiar la configuración regional de su configuración
En segundo lugar, si desea que sus cambios se apliquen directamente al diseño que está visible, puede actualizar las vistas directamente o simplemente puede llamar a activity.recreate () para reiniciar la actividad actual.
Y también debe persistir sus cambios porque después de que el usuario cierre su aplicación, perdería el cambio de idioma.
Le expliqué una solución más detallada en mi publicación de blog Cambiar idioma mediante programación en Android
Básicamente, simplemente llame a LocaleHelper.onCreate () en su clase de aplicación y si desea cambiar la configuración regional sobre la marcha puede llamar a LocaleHelper.setLocale ()
fuente
Esto funciona cuando presiono el botón para cambiar el idioma de texto de mi TextView. (Strings.xml en la carpeta de valores)
fuente
Agregar clase LocaleHelper
En actividad o fragmento
Ahora SetText en cada texto
fuente
similar a la versión aceptada pero respondida de 2017 y reinicio agregado (sin reiniciar, a veces la siguiente Actividad aún se presenta en inglés):
fuente
activity.recreate()
3) el contexto devuelto creo que debe usarse para obtener los recursosPrimero cree valores de nombre de directorio: "Nombre de idioma" como hindi que escriba "hola" y copie el mismo nombre de archivo de cadena en este directorio y cambie el valor, no cambie el parámetro después de establecer el código siguiente en su acción como botón, etc.
fuente
conf.locale
está en desusofuente
En el ejemplo, establecemos el idioma inglés:
Recuerde que esto funciona solo si también se encuentra el idioma en el sistema del dispositivo, no solo en la aplicación
fuente
Para soporte árabe / RTL
fuente