View Single Post
 
Old 03-08-2010, 09:32 PM
miliuco miliuco is offline
 
Join Date: Jul 2009
Location: Spain
Posts: 62
Localización (traducción) de aplicaciones en OSX

Nota: este artículo se refiere a programas realizados en Cocoa (forma nativa de programar en Mac OS X empleando Objective-C) para Snow Leopard, utilizando como entorno de programación XCode Tools 3 de Apple (se puede conseguir gratuitamente desde Apple Developer Connection y desde el DVD de instalación de Mac OS X).

Se emplea el término localización (to localize) para referirse a la traducción de una aplicación a diferentes idiomas. Por defecto, las aplicaciones para Mac se realizan en inglés que es el idioma base del sistema operativo (que como sabéis está localizado=traducido a múltiples idiomas).
Se puede localizar una aplicación de varias maneras pero hay conocimientos básicos generales que es recomendable anotar.

APLICACIONES EN MAC OS X

Los programas en Mac OS X se presentan como archivos únicos aunque en realidad son carpetas de archivos con estructura básica común a todos ellos. Si se pulsa con el botón derecho del ratón sobre una aplicación aparece entre otros el menú “Mostrar contenido del paquete” que nos muestra el interior de la carpeta.

Suele haber una carpeta inicial Contents de cuyo interior nos interesa la carpeta Resources que es la que contiene los archivos de idioma. Hay una carpeta por cada idioma al que se ha traducido la aplicación, el nombre de esas carpetas consta de una primera parte con el nombre del idioma (puede ser el nombre completo en inglés como por ejemplo English o Spanish o abreviaturas estándar de 2 caracteres como En para inglés o Es para español o añadiendo la consideración regional Es_ES para español de España o Es_AR para español de Argentina) seguido de “.lproj”.

En los ejemplos comentados los nombres de las carpetas de idioma serían:

- English.lproj / Spanish.lproj
- En.lproj / Es.lproj
- En.lproj / Es_ES.lproj / Es_AR.lproj.

Dentro de cada una de esas carpetas están los archivos que se han traducido (localizado) a cada idioma. De ellos nos interesan sobre todo Localizable.strings y MainMenu.nib o MainMenu.xib.

Nota: en Mac OS X Tiger y Leopard las aplicaciones con carpetas de español llamadas Spanish.lproj o Es.lproj o Es_ES.lproj (Es_AR, Es_MX, etc.) arrancan bien en español al detectarlo como idioma base del sistema operativo, sin embargo Snow Leopard parece tener preferencia por Spanish.lproj como nombre de carpeta y en ocasiones las aplicaciones traducidas arrancan en inglés si la carpeta de español no se llama así (a pesar de que, en Snow Leopard, Apple propone la notación universal de 2 caracteres como referencia de país o regionalización).

ARCHIVOS DE TRADUCCIÓN

Los archivos con extensión .strings contienen equivalencias de cadenas de texto entre 2 idiomas. Por defecto suele haber un sólo archivo Localizable.strings en cada aplicación en el que están las cadenas en inglés. El archivo Localizable.strings inglés presenta un formato similar a éste:

"Load Settings..." = "Load Settings...";
"Save Settings..." = "Save Settings...";
"Preferences..." = "Preferences...";

Se trata de pares de cadenas equivalentes que por defecto aparecen ambas en inglés para que desarrollemos una traducción de la segunda parte de cada par de manera que se obtenga un archivo Localizable.strings localizado con este formato:

"Load Settings..." = "Cargar Configuración...";
"Save Settings..." = "Guardar Configuración...";
"Preferences..." = "Preferencias...";

El archivo Localizable.strings localizado estará en la carpeta correspondiente a su idioma para que Mac OS X lo lea desde ahí y aplique el texto traducido donde detecta la presencia del texto original.
Los archivos .strings se pueden leer desde cualquier editor de texto, han de tener codificación UTF8 y pueden tener comentarios incluidos entre los caracteres /* ... */.

Traducir cadenas en el editor de texto básico puede ser muy laborioso, sobre todo en caso de archivos con varios cientos de cadenas, y no siempre tendremos el archivo .strings localizado para nuestro idioma sino que tendremos que generarlo desde los archivos en inglés de la aplicación, por ello en este artículo se proponen varias formas de generar, traducir e incluir archivos .strings.

Es obligado que las cadenas de texto que pueden aparecer y ser utilizadas en un archivo Localizable.strings han de ser objetos de programación en Cocoa del tipo NSLocalizedString, si se trata de cadenas simples (objetos NSString) no funciona la traducción.

ARCHIVOS DE INTERFAZ DE USUARIO

Los archivos .nib o .xib son la interfaz del programa (ventanas, cuadros de texto, diálogos, botones...). Pueden ser modificados desde el programa Interface Builder (componente fundamental de XCode). En la fase de diseño se utilizan archivos .nib o .xib (éstos en versiones más recientes de XCode), en la aplicación compilada se utilizan archivos .nib.

El que contiene la ventana principal y el menú principal del programa se llama MainMenu y como mínimo habrá uno correspondiente al idioma inglés. Para localizar (traducir) la interfaz del programa habrá que crear otro archivo MainMenu (.nib o .xib) en la carpeta del idioma en cuestión.

El archivo Localizable.strings contiene pares de cadenas de texto que estén presentes en los diferentes elementos de la interfaz de usuario y que sean del tipo NSLocalizedString. Cuando arranca la aplicación, Mac OS X substituye el texto original en inglés por su equivalente en español con las condiciones ya comentadas de que sea del tipo NSLocalizedString y que esté presente en Localizable.strings.

Nota: los archivos.nib o .xib pueden estar compilados cuando forman parte de las aplicaciones (desde XCode se refiere a ellos como “flattened compiled NIB file” o “stripped NIB file”).

Esta sería una iniciación muy básica al tema que nos ocupa, a continuación iremos haciendo un ejercicio sencillo de traducción de un programa simple en inglés al castellano para comentar cada paso.

PROYECTO HELLO WORLD

Se parte de un proyecto muy sencillo de aplicación básica creada originalmente en inglés. Su interfaz consiste en una sola ventana que muestra un mensaje al pulsar un botón:



El proyecto HelloWorld.xcodeproj inicial consta de un único archivo de interfaz MainMenu.xib sin opciones de localización y carece de archivo Localizable.strings.
Para traducir este programa seguiremos estos pasos:

1. Generar un archivo Localizable.strings en el que se vuelquen las cadenas que contiene MainMenu.xib
2. Que los archivos MainMenu.xib y Localizable.strings adquieran la propiedad localizable creando un nuevo idioma para la aplicación (Spanish)
3. Traducir al español cada una de las cadenas en inglés que existen en Localizable.strings
4. Traducir alguna otra cadena no presente en Localizable.strings
5. Probar la plicación, si todo ha ido bien debe arrancar en español al detectar que es el idioma del sistema operativo.

Localizable.strings

Hay varias formas de generar este archivo e incluso hay programas específicos para esta tarea, para cumplir la restricción de usar solamente software del DVD de Mac OS X comentaré 2:

1. La herramienta de línea de comandos ibtool (se instala junto con XCode) es capaz de extraer cadenas y también de integrar las cadenas traducidas dentro de archivos .nib. Su uso es bastante simple:

ibtool --generate-strings-file MainMenu.strings MainMenu.xib

genera un archivo MainMenu.strings con las cadenas de texto de MainMenu.xib.

El archivo .strings generado se puede abrir con los editores de texto habituales y tiene un formato similar a éste:

/* Class = "NSMenuItem"; title = "About HelloWorld"; ObjectID = "58"; */
"58.title" = "About NewApplication";
/* Class = "NSMenuItem"; title = "Open..."; ObjectID = "72"; */
"72.title" = "Open...";
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "73"; */
"73.title" = "Close";
/* Class = "NSMenuItem"; title = "Save"; ObjectID = "75"; */
"75.title" = "Save";

Su esquema es una sucesión de cadenas de texto (en inglés por ahora) con un comentario que refiere al tipo del objeto junto con su nombre e identificador.

2. Desde XCode: al hacer doble clic en MainMenu.xib se abre InterfaceBuilder >> seleccionamos con el ratón la ventana principal (Window) >> menú Tools / Strings >> se muestra una ventana con la lista de cadenas encontradas:

Dentro de esta ventana Strings seleccionamos todos los valores >> copiar >> pegar en cualquier editor de texto donde aparecerán con el mismo formato que en el caso de ibtool >> guardar el documento como texto plano y codificación UTF8 con el nombre MainMenu.strings.

De cualquiera de las 2 maneras se obtiene un archivo .strings cuyo nombre puede ser cambiado a Localizable.strings para guardarlo en la carpeta raíz del proyecto y agregarlo al proyecto desde el menú contextual de XCode sobre el nombre del proyecto >> Add >> Existing files >> configurando el diálogo que aparece igual que en la segunda imagen de las 2 que vienen a continuación:





Localizar MainMenu.xib y Localizable.strings

En XCode >> botón derecho sobre cada uno de los archivos >> Get Info >> Make File Localizable >> Add Localization >> escribir Spanish como nombre de idioma >> Add >> cerrar Get Info.
El nombre de los archivos se cambia automáticamente a Localizable.strings (English) / Localizable.strings (Spanish) y MainMenu.xib (English) / MainMenu.xib (Spanish).
Además se ha creado automáticamente en la raíz del proyecto una nueva carpeta llamada Spanish con los 2 archivos para el idioma español.

Traducir cadenas de texto

Abrimos con un editor de texto Localizable.strings de la carpeta Spanish y traducimos todas las cadenas como en este ejemplo teniendo cuidado de que la longitud de las cadenas no sea mucho más larga en la traducción para que encajen bien en cajas de texto, cuadros de diálogo, botones y demás elementos de la interfaz:

/* Class = "NSMenuItem"; title = "About NewApplication"; ObjectID = "58"; */
"58.title" = "Acerca de HelloWorld";
/* Class = "NSMenuItem"; title = "Open..."; ObjectID = "72"; */
"72.title" = "Abrir...";
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "73"; */
"73.title" = "Cerrar";
/* Class = "NSMenuItem"; title = "Save"; ObjectID = "75"; */
"75.title" = "Guardar";

Después hay que integrar las cadenas traducidas para que ventanas y menús queden bien traducidos. Se puede hacer con la herramienta ibtool de esta forma:

- primero se crea una copia del archivo MainMenu.xib (Spanish) (la copia puede llamarse de cualquier manera, en este ejemplo le llamaré MainMenu2.xib)

- después se usa ibtool

ibtool --strings-file Localizable.strings --write MainMenu.xib MainMenu2.xib

substituye cadenas desde Localizable.strings en el archivo MainMenu2.xib con el resultado final MainMenu.xib. Se obtiene un archivo MainMenu.xib cuyos textos serán presentados al usuario en castellano de acuerdo a nuestra traducción.
La sorpresa surge cuando probamos el programa y vemos que el texto que se muestra al pulsar el botón sigue apareciendo en inglés:



Cadenas de texto que no están en Localizable.strings

Si buscamos Hello, world!!! en Localizable.strings no lo encontraremos, por éso no está traducido todavía. La explicación es que ese texto se genera por código en el momento de la ejecución por lo que en la fase de diseño no existe en MainMenu.xib.

Esto sucede con frecuencia en los programas habituales que serán mucho más complejos que este HelloWorld tan sencillo. Hay que buscar Hello, world!!! en los archivos del proyecto, en alguno de ellos aparecerá como cadena de texto.

En este ejemplo es fácil ver que se encuentra en el archivo Foo.m en que se lee:

- (IBAction)sayHello:(id)sender
{
NSString *message; message = @"Hello, world!!!";
[textField setStringValue:message];
}

Lo que quiere decir que la acción enviada por el botón Dime Hola es una cadena NSString con el literal "Hello, world!!!" cuyo valor se pasa al campo de texto para que sea mostrado.

Se nombró como condición requerida para que una cadena pueda ser localizada (traducida) que su tipo fuese NSLocalizedString pero aquí se trata del tipo NSString que no es localizable. Hemos de cambiar un tipo por otro pero NSLocalizedString tiene un formato que hay que respetar:

NSLocalizedString(@"cadena original en inglés", @"comentario");

En este ejemplo concreto quedaría así (el comentario puede ser otro texto diferente a éste):

NSLocalizedString(@"Hello, world!!!", @"Hello");

Y la instrucción completa quedaría de esta forma:

- (IBAction)sayHello:(id)sender
{
NSString *message; message = NSLocalizedString(@"Hello, world!!!", @"Hello");
[textField setStringValue:message];
}

No es en Foo.m donde traduciremos el texto, este archivo lo dejamos tal cual, es en Localizable.strings (Spanish) (puede ser al principio o al final o en cualquier otro punto) donde añadiremos la cadena original y la traducida de esta forma tan simple:

Texto original entre comillas + signo igual + texto traducido entre comillas + punto y coma.

Localizable.strings quedaría así:

"Hello, world!!!" = "¡¡¡Hola, mundo!!!";
/* Class = "NSMenuItem"; title = "About NewApplication"; ObjectID = "58"; */
"58.title" = "Acerca de HelloWorld";
/* Class = "NSMenuItem"; title = "Open..."; ObjectID = "72"; */
"72.title" = "Abrir...";
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "73"; */
"73.title" = "Cerrar";
/* Class = "NSMenuItem"; title = "Save"; ObjectID = "75"; */
"75.title" = "Guardar";

Si ahora probamos la aplicación vemos que el texto se genera como deseamos:



Comentario final

Esta sería una forma muy resumida de iniciarse en la traducción de aplicaciones en Mac OS X.
Por la organización general de las aplicaciones como paquetes con una estructura común según un estándar parece un proceso sencillo de comprender aunque para llevarlo a cabo en programas de más entidad hace falta tiempo y dedicación, piensa que muchos programas tienen varios archivos de interfaz y miles de cadenas de texto aptas para ser traducidas.
Si la aplicación que deseas traducir viene con los archivos .nib compilados y no se te proporciona el código fuente no será posible su traducción ya que no podrás abrir esos archivos ni extraer cadenas desde ellos.

Como nota final, respeta siempre los acuerdos de licencia en este aspecto, si el programa es freeware podrás traducirlo sin problemas, en caso contrario conviene contactar con el programador y ofrecerle la ayuda para la traducción. Mi experiencia es que la mayoría de ellos lo agradecen enormemente. De esta forma podemos ir extendiendo el español en el mundo informático.

Como esta es una tarea que me gusta bastante, he colaborado en la traducción de varios programas, algunos de ellos software libre como Sparkle.framework, VideoMonkey, BatchMod, Burn, FileUtilsCM, RCDefaultApp o Xee pero también algunos de tipo comercial como VisualHub, RarMachine, etc.
Así que ¡anímate! y traduce aplicaciones al castellano.

Autor: Emilio Pérez Egido (miliuco).

Enlaces:

- código fuente del ejercicio como proyecto de XCode 3 http://www.miliuco.es/tiger/localize/hellococoa.zip

- texto completo del artículo en PDF http://www.miliuco.es/tiger/localize/leame.pdf

10.7.1 / Gigabyte P55-USB3 / i5 750 / 9800gt / http://miliuco.es

Last edited by miliuco; 03-14-2010 at 12:23 PM.
Reply With Quote