iOS sucintamente - Localización

Hasta ahora, todos nuestros proyectos de ejemplo han asumido que nuestras aplicaciones estaban destinadas a hablantes de inglés, pero muchas aplicaciones pueden beneficiarse de estar disponibles para audiencias que no hablan inglés. La App Store se encarga de presentar nuestra aplicación a la audiencia adecuada, pero nuestro trabajo como desarrolladores es configurarla de tal manera que se muestren los recursos adecuados para los usuarios de diferentes regiones. Este proceso se llama localización..

Afortunadamente, iOS hace que sea sorprendentemente fácil localizar los recursos utilizando paquetes. La clase NSBundle selecciona automáticamente el activo apropiado teniendo en cuenta el idioma preferido del usuario. Por ejemplo, si ha proporcionado diferentes versiones de la misma imagen para hablantes de inglés frente a hablantes de español, el método pathForResource: ofType: descrito en el capítulo anterior devuelve diferentes rutas de archivo según la configuración del usuario. Esta es una de las razones principales por las que no debe acceder directamente a los recursos del paquete utilizando rutas codificadas.

Los tres aspectos de una aplicación que normalmente necesitan ser localizados son imágenes, audio o videos que contengan un idioma específico, cadenas codificadas y guiones gráficos. En este capítulo, analizaremos brevemente la localización de recursos multimedia y cadenas codificadas utilizando las capacidades de internacionalización integradas de NSBundle. Los archivos del guión gráfico se pueden localizar usando el mismo proceso.


Creando la aplicación de ejemplo

El ejemplo para este capítulo es una aplicación simple que muestra diferentes imágenes o cadenas según el idioma preferido del usuario. Cree una nueva aplicación de vista única y llámela "Internacionalización". Como siempre, Utilizar guiones gráficos, y Utilice el conteo automático de referencias debe ser seleccionado.


Habilitando la localización

El primer paso para hacer que una aplicación sea multilingüe es agregar los idiomas admitidos al proyecto. En el navegador del proyecto, seleccione el icono del proyecto..


Figura 96: Selección del proyecto en el Project Navigator

Luego, seleccione el proyecto de internacionalización en la columna de la izquierda (no debe confundirse con el objetivo de internacionalización). Asegúrese de que la pestaña Información esté seleccionada; Deberías ver la siguiente ventana:


Figura 97: La ventana de información del proyecto

Para agregar soporte para otro idioma, seleccione el signo más debajo de Localizaciones sección. Puedes elegir el idioma que quieras, pero este libro utilizará el español. Al seleccionar un idioma, se abrirá un cuadro de diálogo que le preguntará qué archivos deben ser localizados. Borrar la selección de MainStoryboard.storyboard, pero vete InfoPlist.strings seleccionado.


Figura 98: Añadiendo una localización en español

Ahora es posible agregar una versión en español de cada recurso al paquete de aplicaciones.


Localizando Imágenes

A continuación, veremos la localización de los activos de medios. En el paquete de recursos para este libro, encontrará un archivo llamado syncfusion-icon-en.png. Agregue este archivo al paquete de aplicaciones arrastrándolo al Project Navigator y renómbrelo como syncfusion-icon.png. Luego, visualícelo en la vista cambiando el viewDidLoad método en ViewController.m a lo siguiente:

 - (void) viewDidLoad [super viewDidLoad]; // Encuentra la imagen. NSString * imagePath = [[NSBundle mainBundle] pathForResource: @ "syncfusion-icon" ofType: @ "png"]; NSLog (@ "% @", imagePath); // Cargar la imagen. UIImage * imageData = [[UIImage alloc] initWithContentsOfFile: imagePath]; if (imageData! = nil) // Muestra la imagen. UIImageView * imageView = [[UIImageView alloc] initWithImage: imageData]; CGRect screenBounds = [[UIScreen mainScreen] edge]; imageView.contentMode = UIViewContentModeCenter; CGRect frame = imageView.frame; frame.size.width = screenBounds.size.width; frame.size.height = screenBounds.size.height; imageView.frame = frame; [[vista propia] addSubview: imageView];  else NSLog (@ "No se pudo cargar el archivo"); 

Cuando compile el proyecto, debería ver un pequeño ícono en el medio de la pantalla:


Figura 99: Agregando programáticamente una imagen a la vista

También deberías ver el camino. Internationalization.app/syncfusion-icon.png en el panel de salida. No hay nada nuevo aquí, solo una imagen en el nivel superior del paquete de aplicaciones, pero esto cambiará una vez que localicemos el archivo de imagen.

Para ello, seleccione la imagen en el Project Navigator, abra el panel Utilidades y haga clic en Hacer localizado bajo la Localización sección.


Figura 100: Creando un archivo localizado

El siguiente diálogo le pide que elija un idioma. Seleccionar Inglés y haga clic Localizar.


Figura 101: Configurando la localización

Esto le dice a iOS que esta versión de syncfusion-icon.png es para hablantes de inglés. Agregaremos una versión en español en un momento, pero primero veamos qué sucede detrás de escena. Para ver tus localizaciones en acción, tendrás que reiniciar el simulador de iOS y hacer una compilación limpia. Para reiniciar el simulador, navegue hasta Simulador de iOS> Restablecer contenido y configuración en la barra de menú y seleccione Restablecer en el cuadro de diálogo resultante.


Figura 102: Reiniciando el simulador de iOS

Salga del simulador y vuelva al proyecto de internacionalización en Xcode. Para realizar una construcción limpia, navegue a Producto> Limpiar en la barra de menú y compile el proyecto nuevamente como lo haría normalmente. Debería ver una ruta de archivo diferente en el Panel de salida:

 Internationalization.app/en.lproj/syncfusion-icon.png.

El nuevo en.lproj / El subdirectorio es la forma interna de organizar archivos específicos de idioma en iOS. Todos los recursos localizados en inglés aparecerán en este subdirectorio, y todas las versiones en español aparecerán en el es.lproj / subdirectorio. Pero, de nuevo, no tenemos que saber dónde reside el archivo; De NSBundle pathForResource: ofType: El método lo descubre automáticamente.

Así, nuestra versión en inglés de la imagen está configurada. A continuación, necesitamos configurar la versión en español. Seleccione la versión en inglés del archivo en Project Navigator y seleccione la casilla de verificación junto a Español en la sección Localización del panel Utilidades.


Figura 103: Añadiendo una versión en español del archivo.

Esto copia la versión existente en inglés de syncfusion-icon.png en el es.lproj / subdirectorio. De vuelta en el Project Navigator, debería poder ver esto expandiendo el syncfusion-icon.png expediente.


Figura 104: Ambas versiones del archivo de imagen en el Project Navigator

Por supuesto, necesitamos reemplazar la versión en español con un archivo completamente diferente. La forma más fácil de hacerlo es seleccionando la syncfusion-icon.png (Español) y haga clic en el icono de flecha al lado del Ruta completa cadena en el Utilidades panel.


Figura 105: El Panel de Utilidades para el archivo de imagen en español.

Esto muestra el contenido de la es.lproj / carpeta en el Finder, que nos da la oportunidad de reemplazar el archivo manualmente. Eliminar el existente syncfusion-icon.png archiva y copia el syncfusion-icon-es.png archivo del paquete de recursos en es.lproj /. Asegúrate de renombrarlo como syncfusion-icon.png. Es importante que las versiones localizadas del mismo archivo tengan nombres de archivo idénticos para que NSBundle pueda encontrarlos. Después de reemplazar el archivo, debería ver imágenes diferentes cuando selecciona las dos localizaciones en Xcode.

Eso debería ser para localizar nuestro archivo de imagen. Para probarlo, puede cambiar el idioma del dispositivo de la misma manera que lo haría en un dispositivo real, a través de la aplicación Configuración. Haga clic en el botón de inicio del dispositivo en el simulador, haga clic y arrastre la pantalla hacia la derecha e inicie la aplicación Configuración. En General> Internacional> Idioma, puede seleccionar el idioma del dispositivo.


Figura 106: Cambiando el idioma del dispositivo en el simulador de iOS

Elija Español y vuelva a abrir su aplicación. Deberías ver la versión en español de syncfusion-icon.png. Es posible que deba cerrar el simulador y volver a compilar el programa. Tenga en cuenta que la salida de la ruta de archivo por NSLog () ahora lee:

 Internationalization.app/es.lproj/syncfusion-icon.png.

Figura 107: Visualización de la versión localizada del archivo de imagen

Como puede ver, es increíblemente fácil localizar archivos usando la funcionalidad incorporada de NSBundle. La idea es usar NSBundle como una abstracción entre el código de su aplicación y los activos en los que se basan. Esto aísla el proceso de localización del proceso de desarrollo, lo que facilita la externalización de las traducciones..

La localización de archivos de audio y video utiliza exactamente el mismo proceso que acabamos de discutir. Sin embargo, preparar un texto para una audiencia internacional requiere un poco más de trabajo..


Localización de texto

Cuando se trata de una aplicación multilingüe, las cadenas codificadas deben abstraerse en un conjunto de activos para que NSBundle pueda cargar el idioma correcto en tiempo de ejecución. iOS usa lo que se llama un archivo de cadenas para almacenar las traducciones de todos los literales de cadena en su aplicación. Después de crear este archivo de cadenas, puede localizarlo utilizando el mismo método descrito en la sección anterior.

Cambiemos nuestro método viewDidLoad para mostrar un botón y mostrar un mensaje cuando el usuario lo toque.

 - (void) viewDidLoad [super viewDidLoad]; UIButton * aButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Say Hello" forState: UIControlStateNormal]; aButton.frame = CGRectMake (100.0, 200.0, 120.0, 40.0); [[vista propia] addSubview: aButton]; [aButton addTarget: self action: @selector (sayHello :) forControlEvents: UIControlEventTouchUpInside];  - (void) sayHello: (id) sender NSLog (@ "Hello, World!"); 

Estos métodos tienen dos literales de cadena que tendremos que mover a un archivo de cadenas. Son @"Di hola" y @"¡Hola Mundo!".

Para crear el archivo de cadenas, cree un nuevo archivo y elija Recurso> Archivo de cadenas. Utilizar Localizable.cadenas para el nombre del archivo, que es el archivo de cadena predeterminado que busca iOS.


Figura 108: Creando un archivo de cadenas

El contenido del archivo de cadenas es una lista simple de pares de clave o valor, con el siguiente formato:.

 "Título del botón" = "Diga hola"; "Saludo" = "¡Hola, mundo!";

El lado izquierdo es la clave que utilizará para hacer referencia a la cadena traducida en el código de su aplicación. Las claves son cadenas arbitrarias, pero los desarrolladores suelen usar un nombre semántico que describe cómo se usará la cadena o la frase de destino en su idioma nativo. En nuestro archivo de cadenas, optamos por el primero. Los valores para cada clave siguen un signo igual. Asegúrese de incluir un punto y coma al final de cada línea o sucederán cosas terribles cuando intente ejecutar su aplicación.

Al igual que con los activos de medios, puede acceder a los contenidos de Localizable.cadenas a través de NSBundle. los localizedStringForKey: valor: tabla: método devuelve el valor de una clave de un archivo de cadenas en particular. El argumento de valor le permite especificar un valor de retorno predeterminado si no se encuentra la clave, y el argumento de la tabla determina qué archivo de cadenas usar. Cuando especifica cero para la tabla, el valor predeterminado Localizable.cadenas archivo se utiliza.

Dado que acceder a cadenas traducidas es una tarea tan común, Foundation Framework también proporciona un conveniente NSLocalizedString () macro que puede utilizar como un simple atajo para localizedStringForKey: valor: tabla:. Pasa una cadena vacía para el argumento de valor y nil para el argumento de tabla. Para la mayoría de las aplicaciones, NSLocalizedString () es todo lo que necesitas para acceder a texto localizado.

Entonces, cambiemos la configuración del título de nuestro botón para usar NSLocalizedString ():

 [aButton setTitle: NSLocalizedString (@ "Button Title", nil) para State: UIControlStateNormal]; Si compilas el proyecto, el botón aún debería leer "Diga Hola", pero ahora está cargado desde Localizable.strings. Hagamos lo mismo con el método sayHello: - (void) sayHello: (id) sender NSLog (@ "% @", NSLocalizedString (@ "Greeting", nil)); 

Ahora que nuestras cadenas están cargadas dinámicamente en lugar de estar codificadas, es trivial localizarlas. Usaremos el mismo proceso que con las imágenes. En el Project Navigator, seleccione el archivo Localizable.strings, luego haga clic en Hacer localizado en el panel de Utilidades. Seleccione inglés en el cuadro de diálogo resultante para usar esta versión del archivo para usuarios de habla inglesa.

Para agregar una versión en español, seleccione Localizable.strings nuevamente y seleccione la casilla de verificación junto a Español en la sección Localizaciones.


Figura 109: Agregar una versión en español de Localizable.strings

Al igual que syncfusion-icon.png, deberías poder expandir el Localizable.cadenas archivo en el Project Navigator.


Figura 110: Expandiendo el archivo de cadenas para ver sus localizaciones

Finalmente, agregue algunas traducciones a la versión en español del archivo..

 "Título del botón" = "Dados Hola"; "Saludo" = "Hola, Mundo!";

Puedes probarlo de la misma manera que probamos las imágenes. Navegar a Restablecer contenido y configuración en el simulador, cierre el simulador y realice una compilación limpia desde Xcode. Después de cambiar el idioma a Español, su botón debería leer "Dice Hola" en lugar de "Say Hello", y hacer clic en él debería mostrar "Hola, Mundo!"


Figura 111: Cambiando el idioma del dispositivo a español

Eso es todo lo que hay para localizar cadenas en una aplicación iOS. Una vez más, tener todo el texto traducido en un único archivo totalmente abstraído del código de la aplicación facilita la externalización de sus esfuerzos de localización. Esto es algo muy bueno, ya que la mayoría de los desarrolladores no hablan con fluidez todos los idiomas a los que les gustaría traducir su aplicación a.


Localizando Info.plist

Hay un detalle importante que aún no se ha abordado: localizar el nombre de la aplicación. Si echas un vistazo a la pantalla de inicio en el simulador de iOS, notarás que el título debajo del ícono de tu aplicación no se ha traducido al español. Si ya has pasado por el problema de localizar la cadena dentro de tu aplicación, también deberías tomarte el tiempo para traducir un poco de metadatos..

El nombre de visualización de una aplicación se define en la lista de información bajo la clave CFBundleDisplayName. En lugar de forzarte a traducir valores en la parte principal Internacionalización-Info.plist archivo, iOS le ofrece un archivo de cadena dedicado para sobrescribir ciertas opciones de configuración con valores localizados. En el Archivos de apoyo grupo del Project Navigator, abrir el InfoPlist.strings expediente. Esto es como el Localizable.cadenas El archivo que creamos en la sección anterior, excepto que solo debe proporcionar valores para Info.plist llaves. Agregue lo siguiente a su InfoPlist.strings expediente.

 "CFBundleDisplayName" = "Hola, Mundo!";

Ahora, si reinicia el simulador y realiza una construcción limpia, debería ver un título en español debajo del icono de su aplicación.


Figura 112: Localizando el nombre para mostrar de la aplicación

Resumen

En este capítulo, aprendimos cómo localizar activos de medios, texto y metadatos usando NSBundle. Al abstraer los recursos que necesitan ser localizados en archivos aislados y al referenciarlos indirectamente a través de métodos como pathForResource: ofType:, es posible traducir su aplicación a otro idioma sin tocar una sola línea de código de aplicación. Esta es una característica muy potente de iOS, especialmente teniendo en cuenta la prevalencia internacional de dispositivos iPhone y iPad.

El último capítulo de iOS analiza brevemente el soporte de audio incorporado para aplicaciones iOS. Como mencionamos en capítulos anteriores, los archivos de audio utilizan la misma estructura de paquetes que los archivos de imágenes y cadenas. Sin embargo, en lugar de centrarse en cómo acceder a esos recursos, analizaremos las herramientas de nivel superior para controlar la reproducción de audio.

Esta lección representa un capítulo de iOS sucintamente, un libro electrónico gratuito del equipo en Syncfusion.