Localización de Android

En este documento se presentan las características de localización del SDK de Android 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íficos.

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 Resourcescontexto 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, esta es una lista de configuraciones regionales de Java y configuraciones regionales compatibles con Android a través de StackOverflow.

Algunos ejemplos frecuentes son:

  • en_USpara 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 controlarlo estableciendo el android:configChanges atributo en la actividad, de la siguiente manera:

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

Conceptos 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.

  • GetText método , 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 AXML.
  • drawable : contiene imágenes y otros recursos dibujables.
  • values : contiene cadenas.
  • raw : contiene archivos de datos.

La mayoría de los desarrolladores ya están familiarizados con el uso de sufijos de ppp en el directorio dibujable para proporcionar varias versiones de una imagen, lo que permite a Android elegir la versión correcta para cada dispositivo. El mismo mecanismo se usa para proporcionar varias traducciones de idioma mediante el sufijo de directorios de recursos con identificadores de idioma y referencia cultural.

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 este valor 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 un guión solo (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) deben 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 identificador de recurso especificado como atributo name y la cadena traducida como valor:

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

Debe escapar según las reglas XML normales y name debe ser un identificador 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 español values-es 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 diseños como en código.

Archivos de diseño de AXML

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

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

GetText (método)

Para recuperar cadenas traducidas en el código, use el GetText método 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 hay 2 tareas que hacer".

(en lugar de un genérico "Hay n tareas a la izquierda").

En 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 GetQuantityString método , pasando el identificador de recurso y el valor que se va a 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 válidos quantity son:

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

Se describen con más detalle en los documentos 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 zero cadena 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 hace referencia en la aplicación deben colocarse en directorios dibujables para que haya una reserva.

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

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

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

Otros tipos de recursos

También puede proporcionar otros tipos de recursos alternativos específicos del idioma, incluidos 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íficamente para alemán que permita etiquetas de texto muy largas.

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

Para 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 un @string/id elemento en para la MainLauncher actividad:

[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 en 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, TextDirectiony TextAlignment para ayudar a crear pantallas que se adapten a los lectores RTL.

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

Screenshot of Tasky app in Arabic

En la captura de pantalla siguiente se muestra el ejemplo de 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 pueden cargar por algún motivo (es decir, faltan).

Pruebas del emulador

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

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

Pruebas de 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 que pueda 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 el control de recursos integrado. Puede obtener más información sobre las aplicaciones i18n y L10n para iOS, Android y multiplataforma (incluidas Xamarin.Forms) en esta guía multiplataforma.