Tutoriales

Cómo traducir (localizar) una app en iOS con Xcode

Aprende a cómo llevar tu app a cualquier país de la forma más sencilla

Resumen del artículo
  • Hoy os enseñamos cómo funciona el flujo de traducción de una app a otros idiomas en Xcode, lo que se conoce como localización. Un proceso simple tanto para UIKit como SwiftUI.

Al fin te has decidido ha realizar tu primera aplicación para alguno de los sistemas de Apple. Llevas varios meses utilizando Xcode, escribiendo código, configurando las vistas y probando como un loco los cómo queda tu aplicación. Pero llegado el momento del lanzamiento te das cuenta de que los textos sólo están en un idioma. ¿Cómo puedes añadir más idiomas y no sufrir demasiado en el intento? A continuación la respuesta.

Añade los idiomas que quieres soportar

Lo primero y más importante, es decidir los idiomas que vas a soportar. La idea es que mientras más mejor, pero el proceso de traducción lleva tiempo y obviamente el conocimiento de cada idioma. Hoy veremos cómo hacerlo de manera que interrumpa lo menos posible nuestra labor de programación, evitando duplicar esfuerzos. Pero no debemos olvidar que para la versión final de nuestra aplicación necesitamos que todos los textos que se muestran en la interfaz estén traducidos.

Es posible que en determinadas circunstancias sea necesario implementar mecanismos adicionales a los que vamos a ver aquí, o quizás buscar otro enfoque, pero nuestras recomendaciones base son las siguientes:

  • Los textos por defecto deberán ir en inglés: Si te has lanzado al mundo del desarrollo seguramente tengas un nivel suficiente para que los usuarios anglosajones puedan entenderte. Además, el idioma de desarrollo por defecto en Xcode es el inglés y simplifica mucho las cosas que para tu aplicación también.
  • Añade al menos una variante de español: Como lector de Apple Coding suponemos te desenvuelvas bien en este idioma, y aunque al igual que ocurre con el inglés y con otras lenguas, hay muchas variaciones idiomáticas, te animamos a soportar al menos una variante de tu propio idioma.
  • Los textos que lleguen del servidor deberían estar ya traducidos No vamos a hacer el trabajo dos veces, si tu aplicación hace uso de servicios de backend debes solicitar a los encargados que te envíen los textos ya traducidos al idioma correspondiente. Por norma general, pedirán que le envíes una variable con el idioma configurado en la aplicación para las peticiones que realices.

Respecto a éste último punto, puedes conocer el idioma configurado en la aplicación en cualquier momento ejecutando:

Locale.current.languageCode // en
Locale.current.identifier // en_US

El primero nos indica el idioma y el segundo añade también la región y la variación. Por ejemplo el español puede ser de España (es_ES), de Chile (es_CL)… Si únicamente tenemos una variante pero no la que el usuario tiene configurada, se utilizará igualmente si el idioma coincide.

Las variaciones idiomáticas permiten distinguir los cambios en palabras y expresiones entre el mismo idioma cuando se habla en regiones diferentes.

Aunque es posible hacerlo, no recomendamos ni por usabilidad de cara al usuario ni por complejidad a la hora de implementarlo, permitir cambiar el idioma dentro de la propia aplicación. Es decir, la aplicación utilizará el idioma que esté configurado en el terminal. Aunque desde iOS 13 es posible cambiar el idioma de cada aplicación desde el menú de Ajustes.

Una vez tengamos claros los idiomas a soportar, seleccionamos en la columna izquierda de la venta de Xcode 11 la jerarquía de archivos y pulsamos sobre el raíz del proyecto. Luego escogemos el proyecto en la lista, la pestaña Info y en la sección Localizations vemos Base e EnglishDevelopment Language. Pulsamos + para añadir el que queremos.

Selecciona los idiomas que quieres añadir. La base de todo es que los archivos que pueden traducirse, pasarán a tener una variante para cada uno de los idiomas. Pueden ser storyboards, imágenes, archivos específicos de traducción…

Traduciendo textos

Textos del Storyboard

Dentro de Xcode existen dos métodos para introducir textos que se mostrarán en la interfaz: interfaz y código. Además existe un lenguaje Base para las interfaces que si se utiliza y no se tiene ningún fichero de traducción específico para un idioma en concreto, se usarán los textos del Base. Si tu usuario es hindú, y no tienes el hindi soportado, cogerá por defecto el idioma Base.

Para las interfaces hay dos manera de trabajar, bien con un Storyboard por cada idioma o un Storyboard para el idioma principal o para el Base, y luego archivos de texto plano para los textos que contenga la interfaz. Fijémonos por ejemplo en LaunchScreen. En la columna del navegador de archivo ha aparecido una flecha porque tenemos el archivo con traducciones.

LaunchScreen

La recomendación es usar el Base o el idioma por defecto para la parte interfaz y dejar los demás como archivos de texto. Estos archivos podríamos modificarlos a mano cada vez que añadimos algún texto nuevo pero ¡no!… si sigues leyendo te enseñamos cómo hacerlo de la forma adecuada.

Traduciendo String en el código

Internacionalizar los textos de nuestro código es tremendamente sencillo, y más si lo tenemos en cuenta desde el inicio del desarrollo. Simplemente hay que usar la función NSLocalizedString cada vez que vayamos asignar un String a cualquier elemento de nuestra interfaz y el sistema se encargará de mostrar el texto en el idioma correcto.

NSLocalizedString("aviso_error", comment: "Aviso mostrado cuando se produce un error")

Los parámetros enviados a la función son los siguientes:

  • key: es la clave que se utiliza modo de identificador de la cadena de texto a traducir
  • comment: comentario para el traductor en el que puede incluso añadirse contexto para facilitar su tarea

El archivo que utiliza el sistema para conocer la equivalencia de cada idioma es Localizable.strings y también se desplegará en el navegador de archivos para que tengamos uno por cada idioma. El contenido del mismo tendrá las claves que hemos comentado anteriormente y el texto correspondiente para cada idioma:

"aviso_error" = "Error";

Mucho cuidado con la manipulación de este archivo porque el compilador no revisa el formato pero, sin embargo, no compila cuando este es erróneo. No lo busques en el proyecto porque es necesario añadirlo de forma manual, al igual que se añade cualquier archivo al proyecto, pero más tarde veremos cómo hacerlo de forma mucho más sencilla.

Aunque es posible manipular los ficheros de traducción a mano, es mucho mejor dejar que Xcode lo haga por tí.

Textos especiales

Existen algunos textos especiales, como pueden ser el nombre de la aplicación, el texto personalizado al pedir permisos de cámara, localización, notificaciones… que también son susceptibles de traducción. El formato es igual que el anterior pero el archivo con los textos en este caso será InfoPlist.strings. Este fichero contiene las claves que asigna Apple a cada tipo de texto. Al igual que el anterior, vamos a esperar a que Xcode lo genere y gestione de forma automática.

Realizar la traducción

Llegó la hora de la verdad. A continuación vamos a exportar los textos para su traducción. Manteniendo seleccionado el proyecto pulsamos el menú Editor > Export for Localization… y le indicamos la ruta donde guardará los archivos. La división dentro de la carpeta contendrá un .xcloc para cada idioma.

Abrimos el que vayamos a modificar, navegamos a la carpeta Localized Contents y ahí estará el fichero que nos importa con extensión .xliff. Al abrirlo con un editor de texto veremos que es un XML bastante complicado, por eso recomendamos utilizar alguna aplicación como XLIFFTool.

En la primera sección se muestra la traducción del nombre de nuestra aplicación (mediante el archivo InfoPlist.strings) y en segundo lugar el texto que hemos añadido por código para Localizable.string. Para cada uno de ellos se muestra el comentario de ayuda que se utiliza para dar contexto a la traducción. Si hubiese algún Storyboard también aparecería como otra sección.

Después de rellenar los textos, tenemos que importar los archivos de nuevo a Xcode. Con el proyecto seleccionado como antes, accedemos al menú Editor > Import Localizations… y escogemos los .xcloc de cada idioma. Nos saldrá un asistente indicado los cambios que se aplicarán y tras aceptar ya tendremos nuestros textos traducidos.

Hemos hecho hincapié en que la forma más sencilla es permitir que Xcode realice este trabajo y manipule los archivos exportando e importando ya que nos evitaremos olvidos y problemas de formato en las traducciones.

Plurales

Esta parte es sin duda la más complicada del proceso. Cuando queremos añadir un plural, éste depende de una variable que tenemos que añadir a la función que realiza la traducción. Podemos hacerlo de la siguiente forma:

let elementos = 2
String.localizedStringWithFormat(NSLocalizedString("%d elemento(s)", comment: ""), elementos)

Si ejecutamos la exportación se añadiría como texto normal pero Xcode a la hora de traducir, antes de los .strings busca los .stringsdict. Este último tenemos que crearlo a mano, elegimos File > New > File…, seleccionamos Stringsdict File y lo nombramos como Localizable.

Antes de seguir, en el panel de la derecha donde se muestran los atributos del archivo pulsamos el botón Localize… y seleccionamos los idiomas que queremos que tenga para añadir los idiomas que soporta el archivo. Si lo abrimos veremos la siguiente estructura.

Vamos a ver lo que representa cada valor:

  • Localized String Key es el valor que utilizamos como clave. Si está presente, no se buscará la traducción en el .strings si no en este archivo. Cambiamos dicha clave a %d elemento(s).
  • Localized Format Key es el formato que vamos a usar como variable. Eliminamos el valor actual y ponemos %#@elementos@.
  • VARIABLE este es el valor variable que hemos añadido en el campo anterior pero sin el formateo: elementos.
  • NSStringFormatValueTypeKey es el tipo de valor, que en nuestro caso es un número por lo que colocamos el valor d.
  • one, other… aquí pondremos el texto sabiendo que la cantidad se sustituirá por %d. En nuestro caso si son 0 o muchos el texto estará en plural pero vemos que es posible cambiar el literal cuando son dos, muchos, pocos…

Ahora si ejecutamos veremos que para muestra el singular o el plural según el número de elementos indicados en el valor de la variable elementos.

También en SwiftUI

Seguro que te está preguntando qué pasa con la traducción de las interfaces en SwiftUI. Si reproducimos los pasos descritos, lo primero que nos llama la atención es que no tenemos Storyboards pero si que tenemos las View que definen la interfaz en la aplicación. Se podría pensar que con utilizar NSLocalizedString directamente en las vistas podríamos realizar la traducción pero Apple ha simplificado el procedimiento.

Simplemente con usar Text() o el texto de un Button() donde el parámetro sea de tipo StringProtocol, Xcode añadirá a nuestros archivos de traducción los textos de la interfaz.

Esperamos que este pequeño tutorial ayude en lo posible a simplificar el proceso de las traducciones o que te permita lanzar esa aplicación en la que llevas trabajando meses con soporte para varios idiomas. Para mal o para bien este es el método propuesto por Apple y por su plataforma Xcode y os hemos contado la mejor forma de usarlo. Un saludo y Good Apple Coding.

Etiquetas

Arturo Rivas

Líder técnico especializado en mobile. Analista y desarrollador software. Apasionado de la tecnología, el deporte y la música.

Artículos relacionados

Botón volver arriba
Cerrar
Cerrar