Soportando distintos idiomas

Esta lección te enseñará a

  1. Crear directorios y archivos de localización
  2. Usar los recursos cadena

También deberías leer

Siempre es una buena práctica extraer las cadenas de la interfaz de usuario del código de la aplicación y almacenarlas en un archivo externo. Android facilita esta tarea mediante el directorio de recursos, que podemos encontrar en cada proyecto Android.

Si creaste tu proyecto usando las herramientas del SDK de Android (lee Creando un proyecto Android), se habrá creado un directorio res/ en la raíz del proyecto. Dentro de este directorio res/ encontramos distintos subdirectorios para varios tipos de recursos. También encontrarás algunos archivos por defecto como res/values/strings.xml, en el que se almacenan los valores de tus cadenas.

Crear directorios y archivos de localización


Para soportar otros idiomas, tenemos que crear uno o más directorios values dentro de la carpeta res/, con un guión y el código ISO del idioma correspondiente como sufijo. Por ejemplo, en values-es/ se almacenarán los recursos para el idioma con el código de idioma "es". Android cargará los recursos adecuados en tiempo de ejecución de acuerdo con la configuración de idioma del dispositivo.

Una vez hayas decidido los idiomas que quieres soportar, tienes que crear los subdirectorios y archivos de recursos apropiados. Por ejemplo:

MyProject/
    res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml

Añade los valores de las cadenas para cada localización en su archivo correspondiente.

En tiempo de ejecución, el sistema Android utiliza el conjunto de recursos cadena apropiado basándose en la localización seleccionada en el dispositivo del usuario.

A continuación se muestran distintos recursos cadena para distintos idiomas a modo de ejemplo.

Inglés (localización por defecto), /values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>

Español, /values-es/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>

Francés, /values-fr/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mon Application</string>
    <string name="hello_world">Bonjour le monde !</string>
</resources>

Nota: Puedes usar un calificador de idioma (o cualquier otro calificador de configuración) para cualquier tipo de recurso, por ejemplo para proporcionar versiones localizadas de tus mapas de bits. Para más información, consulta Localización.

Usar los recursos cadena


Puedes referenciar tus recursos cadena en tu código fuente y en otros archivos XML usando el nombre de recurso, definido por el atributo name del elemento <string>.

En tu código fuente, puedes hacer referencia a un recurso cadena con la sintaxis R.string.<nombre_cadena>. Existen varios métodos que aceptan que se les pase un recurso cadena de esta forma.

Por ejemplo:

// Obtenemos un recurso cadena de los Recursos de la aplicación
String hello = getResources().getString(R.string.hello_world);

// O pasamos un recurso cadena a un método que requiera una cadena
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

En otros archivos XML, siempre que el atributo XML acepte una cadena como valor, puedes hacer referencia a un recurso cadena con la sintaxis @string/<string_name>.

Por ejemplo:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />