Localización en Xamarin.iOS
En este documento se tratan las características de localización del SDK de iOS y cómo acceder a ellas con Xamarin.
Consulte Codificaciones de internacionalización para obtener instrucciones sobre cómo incluir juegos de caracteres o páginas de códigos en aplicaciones que deben procesar datos no Unicode.
Características de la plataforma iOS
En esta sección se describen algunas de las características de localización en iOS. Vaya a la sección siguiente para ver ejemplos y código específicos.
Language
Los usuarios eligen su idioma en Configuración aplicación. Esta configuración afecta a las cadenas de idioma y las imágenes que muestra el sistema operativo y en las aplicaciones.
Para determinar el idioma que se usa en una aplicación, obtenga el primer elemento de NSBundle.MainBundle.PreferredLocalizations :
var lang = NSBundle.MainBundle.PreferredLocalizations[0];
Este valor será un código de idioma como en para inglés, es español, ja japonés, etc. El valor devuelto está restringido a una de las localizaciones admitidas por la aplicación (mediante reglas de reserva para determinar la mejor coincidencia).
El código de la aplicación no siempre necesita comprobar este valor: Xamarin e iOS proporcionan características que ayudan a proporcionar automáticamente la cadena o el recurso correctos para el lenguaje del usuario. Estas características se describen en el resto de este documento.
Nota:
Use NSLocale.PreferredLanguages para determinar las preferencias de idioma del usuario, independientemente de las localizaciones admitidas por la aplicación. Los valores devueltos por este método cambiaron en iOS 9; Consulte la nota técnica TN2418 para obtener más información.
Configuración regional
Los usuarios eligen su configuración regional en Configuración aplicación. Esta configuración afecta a la forma en que se formatea fechas, horas, números y moneda.
Esto permite a los usuarios elegir si ven formatos de hora de 12 o 24 horas, si su separador decimal es una coma o un punto, y el orden de día, mes y año en la presentación de la fecha.
Con Xamarin, tiene acceso tanto a las clases de iOS de Apple ( ) como a NSNumberFormatter las clases de .NET en System.Globalization. Los desarrolladores deben evaluar cuál es más adecuado para sus necesidades, ya que hay diferentes características disponibles en cada una. En concreto, si va a recuperar y mostrar In-App Comprar precios mediante StoreKit, debe usar las clases de formato de Apple para la información de precios devuelta.
La configuración regional actual se puede consultar de dos maneras:
NSLocale.CurrentLocale.LocaleIdentifierNSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier
El sistema operativo puede almacenar en caché el primer valor, por lo que es posible que no siempre refleje la configuración regional seleccionada actualmente del usuario. Use el segundo valor para obtener la configuración regional seleccionada actualmente.
Nota:
Mono (el entorno de ejecución de .NET en el que se basa Xamarin.iOS) y las API de iOS de Apple no admiten conjuntos idénticos de combinaciones de idioma y región. Por este problema, es posible seleccionar una combinación de idioma y región en la aplicación de Configuración iOS que no se asigne a un valor válido en Mono. Por ejemplo, si se establece iPhone idioma de una aplicación en inglés y su región en España, las siguientes API producen valores diferentes:
CurrentThead.CurrentCulture: en-US (MONO API)CurrentThread.CurrentUICulture: en-US (MONO API)NSLocale.CurrentLocale.LocaleIdentifier: en_ES (API de Apple)
Dado que Mono usa para seleccionar recursos y para dar formato a fechas y monedas, la localización basada en Mono (por ejemplo, con archivos CurrentThread.CurrentUICulture .resx) puede no producir los resultados esperados para estas combinaciones de idioma y CurrentThread.CurrentCulture región. En estas situaciones, confíe en las API de Apple para la localización según sea necesario.
NSCurrentLocaleDidChangeNotification
iOS genera cuando NSCurrentLocaleDidChangeNotification el usuario actualiza su configuración regional. Las aplicaciones pueden escuchar esta notificación mientras se ejecutan y pueden realizar los cambios adecuados en la interfaz de usuario.
Conceptos básicos de localización en iOS
Las siguientes características de iOS se aprovechan fácilmente en Xamarin para proporcionar recursos localizados para mostrarlos al usuario. Consulte el ejemplo TaskyL10n para ver cómo implementar estas ideas.
Especificación de idiomas predeterminados y admitidos en Info.plist
En Technical Q A QA1828: How iOS Determines the Language For Your App, Apple describe cómo iOS selecciona un idioma para usarlo en una aplicación. Los siguientes factores afectan al idioma que se muestra:
- Idiomas preferidos del usuario (que se encuentran en Configuración aplicación)
- Las localizaciones agrupadas con la aplicación (carpetas .lproj)
CFBundleDevelopmentRegion(CFBundleDevelopmentRegionque especifica el idioma predeterminado para la aplicación)CFBundleLocalizations(CFBundleLocalizationsque especifica todas las localizaciones admitidas)
Como se indica en la Q A técnica, representa la región y el idioma predeterminados &CFBundleDevelopmentRegion de una aplicación. Si la aplicación no admite explícitamente ninguno de los idiomas preferidos de un usuario, usará el idioma especificado por este campo.
Importante
iOS 11 aplica este mecanismo de selección de idioma más estrictamente que las versiones anteriores del sistema operativo. Por este problema, cualquier aplicación de iOS 11 que no declare explícitamente sus localizaciones admitidas (ya sea mediante la inclusión de carpetas .lproj o estableciendo un valor para ) puede mostrar un idioma diferente en iOS 11 que en CFBundleLocalizations iOS 10.
Si no se ha especificado en el archivo CFBundleDevelopmentRegionCFBundleDevelopmentRegion las herramientas de compilación de Xamarin.iOS usan actualmente un valor predeterminado de en_US . Aunque esto puede cambiar en una versión futura, significa que el idioma predeterminado es inglés.
Para asegurarse de que la aplicación selecciona un idioma esperado, siga estos pasos:
- Especifique un idioma predeterminado. Abra Info.plist y use la vista Origen para establecer un valor para la clave; en XML, debe tener un aspecto similar al siguiente:
<key>CFBundleDevelopmentRegion</key>
<string>es</string>
En este ejemplo se usa "es" para especificar que, cuando no se admite ninguno de los idiomas preferidos de un usuario, el valor predeterminado es español.
- Declare todas las localizaciones admitidas. En Info.plist, use la vista Origen para establecer una matriz para la clave; en XML, debe tener un aspecto similar al siguiente:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>es</string>
...
</array>
Las aplicaciones de Xamarin.iOS que se han localizado mediante mecanismos de .NET como archivos .resx también deben proporcionar estos valores info.plist.
Para obtener más información sobre estas claves de Info.plist, consulte referencia de clave de lista de propiedades de información deApple.
Método GetLocalizedString
El NSBundle.MainBundle.GetLocalizedString método busca texto localizado que se ha almacenado en archivos NSBundle.MainBundle.GetLocalizedString en el proyecto. Estos archivos se organizan por lenguaje, en directorios con nombre especial con un sufijo .lproj (tenga en cuenta que la primera letra de la extensión es una "L" en minúsculas).
Ubicaciones de archivos .strings
- Base.lproj es el directorio que contiene recursos para el idioma predeterminado. A menudo se encuentra en la raíz del proyecto (pero también se puede colocar en la carpeta Recursos).
- Los > directorios .lproj del lenguaje se crean para cada idioma admitido, normalmente en la > Recursos.
Puede haber varios archivos .strings diferentes en cada directorio de lenguaje:
- Localizable.strings: la lista principal de texto localizado.
- InfoPlist.strings: ciertas claves específicas se permiten en este archivo para traducir cosas como el nombre de la aplicación.
- storyboard-name > .strings: archivo opcional que contiene traducciones para elementos de la interfaz de usuario en un guión gráfico.
La acción de compilación de estos archivos debe ser Agrupar recurso.
Formato de archivo .strings
La sintaxis de los valores de cadena localizados es:
/* comment */
"key"="localized-value";
Debe usar los caracteres de escape siguientes en las cadenas:
\"Citar\\Barra invertida\nNewline
Este es un ejemplo de es/Localizable.strings (es decir, Español) del ejemplo:
"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";
Imágenes
Para localización de una imagen en iOS:
Consulte la imagen en el código, por ejemplo:
UIImage.FromBundle("flag");Coloque el archivo de imagenflag.png en Base.lproj (el directorio del lenguaje de desarrollo nativo).
Opcionalmente, coloque versiones localizadas de la imagen en carpetas .lproj para cada idioma (por ejemplo, es.lproj, ja.lproj). Use el mismo nombre de flag.png en cada directorio de idioma.
Si una imagen no está presente para un idioma determinado, iOS volverá a la carpeta de idioma nativo predeterminada y cargará la imagen desde allí.
Iniciar imágenes
Use las convenciones de nomenclatura estándar para las imágenes de inicio (y los modelos XIB o Storyboard para iPhone 6) al colocarlas en los directorios .lproj de cada lenguaje.
Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib
Nombre de la aplicación
La colocación de un archivo InfoPlist.strings en un directorio .lproj permite invalidar algunos valores del archivo Info.plistde la aplicación, incluido el nombre de la aplicación:
"CFBundleDisplayName" = "LeónTodo";
Otras claves que puede usar para localización de cadenas específicas de la aplicación son:
- CFBundleName
- CFBundleShortVersionString
- NSReadableCopyright
Fechas y horas
Aunque es posible usar las funciones integradas de fecha y hora de .NET (junto con la actual) para dar formato a las fechas y horas de una configuración regional, esto omitiría la configuración regional específica del usuario (que se puede establecer por separado del CultureInfo idioma).
Use iOS NSDateFormatter para generar una salida que coincida con la preferencia de configuración regional del usuario. El código de ejemplo siguiente muestra las opciones básicas de formato de fecha y hora:
var date = NSDate.Now;
var df = new NSDateFormatter ();
df.DateStyle = NSDateFormatterStyle.Full;
df.TimeStyle = NSDateFormatterStyle.Long;
Debug.WriteLine ("Full,Long: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Short;
df.TimeStyle = NSDateFormatterStyle.Short;
Debug.WriteLine ("Short,Short: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Medium;
df.TimeStyle = NSDateFormatterStyle.None;
Debug.WriteLine ("Medium,None: " + df.StringFor(date));
Resultados para inglés en la Estados Unidos:
Full,Long: Friday, August 7, 2015 at 10:29:32 AM PDT
Short,Short: 8/7/15, 10:29 AM
Medium,None: Aug 7, 2015
Resultados para español en España:
Full,Long: viernes, 7 de agosto de 2015, 10:26:58 GMT-7
Short,Short: 7/8/15 10:26
Medium,None: 7/8/2015
Consulte la documentación de formateadores de fecha de Apple para obtener más información. Al probar el formato de fecha y hora que distingue la configuración regional, compruebe la configuración iPhone idiomay región.
Diseño de derecha a izquierda (RTL)
iOS proporciona una serie de características que ayudan a crear aplicaciones compatibles con RTL:
- Use los atributos y del diseño automático para la alineación del control (que corresponde a izquierda y derecha para inglés, pero se invierte para
leadingtrailinglos idiomas RTL). El control es especialmente útil para establecer controles queUIStackViewsean con respecto a LA RTL. - Se usa para la alineación de texto (que se deja para la
TextAlignment = UITextAlignment.Naturalmayoría de los idiomas, pero a la derecha para RTL). UINavigationControllervoltea automáticamente el botón Atrás e invierte la dirección del deslizamiento.
En las capturas de pantalla siguientes se muestra el ejemplo tasky localizado en árabe y hebreo (aunque se ha escrito inglés en los campos):
iOS invierte automáticamente y los demás controles se colocan dentro o UINavigationControllerUIStackView se alinean con el diseño automático.
El texto RTL se localiza mediante archivos .strings de la misma manera que el texto LTR.
Localización de la interfaz de usuario en el código
El ejemplo Tasky (localizado en código) muestra cómo localizar una aplicación en la que la interfaz de usuario está integrada en código (en lugar de XIB o guiones gráficos).
Estructura del proyecto

Archivo Localizable.strings
Como se ha descrito anteriormente, el formato de archivo Localizable.strings consta de pares clave-valor. La clave describe la intención de la cadena y el valor es el texto traducido que se usará en la aplicación.
A continuaciónse muestranlas localizaciones en español del ejemplo:
"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";
Realización de la localización
En el código de la aplicación, siempre que se establezca el texto para mostrar de una interfaz de usuario (ya sea el texto de una etiqueta, el marcador de posición de una entrada, etc.), el código usa la función de iOS para recuperar la traducción correcta que se va a GetLocalizedString mostrar:
var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;
Localización de las uri de guión gráfico
En el ejemplo Tasky (guión gráfico localizado) se muestra cómo localizar texto en controles de un guión gráfico.
Estructura del proyecto
El directorio Base.lproj contiene el guión gráfico y también debe contener las imágenes usadas en la aplicación.
Los demás directorios de lenguaje contienen un archivo Localizable.strings para todos los recursos de cadena a los que se hace referencia en el código, así como un archivo MainStoryboard.strings que contiene traducciones de texto en el guión gráfico.

Los directorios de lenguaje deben contener una copia de las imágenes que se han localizado, para invalidar la presente en Base.lproj.
Id. de objeto/Id. de localización
Al crear y editar controles en un guión gráfico, seleccione cada control y compruebe el identificador que se usará para la localización:
- En Visual Studio para Mac, se encuentra en el Panel de propiedades se denomina Identificador de localización.
- En Xcode, se denomina Id. de objeto.
Este valor de cadena suele tener un formato como "NF3-h8-xmR", como se muestra en la captura de pantalla siguiente:

Este valor se usa en el archivo .strings para asignar texto traducido automáticamente a cada control.
MainStoryboard.strings
El formato del archivo de traducción de guion gráfico es similar al archivo Localizable.strings, salvo que la clave (el valor de la izquierda) no se puede definir por el usuario, sino que debe tener un formato muy específico: .
En el ejemplo Mainstoryboard.strings siguiente puede ver que s tienen una propiedad de texto que se puede placeholder localizar; UILabel s tienen una text propiedad y el texto predeterminado se establece mediante UIButtonnormalTitle :
"SXg-TT-IwM.placeholder" = "nombre de la tarea";
"Pqa-aa-ury.placeholder"= "otra información de tarea";
"zwR-D9-hM1.text" = "Detalles de la tarea";
"bAM-2j-Rzw.text" = "Notas"; /* Notes */
"NF3-h8-xmR.text" = "Completo"; /* Done */
"MWt-Ya-pMf.normalTitle" = "Guardar"; /* Save */
"IGr-pR-05L.normalTitle" = "Eliminar"; /* Delete */
Importante
El uso de un guión gráfico con clases de tamaño puede dar lugar a traducciones que no aparecen en la aplicación. Las notas de la versión de Xcode de Apple indican que un guión gráfico o XIB no se localizará correctamente si se cumplen tres cosas: usa clases de tamaño, la localización base y el destino de compilación se establecen en Universal y la compilación tiene como destino iOS 7.0. La corrección es duplicar el archivo de cadenas de guión gráfico en dos archivos idénticos: MainStoryboard~iphone.strings y MainStoryboard~ipad.strings, como se muestra en la captura de pantalla siguiente:

App Store lista
Sigue las preguntas más frecuentes de Apple sobre la App Store localización para escribir traducciones para cada país en el que la aplicación está a la venta. Observe su advertencia de que las traducciones solo aparecerán si la aplicación también contiene un directorio .lproj localizado para el idioma.
Resumen
En este artículo se tratan los conceptos básicos de la localización de aplicaciones iOS mediante las características integradas de control de recursos y guión gráfico.
Puede obtener más información sobre i18n y L10n para iOS, Android y aplicaciones multiplataforma (incluido Xamarin.Forms) en esta guía multiplataforma.

