2.4. i18n

eBox utiliza “gettext”, la plataforma de internacionalización (i18n) del proyecto GNU, para permitir a los colaboradores traducir fácilmente el interfaz gráfico de eBox a su propio idioma.

Esta sección describe la i18n de eBox tanto desde el punto de vista del desarrollador (reglas que deben seguirse para desarrollar un módulo traducible) como del traductor (cómo realizar una traducción de eBox a su idioma).

2.4.1. i18n para desarrolladores

Cada módulo de eBox tiene su propio dominio de texto para las cadenas que contiene, con un nombre construido a partir del nombre del propio módulo. Los módulos deben indicar tanto en el constructor del módulo como en cada uno de los CGI's el dominio de texto al que pertenecen, tal y como se indica en Sección 3.1.1 y Ejemplo 5.7.

Todos los ficheros que contengan cadenas traducibles, incluyendo las plantillas de Mason, deben incluir módulo perl EBox::Gettext y cualquier cadena que deba poder ser traducible debe ser marcada como tal, utilizando la función __ tal y como se indica en el siguiente ejemplo:

print __("Hello world");
			

Esto hará que el sistema de compilación de eBox sea capaz de detectar las cadenas traducibles y recopilarlas para su posterior traducción.

Si la cadena debe incluir alguna variable no hay que concatenarla

print __("Edit ") . $group . __(" members"); #incorrecto
			

ya que esto hace imposible una traducción correcta de la frase completa. La opción correcta es utilizar la función __x, una variante de la función __ que permite incluir variables:

print __x("Edit {group} members", group => $group); #correcto
			

de tal modo que el traductor puede incluir la variable group en el lugar apropiado de la frase.

Si quieres marcar una cadena como traducible pero decidiendo no traducirla, deberías usar la función __n. Un ejemplo de uso es el siguiente:

Ejemplo 2.7. Usando la función __n

my $options = [__n('Foo'), __n('Bar'), __n('Foobaz') ]; # As many as you want
print __($options[$index]);
			  

El ejemplo mostrado antes da la oportunidad al traductor de traducir únicamente la opción elegida dejando a las demás posibles opciones (normalmente un alto número) sin una traducción.

Si se siguen correctamente estas reglas, el sistema de compilación de eBox generará automáticamente los ficheros PO de los módulos conteniendo todas las cadenas incluidas en los mismos. Estos ficheros podrán ser traducidos comodamente por los traductores, como se explica en la siguiente subsección.

2.4.2. i18n para traductores

Al utilizar GNU gettext como plataforma de i18n, eBox utiliza el formato más utilizado para la traducción, los ficheros PO. Cada módulo de eBox cuenta con un fichero PO para cada uno de los idiomas disponibles. Un traductor sólo tiene que traducir las cadenas catalogadas en ese fichero para traducir completamente un módulo. En el caso de que se desee empezar la traducción para un nuevo idioma sólo es necesario solicitar un fichero PO para el nuevo idioma.

Un fichero PO para un determinado idioma contiene cadenas de texto en el idioma original (inglés) junto a su traducción. Cada cadena puede encontrarse en tres posibles estados: traducida (si existe una traducción para la cadena), difusa o borrosa (si existe una traducción para la cadena, pero la cadena ha cambiado ligeramente) o sin traducir:

# cadena traducida
msgid "Name"
msgstr "Nombre"

# cadena borrosa
#, fuzzy
msgid "Interfaces"
msgstr "Interface"

#cadena sin traducir
msgid "External"
msgstr ""
			

Si la cadena a traducir necesita incluir el valor de una variable al ser presentada en la interfaz de usuario, encontrará en el fichero PO una entrada similar a ésta:

msgid "Edit {group} members"
			

En este caso simplemente se debe reescribir la frase recolocando el nombre de la variable (entre llaves) en el lugar necesario, pero sin ser traducido. La traducción correcta de la cadena en este caso sería:

msgstr "Editar miembros de {group}"
			

Aunque es posible realizar la traducción del fichero PO utilizando cualquier editor capaz de editar ficheros utilizando codificación UTF-8, es muy recomendable usar alguna de las herramientas creadas específicamente para la traducción de ficheros PO, como por ejemplo KBabel (*nix) o poEdit (multiplataforma).