0 votos
Mi pregunta va a como cambiar el idioma de las cadenas usando un archivo de configuración al iniciar la aplicación. Puedo cambiar entre diferentes opciones desde dentro del programa con un menú, esas opciones quedan grabadas en un archivo de configuración. Al iniciar la aplicación recupera adecuadamente la información del idioma seleccionado... Pero no puedo hacer que la aplicación inicie con dicho idioma, siempre inicia con la configuración por defecto... Alguna sugerencia?
por en Android

1 Respuesta

+1 voto
Mejor respuesta

No es muy recomendable forzar el cambio de idioma desde la programación (Java/Kotlin), pues lo hace directamente al detectar el idioma del sistema.

En Java es sencillo con getString o con Locale.

En Kotlin tendrás que hacer algo parecido, puedes echar un ojo a: https://medium.com/@wisnukurniawan/change-language-in-android-programmatically-af83aba7b910 y a https://stackoverflow.com/questions/50785840/change-locale-programmatically-in-kotlin

por
seleccionada por

Gracias! pero redirigiendo mi pregunta en todo caso... La intención no sería cambiar el idioma por defecto sino poder configurar un idioma (recuperado de un archivo de configuración)  al iniciar la aplicación.

Cuando en un menú elijo un idioma, se cambia a ese idioma y se guarda aquí:

when (item.itemId) {
    R.id.espanhol -> {
        setLocale("es")
        try{
        val archivo = OutputStreamWriter(openFileOutput("idioma.txt", MODE_PRIVATE))
        archivo.write("es")
        archivo.flush()
        archivo.close()}
        catch (e: IOException){}
        Toast.makeText(this, "Español",Toast.LENGTH_SHORT).show()
        finish()
        return true
    }
    R.id.ingles -> {
        setLocale("en")
        try{
        val archivo = OutputStreamWriter(openFileOutput("idioma.txt", MODE_PRIVATE))
        archivo.write("en")
        archivo.flush()
        archivo.close()}
        catch (e: IOException){}
        Toast.makeText(this, "English",Toast.LENGTH_SHORT).show()
        finish()
        return true
    }
    R.id.portugues -> {
        setLocale("pt")
        try{val archivo = OutputStreamWriter(openFileOutput("idioma.txt", MODE_PRIVATE))
        archivo.write("pt")
        archivo.flush()
        archivo.close()}
        catch (e: IOException){}
        Toast.makeText(this, "Português",Toast.LENGTH_SHORT).show()
        finish()
        return true
    }
}

 

fun setLocale(localeName: String) {
        val myLocale = Locale(localeName)
        val res: Resources = resources
        val dm: DisplayMetrics = res.getDisplayMetrics()
        val conf: Configuration = res.getConfiguration()
        conf.locale = myLocale
        res.updateConfiguration(conf, dm)
        val refresh = Intent(this, MainActivity::class.java)
        refresh.putExtra(localeName ,localeName)
        finish()
        startActivity(refresh)
         }

y al iniciar el activity carga esa configuración y trata de adaptar los textos:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
if (fileList().contains("idioma.txt")) {
    try {
        val archivo = InputStreamReader(openFileInput("idioma.txt"))
        val br = BufferedReader(archivo)
        var linea = br.readLine()

        br.close()
        archivo.close()
        setLocale(linea)
    } catch (e: IOException) {
    }
}

El problema es que me crea un loop infinito al hacer el refresh al iniciar la aplicación... Alguna idea?