Xcode: Localizar o Internacionalizar tu App


Una vez has desarrollado tu aplicación toca internacionalizarla. Excepto algunas aplicaciones que tocan temas muy locales, si desarrollas tu aplicación sólo en español estás perdiendo un montón de usuarios potenciales de habla inglesa (o que más o menos se defienden con el inglés). De igual forma si tu aplicación está sólo en inglés hay un gran público de habla hispano que estás marginando (y si estás leyendo este blog es porque hablas español).

El mecanismo en Xcode ha ido cambiando con cada versión y aquí voy a explicar como se hace en la versión 4.6. Para otras versiones supongo que casi o todo de lo siguiente se puede aplicar:
  1. Haciendo clic en el proyecto, buscas la sección "Localizations" en el formulario que aparece. Tienes que añadir los idiomas que vaya a soportar tu aplicación (por ejemplo inglés y español).



  2. Añades al proyecto un nuevo archivo de recursos de tipo Strings y lo llamas Localizable.strings


  3. Seleccionas el nuevo archivo y normalmente en el lado derecho, bajo la descripción del archivo, aparece la opción Localizar. Lo localizamos y añadimos los idiomas de inglés y español (o los que hayamos añadido en el paso 1).



  4. Lo que Xcode realmente hace es crear dos carpetas (en.lproj y es.lproj para inglés y español respectivamente) donde crea dos versiones diferentes del archivo Localizable.strings. Luego en tiempo de ejecución detecta el idioma en el que el usuario tiene configurado su dispositivo y carga la correcta.
  5. Abrimos uno de los dos archivos y el formato que hay que seguir para añadir traducciones es: "Key" = "Value"; es decir una clave entre comillas dobles, símbolo igual, y el valor (normalmente la traducción) también entre comillas, ah ¡y no olvidar el punto y coma al final!


  6. Hay bastante discusión sobre las buenas prácticas a la hora de añadir traducciones, yo suelo ver tres formas:
    1. "Valor por defecto en inglés" = "Valor por defecto en el idioma local"; (p.ej. "Hello" = "Hola";).
    2. "Clave descriptiva" = "Valor por defecto en el idioma local"; (p.ej. en la pantalla ficticia llamada "ayuda", tenemos un botón de contacto: "ayuda_boton_contacto" = "Contactar";).
    3. Una mezcla de las dos anteriores. Por ejemplo lo que yo suelo hacer es usar el primer método para palabras y expresiones muy comunes en mi aplicación (nombre de la aplicación, diálogos de error o botones como aceptar o cancelar...).
  7. Por último y para utilizar todo esto, nada más fácil que usar el método NSLocalizedString(NSString *key, NSString *comment) que devuelve un NSString. key es la clave y comment es un comentario para uso de desarrollo que a veces tiene sentido usarlo y otras simplemente lo podéis poner a nil. Por ejemplo NSLocalizedString(@"Hello", nil) devolvería @"Hola" según el ejemplo del punto anterior si el usuario tuviera ajustado su móvil a español.
Hasta aquí lo básico que es localizar texto. Sin embargo podéis localizar cualquier otro recurso, por ejemplo gráficos, audio... siguiendo el mismo procedimiento. De esta forma podéis mostrar imágenes o reproducir sonidos diferentes según el idioma del usuario.
No sólo los recursos, sino también los Storyboards y los XIBs. Por lo que el ejemplo anterior ("ayuda_boton_contacto") puede que no tenga demasiado sentido ya que podéis poner diferentes textos al botón según la versión del Storyboard.

Y luego hay ciertos "hacks" que pueden resultar muy útiles en el caso del archivo Localizable.strings. Consisten en utilizarlos no para traducciones de texto, si no para cambiar el funcionamiento de la aplicación según el idioma:

  • Por ejemplo, en el caso de que si la aplicación se ejecuta en español os queréis conectar al servidor A y en el caso de inglés al servidor B podríais añadir una clave "server" donde en el archivo localizado en español tenga como valor A y en el otro valor B.