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.
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>
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.
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:
En la captura de pantalla siguiente se muestra el ejemplo Tasky localizado en hebreo:
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.