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).
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.
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).