[[PageOutline(2-5,Índice)]] = Traducción de mensajes usando GNU gettext = [https://www.gnu.org/software/gettext/ GNU gettext] es un conjunto de herramientas que permite una fácil traducción a varios idiomas los mensajes que se muestran al usuario. Se recomienda empezar a utilizar GNU gettext para estandarizar el proceso de internacionalización de OpenGnsys, el cual deberá estar instalado tanto en el servidor principal como en la máquina que vaya a utilizarse para el desarrollo del proyecto. Aunque GNU gettext está diseñado inicialmente para que los mensajes originales se redacten en inglés, permite usar cualquier otro idioma como base, por lo tanto __OpenGnsys utilizará el castellano como idioma original para los mensajes de texto__. GNU gettext utiliza 3 tipos de ficheros: * {{{.pot}}}: plantilla de mensajes. * {{{.po}}}: ficheros de traducción. * {{{.mo}}}: ficheros de traducción compilados. == Configuración == La siguiente table muestra los parámetros básicos de configuración de GNU gettext. ||= Componente =||= Programado en =||= Dominio =||= Directorio =|| ||Browser del cliente||C++||{{{browser}}}||{{{/opt/opengnsys/lib/locale}}} (cliente)|| ||Motor de clonación||BASH||{{{engine}}}||{{{/opt/opengnsys/lib/locale}}} (cliente)|| ||Scripts del servidor||BASH||{{{server}}}||{{{/opt/opengnsys/lib/locale}}} (servidor)|| Para localizar el fichero de traducción, cada componente debe incluir en la configuración de gettext el dominio de texto y el directorio de idiomas. El camino completo del fichero será: ''{{{DirectorioIdiomas/xx}}}''{{{/LC_MESSAGES/}}}''{{{Dominio}}}''{{{.mo}}}, siendo ''{{{xx}}}'' las siglas del idioma ({{{ca}}} para catalán, {{{en}}} para inglés o {{{es}}} para castellano). == Preparar el código fuente == Los programas deben modificarse para que gettext pueda localizar las cadenas que debe traducir, según el lenguaje de programación utilizado. === C o C++ === Modificaciones a incluir en un programa C/C++: * Zona de inclusión de código: {{{#!c #include }}} * Inicio de la función principal {{{main}}}: {{{#!c setlocale (LC_ALL, ""); bindtextdomain ("Dominio", "DirectorioIdiomas"); textdomain ("Dominio"); }}} * Indicar las cadenas que van a ser traducidas, sustituyendo ''{{{Cadena}}}'' por {{{gettext(}}}''{{{Cadena}}}''{{{)}}}, teniendo en cuenta que cada cadena debe estar bien formateada (como se usa en la función {{{printf}}}). * Pueden tratarse simultáneamente frases en singular y en plural, indicando 2 parámetros en la llamada a la función {{{gettext}}}, siendo el 1º de ellos la frase en singular y el 2º en plural. Por ejemplo: {{{gettext("%d fichero", "%d ficheros")}}} === BASH === Es recomendable incluir un fichero auxiliar con la configuración de GNU gettext y que sea llamado desde cada script usando el comando {{{source}}}. Script de configuración de Gettext: * Definir las variables: {{{#!sh TEXTDOMAIN="Dominio" TEXTDOMAINDIR=DirectorioIdiomas }}} * Definir una función {{{__}}} con la llamada a {{{gettext}}}, incluyendo: {{{#!sh STRING=$1; shift printf "$(gettext "$TEXTDOMAIN" "$STRING")" $@ }}} Modificaciones a incluir en un script BASH: * Incluir la función de configuración (se recomienda usar el fichero {{{locale.sh}}} en el directorio de librerías): {{{#!sh source CaminoScriptConfiguraciónGettext }}} * Indicar las cadenas que van a ser traducidas, sustituyendo ''{{{Cadena}}}'' por la función de traducción {{{$(__ "}}}''{{{Cadena}}}''" ''{{{Parámetros}}}''{{{)}}}, teniendo en cuenta que la cadena y los parámetros deben estar bien formateados (como se usan en el comando {{{printf}}}). === PHP === ''(pendiente)'' == Crear fichero de plantilla == Una vez preparado el código fuente para el uso de Gettext, debe generarse el fichero maestro de cadenas (por defecto, {{{messages.pot}}}), ejecutando: * C o C++: {{{#!sh xgettext -C --from-cod=utf-8 FicherosCódigo -o PlantillaCadenas.pot }}} * BASH: {{{#!sh xgettext -L Shell -k__ --from-cod=utf-8 FicherosScripts -o PlantillaCadenas.pot }}} * PHP: ''(pendiente)'' == Traducción == Editar manualmente los ficheros de traducción y realizar las modificaciones necesarias para incluir la traducción de los mensajes, teniendo en cuenta que las líneas marcadas con {{{msgid}}} incluyen las cadenas originales y las que tienen {{{msgstr}}} son las que deben mosificarse para realizar la traducción. Por ejemmplo, ||= Fichero original =||= Fichero modificado =|| {{{#!td {{{#!c #: ../src/main.cpp:20 msgid "Uso: %s -qws http://sitioweb.com/\n" msgstr "" }}} }}} {{{#!td {{{#!c #: ../src/main.cpp:20 msgid "Uso: %s -qws http://sitioweb.com/\n" msgstr "Usage: %s -qws http://website.com/\n" }}} }}} == Actualizar fichero de traducción == Tras realizar modificaciones de código y volver a generar un nuevo fichero de cadenas, debe ejecutarse el siguiente comando para actualizar cada fichero de traducción: {{{ msgmerge -U Fichero.po Plantilla.pot }}} == Generar fichero compilado == Para generar cada fichero compilado a partir de los ficheros de texto traducidos, ejecutar: {{{#!sh msgfmt Fichero.po -o Fichero.mo }}} Cada fichero compilado debe copiarse al directorio de idiomas del dominio con el siguiente nombre ''{{{DirectorioDominio}}}''{{{/}}}''{{{Idioma}}}''{{{/LC_MESSAGES/}}}''{{{Dominio}}}''.mo. Por ejemplo, el fichero compilado con la traducción al inglés de los mensaje del Browser del cliente deberá localizarse en {{{/opt/opengnsys/lib/locale/en/MESSAGES/browser.mo}}}