¿Como cambiar de idioma en nuestra aplicación?

Buenas, hoy les quiero explicar como funciona el cambio de idioma dentro de la misma aplicación, no vamos a depender si el teléfono esta configurado en un idioma particular, sino, en este caso, vamos nosotros mismos a hacer que nuestra aplicación sea independiente en su idioma.

Para comenzar, deben crear un proyecto sencillo donde tenga un texto de saludo, y una fecha.

Para trabajar con idiomas, se debe crear tantas carpetas values por idioma se necesiten, por ejemplo, vamos a trabajar con 5 idiomas: español, ingles, francés, alemán y portugués.

Por defecto, cuando ustedes quieran trabajar con una aplicación multilenguaje, les recomiendo siempre por defecto, el ingles.

Al tener tu proyecto armado, empezamos con crear las carpetas y strings para los nuevos idiomas:

idiomas

Aquí tenemos el archivo String por defecto:

<resources>
    <string name="app_name">Language</string>
    <string name="action_setting">Settings</string>
    <string name="hello">Hello everybody!</string>
    <string name="setting_language">Language</string>
    <string name="format_day">EEEE</string>
    <string name="format_date">MMMM dd, yyyy</string>
    <string name="date">Today is %1$s, we are on a %2$s</string>

    <string-array name="languages">
        <item>@string/spanish</item>
        <item>@string/english</item>
        <item>@string/french</item>
        <item>@string/german</item>
        <item>@string/portuguese</item>
    </string-array>

    <string name="spanish">Spanish</string>
    <string name="english">English</string>
    <string name="french">French</string>
    <string name="german">German</string>
    <string name="portuguese">Portuguese</string>
</resources>

Aquí la versión español del mismo:

<resources>
    <string name="app_name">Idioma</string>
    <string name="action_setting">Configuración</string>
    <string name="hello">¡Hola a todos!</string>
    <string name="setting_language">Idioma</string>
    <string name="format_day">EEEE</string>
    <string name="format_date">MMMM dd, yyyy</string>
    <string name="date">Hoy es %1$s, estamos en un día %2$s</string>

    <string-array name="languages">
        <item>@string/spanish</item>
        <item>@string/english</item>
        <item>@string/french</item>
        <item>@string/german</item>
        <item>@string/portuguese</item>
    </string-array>

    <string name="spanish">Español</string>
    <string name="english">Inglés</string>
    <string name="french">Francés</string>
    <string name="german">Alemán</string>
    <string name="portuguese">Portugués</string>
</resources>

Ahora, en nuestra sección para cambiar idioma, debemos crear este método que nos realice el cambio:


public void setLocale(String lang) {
        Locale myLocale = new Locale(lang);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        Intent refresh = new Intent(this, SettingsActivity.class);
        refresh.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        refresh.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(refresh);
    }

Este código indica que vamos a crear una nueva locación, y actualiza toda la configuración de nuestra aplicación, por ultimo para que los cambios se reflejen, debemos refrescar nuestra pantalla actual, pero esto no es suficiente, para refrescar la pantalla anterior quien no reflejara los cambios, para ello debemos recrearla nuevamente.

Como parámetro le pasamos la abreviación del lenguaje, es decir, para el lenguaje español, debemos asignarle «es», para ingles, asignarle «en» y así como cada uno de ellos, más detalles de Locale a través de su página de soporte.

Agrega esta línea en tu Activity en AndroidManifest

android:configChanges="locale"

Por defecto, mi emulador esta en idioma español, por tanto, cuando comienza la aplicación se verá asi:
español

Ahora voy a mi configuración en la parte superior y cambio de idioma al ingles por ejemplo:
ingles

Nuestro texto cambia, pero hay un detalle con la fecha, debido a que la clase SimpleDateFormat no trabaja en conjunto con esta configuración, por tanto, debemos asignársela directamente:

 mFormatDay = new SimpleDateFormat(getString(R.string.format_day), 
                new Locale(mLocales[mPreferences.getInt("lang", 0)]));
mFormatDate = new SimpleDateFormat(getString(R.string.format_date),
                new Locale(mLocales[mPreferences.getInt("lang", 0)]));

La clase SimpleDateFormat recibe como segundo parámetro, una variable Locale donde le indicamos el idioma seleccionado por el usuario.

device-2015-09-05-140646

Y eso sería todo, ahora nuestra aplicación soporta multilenguaje.

ezgif.com-video-to-gif

CONCLUSIÓN

Es muy comodo este sencillo código para no depender del idioma en cual esta configurado el dispositivo, por tanto, queda a preferencias del usuario, que idioma escoger. Para ver todo este código revisa en Github.

Gracias por leer este espacio, si te gusta, puedes compartir este articulo.