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íficos.

Configuración regional

Los usuarios eligen su idioma en Configuración Entrada de & idioma. Esta selección controla tanto el idioma mostrado como la configuración regional utilizada (por ejemplo, para el formato de fecha y número).

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

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_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 cuando android.intent.action.LOCALE_CHANGED el usuario cambia su selección de idioma.

Las actividades pueden optar por controlar esto estableciendo android:configChanges el 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 archivos AXML, para colocar automáticamente cadenas localizadas en diseños.

Carpetas de recursos

Las aplicaciones Android administran la mayoría del contenido de las 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 ppp en el directorio drawable 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.

Captura de pantalla de las carpetas Resources/drawable y Resources/values para varios identificadores culturales

Nota:

Al especificar un idioma de nivel superior como 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 espt-rBR o zh-rCN.es 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 CultureInfo .NET, que solo tiene un guión (por ejemplo, pt-BR). Tenga en cuenta estas diferencias al trabajar en plataformas Xamarin.

Strings.xml formato de archivo

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 identificador de recurso especificado como atributo y la name cadena traducida como valor:

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

Debe usar el escape según las reglas XML normales y debe ser un identificador de recurso de name Android válido (sin espacios ni guiones). Este es un ejemplo del archivo de cadenas (inglés) predeterminado 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>

Captura de pantalla de varias carpetas de valores, cada una con un Strings.xml archivo

Con los archivos de cadena configurados, se puede hacer referencia a los valores traducidos en diseños y 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 XML del ejemplo muestra las propiedades que se establecen con identificadores de recursos localizados (se han omitido algunos text 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 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 una tarea".
  • "Todavía hay dos tareas por hacer".

(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 , pasando el identificador de recurso y el valor que se va a GetQuantityString mostrar (que se pasa dos veces). Android usa el segundo parámetro para determinar qué cadena se va a 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 quantity modificadores válidos son:

  • cero
  • one
  • two
  • 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 cadenas se omitirán (por ejemplo, el inglés solo usa y ; si se especifica una cadena no tendrá ningún efecto, no se oneotherzero usará).

Imágenes

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

A continuación, las imágenes específicas de la configuración regional se deben colocar en carpetas dibujables calificados, 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 drawable, pero solo una, flag.png, tiene copias localizadas en otros directorios.

Captura de pantalla de varias carpetas drawable, cada una con uno o varios archivos .png localizados

Otros tipos de recursos

También puede proporcionar otros tipos de recursos alternativos específicos del lenguaje, como diseños, animaciones y archivos sin formato. 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 los idiomas de derecha a izquierda (RTL) si establece la configuración 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 la presentación rtl.

Para obtener más información sobre la reserva y la nomenclatura 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 encontrar mediante un @string/id 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 más recientes proporciona compatibilidad completa con los diseños RTL, que se describen en detalle en el blog de compatibilidad nativa de RTL.

Cuando se usa Android 4.2 (nivel de API 17) y versiones más recientes, se pueden especificar valores de alineación con y en lugar de startend y leftright (por android:paddingStart ejemplo, ). También hay nuevas API como , y para ayudar a crear LayoutDirectionTextDirectionTextAlignment pantallas que se adapten a los lectores RTL.

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

Captura de pantalla de la aplicación Tasky en árabe

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

Captura de pantalla de la aplicación Tasky en hebreo

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

Pruebas

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

Emulator Testing

Consulte la sección Testing on an Android Emulator de Google 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 realizar pruebas en un dispositivo, cambie el idioma de la Configuración aplicación.

Sugerencia

Anote 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 conceptos 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 (incluido Xamarin.Forms) en esta guía multiplataforma.