El idioma de una aplicación de Android específica se cambia mediante programación con Kotlin | de Arul mani | Octubre de 2020

Hola,

De forma predeterminada, Android intenta cargar recursos según el idioma del sistema configurado en el teléfono del usuario. Por lo tanto, si y Tamil Idioma El usuario de Kavi con Android configurado en idioma tamil ha abierto nuestro android aplicación en el teléfono, vería la aplicación localizada en su propio idioma.

Pero, ¿qué pasa si otro usuario quiere usar tamil para su idioma? android una aplicación de Android que tiene el idioma predeterminado configurado en inglés?

Para hacerlo nosotros tendrá que actualizar programáticamente el entorno nacional de nuestra android las aplicaciones anulan la configuración regional predeterminada establecida en el sistema del usuario. Aquí le pedimos al usuario que seleccione un idioma y cambie el idioma solo en la aplicación.

Comencemos creando nuevos archivos fuente para el idioma tamil usando el asistente de archivos fuente de Android Studio.

Primero, haga clic derecho en el icono res Carpeta y seleccione «Nuevo -> Archivo de recursos de Android»: le solicita que este tipo de archivo sea strings.xml

Seleccione un idioma aquí,

Generará XML para usted, luego puede insertar una cadena de muestra como se muestra a continuación.

Apariencia predeterminada en inglés

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_greatings">Hello</string>
//... other strings
</resources>

Nuevos estilos Langauge Tamil

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_greatings">வணக்கம்</string>
//... other strings
</resources>

Esto se debe a que hemos configurado la configuración regional de las cadenas.

Una foto de Bruce Mars en Unsplash

Ahora creemos ContextUtils una clase de herramienta para mantener nuestros métodos de actualización de la configuración regional. Colóquelo y utils paquete en android solicitud:

class ContextUtils(base: Context) : ContextWrapper(base) {

companion object {

fun updateLocale(c: Context, localeToSwitchTo: Locale): ContextWrapper {
var context = c
val resources: Resources = context.resources
val configuration: Configuration = resources.configuration
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val localeList = LocaleList(localeToSwitchTo)
LocaleList.setDefault(localeList)
configuration.setLocales(localeList)
} else {
configuration.locale = localeToSwitchTo
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
context = context.createConfigurationContext(configuration)
} else {
resources.updateConfiguration(configuration, resources.displayMetrics)
}
return ContextUtils(context)
}
}
}

Así que aquí

  1. Configuration.locale el campo quedó obsoleto en el nivel de API 24 (Turrón). Esto fue introducido por los desarrolladores de API de Android para que los codificadores usen getters y setters en lugar de acceso directo a las variables.
  2. Esto ha sido marcado como forma preferida de establecer entornos nacionales (en lugar de usar acceso directo o setLocale (java.util.Locale)) comenzando con el nivel de API 24.
  3. Antes del nivel de API 24, los desarrolladores podían acceder directamente configuration.locale campo ya que querían cambiarlo.

Entonces podemos usar este método para aplicar los cambios de configuración regional.

Crear BaseActivity que extiende AppCompatActivity y debe ser heredado por otras actividades.

Usaremos attachBaseContext anule el método para actualizar la configuración local a ACTIVITY para que afecte a todas las demás actividades extendidas por.

P: ¿Cuál es el uso de AttachBaseContext?

A: El attachBaseContext función ContextWrapper la clase asegura que el contexto se adjunta solo una vez. ContextThemeWrapper utiliza un tema de una aplicación o actividad que se define como android:theme en AndroidManifest.xml expediente. Como ni la aplicación ni el servicio necesitan un tema, los hereda directamente de ContextWrapper. Durante la creación de la actividad, se inician nuevas aplicaciones y servicios ContextImpl el objeto se crea cada vez e implementa funciones en Context.

open class BaseActivity: AppCompatActivity() {

override fun attachBaseContext(newBase: Context) {

// get chosen language from shread preference
val localeToSwitchTo = PreferenceManager(newBase).getAppLanguage()
val localeUpdatedContext: ContextWrapper = ContextUtils.updateLocale(newBase, localeToSwitchTo) super.attachBaseContext(localeUpdatedContext)
}

}

Ejemplo:

class LanguageActivity: AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_language)

tamil_bt.setOnClickListener {
PreferenceManager(this).updateLanguage("ta")
startActivity(Intent(this, MainActivity::class.java))
finish()
}english_bt.setOnClickListener {
PreferenceManager(this).updateLanguage("en")
startActivity(Intent(this, MainActivity::class.java))
finish()
}
}
}

Aquí guardamos por dentro SharedPreference una cadena que contiene código de idioma como Tamil → «ta», inglés → «en», hindi → «hola», etc.

Este código se utiliza para identificación Language utilizar Locale("language-code")

Una vez utilizadas en una actividad básica, las cadenas se utilizan automáticamente dondequiera que se utilicen.

A continuación se muestra una actividad de muestra que amplía BaseActivity ().

class MainActivity : BaseActivity() {override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}

}

Solo se esta expandiendo BaseActivity justo y verás la magia. 😉 Espero que el usuario no se pierda en la aplicación.

Una foto de David Kovalenko en Unsplash

Referencia:

https://ericyang505.github.io/android/Context.html

El tamil es el idioma más antiguo del mundo. Actualmente, el número de hablantes de tamil ronda los 7,7 millones de rupias.

https://www.britannica.com/topic/Tamil-language

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *