Compartir a través de


Localización de Android

En este documento se presentan las características de localización de Android SDK y cómo acceder a ellas con Xamarin.

Características de la plataforma Android

En esta sección se describen las principales características de localización de Android. Vaya a la sección siguiente para ver ejemplos y código específico.

Configuración regional

Los usuarios eligen su idioma en Configuración > Idioma y entrada. Esta selección controla tanto el idioma mostrado como la configuración regional usada (por ejemplo: para el formato de fecha y número).

La configuración regional actual se puede consultar a través del Resources contexto actual:

var lang = Resources.Configuration.Locale; // eg. "es_ES"

Este valor será un identificador de configuración regional que contiene un código de idioma y un código de configuración regional, separados por un carácter de subrayado. Como referencia, aquí hay una lista de configuraciones regionales de Java y de configuraciones regionales compatibles con Android a través de StackOverflow.

Algunos ejemplos frecuentes son:

  • en_US para inglés (Estados Unidos)
  • es_ES para español (España)
  • ja_JP para japonés (Japón)
  • zh_CN para chino (China)
  • zh_TW para chino (Taiwán)
  • pt_PT para portugués (Portugal)
  • pt_BR para portugués (Brasil)

LOCALE_CHANGED

Android genera android.intent.action.LOCALE_CHANGED cuando el usuario cambia su selección de idioma.

Las actividades pueden optar por controlar esto estableciendo el atributo android:configChanges en la actividad de la siguiente manera:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

Aspectos básicos de internacionalización en Android

La estrategia de localización de Android tiene las siguientes partes clave:

  • Carpetas de recursos que contienen cadenas localizadas, imágenes y otros recursos.

  • Método GetText, que se usa para recuperar cadenas localizadas en el código

  • @string/id en los archivos AXML, para colocar automáticamente cadenas localizadas en diseños.

Carpetas de recursos

Las aplicaciones Android administran la mayoría del contenido en carpetas de recursos, como:

  • layout: contiene archivos de diseño de AXML.
  • drawable: contiene imágenes y otros recursos Drawable.
  • values: contiene cadenas.
  • raw: contiene archivos de datos.

La mayoría de los desarrolladores ya están familiarizados con el uso de sufijos dpi en el directorio Drawable para proporcionar varias versiones de una imagen, permitiendo a Android elegir la versión correcta para cada dispositivo. Se usa el mismo mecanismo para proporcionar varias traducciones de lenguaje con sufijos en directorios de recursos con identificadores de idioma y referencias culturales.

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

Nota:

Cuando se especifica un idioma de nivel superior, como es, solo se requieren dos caracteres. Sin embargo, al especificar una configuración regional completa, el formato de nombre de directorio requiere un guión y una r minúscula para separar las dos partes. Por ejemplo: pt-rBR o zh-rCN. Compare esto con el valor devuelto en el código, que tiene un carácter de subrayado (por ejemplo: pt_BR). Ambos son diferentes al valor que usa la clase .NET CultureInfo, que tiene solo un guión (por ejemplo: pt-BR). Tenga en cuenta estas diferencias al trabajar en plataformas de Xamarin.

Formato de archivo Strings.xml

Un directorio de valores localizados (por ejemplo: values-es o values-pt-rBR) debe contener un archivo denominado Strings.xml que contendrá el texto traducido para esa configuración regional.

Cada cadena traducible es un elemento XML con el id. de recurso especificado como atributo name y la cadena traducida como valor:

<string name="app_name">TaskyL10n</string>

Debe eludir según las reglas XML normales y el name debe ser un id. de recurso de Android válido (sin espacios ni guiones). Este es un ejemplo del archivo de cadenas predeterminado (inglés) para el ejemplo:

values/Strings.xml

<resources>
    <string name="app_name">TaskyL10n</string>
    <string name="taskadd">Add Task</string>
    <string name="taskname">Name</string>
    <string name="tasknotes">Notes</string>
    <string name="taskdone">Done</string>
    <string name="taskcancel">Cancel</string>
</resources>

El directorio values-es del español contiene un archivo con el mismo nombre (Strings.xml) que contiene las traducciones:

values-es/Strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TaskyLeon</string>
    <string name="taskadd">agregar tarea</string>
    <string name="taskname">Nombre</string>
    <string name="tasknotes">Notas</string>
    <string name="taskdone">Completo</string>
    <string name="taskcancel">Cancelar</string>
</resources>

Screenshot of multiple values folders, each containing a Strings.xml file

Con los archivos de cadenas configurados, se puede hacer referencia a los valores traducidos tanto en los diseños como en el código.

Archivos de diseño de AXML

Para hacer referencia a cadenas localizadas en archivos de diseño, use la sintaxis @string/id. Este fragmento de código XML del ejemplo muestra las propiedades text establecidas con identificadores de recursos localizados (se omitieron otros atributos):

<TextView
    android:id="@+id/NameLabel"
    android:text="@string/taskname"
    ... />
<CheckBox
    android:id="@+id/chkDone"
    android:text="@string/taskdone"
    ... />

Método GetText

Para recuperar cadenas traducidas en el código, use el método GetText y pase el identificador de recurso:

var cancelText = Resources.GetText (Resource.String.taskcancel);

Cadenas de cantidad

Los recursos de cadena de Android también permiten crear cadenas de cantidad que permiten a los traductores proporcionar traducciones diferentes para diferentes cantidades, como:

  • "Queda 1 tarea".
  • "Todavía quedan 2 tareas".

(en lugar de un genérico "Quedan n tareas").

En el Strings.xml

<plurals name="numberOfTasks">
   <!--
      As a developer, you should always supply "one" and "other"
      strings. Your translators will know which strings are actually
      needed for their language.
    -->
   <item quantity="one">There is %d task left.</item>
   <item quantity="other">There are %d tasks still to do.</item>
 </plurals>

Para representar la cadena completa, use el método GetQuantityString pasando el id. de recurso y el valor que se mostrará (que se pasa dos veces). Android usa el segundo parámetro para determinar quéquantity cadena usar. El tercer parámetro es el valor que se sustituye realmente en la cadena (ambos son necesarios).

var translated = Resources.GetQuantityString (
                    Resource.Plurals.numberOfTasks, taskcount, taskcount);`

Los modificadores quantity válidos son:

  • zero
  • uno
  • dos
  • few
  • many
  • otro

Se describen con más detalle en la documentación de Android. Si un idioma determinado no requiere un control "especial", esas quantity cadenas se omitirán (por ejemplo: el inglés solo usa one y other. Especificar una cadena zero no tendrá ningún efecto, no se usará).

Imágenes

Las imágenes localizadas siguen las mismas reglas que los archivos de cadenas: todas las imágenes a las que se haga referencia en la aplicación deben colocarse en directorios Drawable para que haya una reserva.

A continuación, las imágenes específicas de la configuración regional deben colocarse en carpetas de recursos Drawable completas, como drawable-es o drawable-ja (también se pueden agregar especificadores de dpi).

En esta captura de pantalla se guardan cuatro imágenes en el directorio Drawable, pero solo una, flag.png, localizó copias en otros directorios.

Screenshot of multiple drawable folders, each containing one or more localized .png files

Otros tipos de recursos

También es posible proporcionar otros tipos de recursos alternativos específicos del idioma, incluyendo diseños, animaciones y archivos sin procesar. Esto significa que podría proporcionar un diseño de pantalla específico para uno o varios de los idiomas de destino. Por ejemplo, podría crear un diseño específico para alemán que permita etiquetas de texto muy largas.

Android 4.2 introdujo compatibilidad con idiomas de derecha a izquierda (RTL) al establecer la configuración de la aplicación android:supportsRtl="true". El calificador de recursos "ldrtl" se puede incluir en un nombre de directorio para poder contener diseños personalizados creados para mostrar RTL.

Para obtener más información sobre la nomenclatura y la reserva de directorios de recursos, consulte la documentación de Android para proporcionar recursos alternativos.

Nombre de la aplicación

El nombre de la aplicación es fácil de localizar mediante el uso de @string/id para la actividad MainLauncher:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges =  ConfigChanges.Orientation | ConfigChanges.Locale)]

Idiomas de derecha a izquierda (RTL)

Android 4.2 y versiones posteriores proporcionan compatibilidad completa con diseños RTL, que se describen con detalle en el blog de soporte técnico de RTL nativo.

Al usar Android 4.2 (nivel de API 17) y versiones posteriores, los valores de alineación se pueden especificar con start y end en lugar de left y right (por ejemplo: android:paddingStart). También hay nuevas API, como LayoutDirection, TextDirection y TextAlignment, para ayudar a crear pantallas que se adapten a los lectores de RTL.

En la captura de pantalla siguiente se muestra el ejemplo Tasky localizado en árabe:

Screenshot of Tasky app in Arabic

En la captura de pantalla siguiente se muestra el ejemplo Tasky localizado en hebreo:

Screenshot of Tasky app in Hebrew

El texto RTL se localiza mediante archivos Strings.xml de la misma manera que el texto LTR.

Prueba

Asegúrese de probar exhaustivamente la configuración regional predeterminada. La aplicación se bloqueará si los recursos predeterminados no se pudieran cargar por algún motivo (por ejemplo: que faltasen).

Pruebas del emulador

Consulte la sección Google Test en Android Emulator para obtener instrucciones sobre cómo establecer un emulador en una configuración regional específica mediante el shell de Android Debug Bridge.

adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start

Pruebas en dispositivos

Para probar en un dispositivo, cambie el idioma de la aplicación Configuración.

Sugerencia

Tome nota de los iconos y la ubicación de los elementos de menú para poder revertir el idioma a la configuración original.

Resumen

En este artículo se tratan los aspectos básicos de la localización de aplicaciones Android mediante las características integradas de control de recursos. Obtenga más información sobre i18n y L10n para aplicaciones iOS, Android y multiplataforma (incluyendo Xamarin.Forms) en esta guía multiplataforma.