Traducción · 5 min read · Jan 20, 2026
Gettext Para Sitios Web Estáticos
Gettext Para Sitios Web Estáticos
Aquí está cómo implementé un sistema de gestión de traducciones para un sitio web estático, utilizando GNU gettext. Para los impacientes, lo he destilado en 11 instrucciones al final.
Objetivo
Este sistema permite la traducción bloque por bloque (cadena por cadena), lo cual es mejor que página por página porque:
- Los cambios en partes no traducidas se aplicarán a todas las traducciones automáticamente (formato, etiquetas, imágenes, tal vez fechas, nombres, enlaces, etc.).
- Al almacenar los bloques de texto de todas las páginas juntos, los bloques repetidos solo tendrán que ser traducidos una vez (texto del menú, avisos de copyright, encabezados, etc.).
- No te perderás cuando el original cambie mientras la traducción aún está en progreso.
- Cuando cambias un párrafo en el original, es más fácil ver qué partes de las traducciones necesitan ser actualizadas.
Para tal sistema, los pasos abstractos son:
- De alguna manera, marca cada bloque de texto traducible en tu página web. Las partes no traducibles se convertirán en un marco compartido.
- Extrae los bloques en una base de datos. Traduce.
- Encuentra o escribe algún software para fusionar los bloques de nuevo en el marco para rehacer la página web original, pero con la opción de tomar los bloques de texto de la base de datos en inglés o de una de las versiones traducidas de la base de datos.
Gettext parecía una posibilidad obvia, y todo está funcionando perfectamente ahora, pero me tomó ocho horas. La dificultad fue que la documentación existente está orientada a usar gettext para programas informáticos, no para sitios web o documentos. Ahí fue cuando me di cuenta de que debía documentar lo que hice:
Lo que hice
Comencé convirtiendo mínimamente mi página web en un programa informático. Esto involucró cinco pasos:
- Escribe un pequeño programa que imprima algún texto (una cadena) en un archivo.
- Copia la página web en el programa en lugar de la cadena.
- Inserta algunos fragmentos de código estándar requeridos por gettext.
- Divide la cadena en cadenas más pequeñas, separando las traducibles de las no traducibles.
- Marca las cadenas traducibles con la etiqueta de gettext (el formato de las etiquetas depende de qué lenguaje de programación uses, pero generalmente es algo que involucra un guion bajo _).
Gettext funciona con muchos lenguajes de programación, así que elige el que prefieras de los ejemplos que vienen con el paquete. En mi computadora, estos están en esta carpeta:
/usr/share/doc/gettext-doc/examples/
La elección del lenguaje no es importante. El código será muy simple.
Aquí está mi index.html original:
Cow
See also: FSFE
De los lenguajes de programación soportados, elijo Scheme (un dialecto de Lisp). A primera vista, el código a continuación parece complejo, pero solo tendrás que modificar los primeros y terceros fragmentos. El primer fragmento define tres variables que deberían ser autoexplicativas. Todo el texto de la página web está en el tercer fragmento. Está dividido en bloques y he puesto etiquetas gettext para Scheme (_ ) alrededor de los bloques traducibles. Aquí está, generate-index.scm:
#!/usr/bin/guile -s
!#
(define output-filename "index.html")
(define project-name "ciarans-website")
(define build-directory "/home/ciaran/website-build/")
(use-modules (ice-9 format))
(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))
(textdomain project-name)
(bindtextdomain project-name build-directory)
(define _ gettext)
(define page-text (string-append
"\n"
(_ "Cow")
" \n\n\n"
(_ "See also: ")
""
(_ "FSFE")
"
\n"
"\n\n"))
(define the-file (open-file output-filename "w"))
(display page-text the-file)
Tres de las ocho cadenas están marcadas como traducibles. Las otras cinco son parte del marco compartido que será el mismo sin importar qué versión de idioma de la página se esté generando.
Recuerda reemplazar cualquier comilla en tu HTML con comilla invertida ( \”), y agregar algunos saltos de línea ( \n) para hacer la salida legible. Esas son las secuencias de comillas y de nueva línea para Scheme. Son las mismas en algunos otros lenguajes, pero son diferentes en otros.
Antes de continuar, debes establecer la variable “build-directory” al directorio donde se encuentra generate-index.scm. Si no lo haces, todo parecerá funcionar pero tu programa nunca accederá a las cadenas traducidas.
Hecho esto, extraes las cadenas traducibles con estos dos comandos:
$ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm$ mv ciarans-website.po ciarans-website.pot
Y luego puedes crear un archivo (un archivo “po”) para traducciones al francés con este comando:
$ msginit --locale=fr
Una parte del manual de gettext dice que “msginit” es opcional - que puedes hacerlo manualmente en su lugar, pero esto no funcionó para mí en absoluto. Pasé dos horas diagnosticando ese problema. Usa msginit.
Esto crea fr.po que puedes editar con cualquier editor de texto. Habrá una línea en la parte superior como esta:
"Content-Type: text/plain; charset=UTF-8\n"
Si tu charset es “ASCII”, probablemente deberías cambiarlo a UTF-8. Si tu charset es algo más y recibes mensajes de error de otras herramientas de gettext (como msgmerge) sobre caracteres inválidos, entonces cambiar el charset a UTF-8 también podría ser la respuesta. También habrá un campo para content-transfer-encoding. El manual dice que eso siempre debería ser “8bit”.
Emacs es particularmente bueno para editar archivos po porque tiene un modo de edición especial para ellos.
Y luego tienes que convertir tu archivo po en el formato especial mo y ponerlo en el subdirectorio donde gettext espera que esté con estos dos comandos:
$ mkdir -p fr/LC_MESSAGES$ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po
Haz que el archivo Scheme sea ejecutable, ¡y eso es todo!
ciaran@hide:~/tests/simple-page$ LANGUAGE=fr ./generate-index.scm; cat index.html
Vache
Voir aussi : La FSFE
ciaran@hide:~/tests/simple-page$ LANGUAGE=en ./generate-index.scm; cat index.html
Cow
See also: FSFE
ciaran@hide:~/tests/simple-page$
Ok, así que ahí tienes tu prueba de concepto. A continuación, tengo que convertir mi sitio a este sistema y mantenerlo (usando msgmerge). Intentaré mantener notas para publicar aquí.
Las instrucciones
- Haz un archivo vacío generate-index.scm
- Copia mi generate-index.scm (arriba) en tu archivo
- Ajusta el build-directory (3ra variable definida) en generate-index.scm para apuntar al directorio donde se encuentra tu generate-index.scm
$ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm$ mv ciarans-website.po ciarans-website.pot$ msginit --locale=fr- edita fr.po para agregar traducciones de las tres cadenas de texto
$ mkdir -p fr/LC_MESSAGES$ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po$ chmod +x generate-index.scm$ LANGUAGE=fr ./generate-index.scm; cat index.html
–
Ciaran O’Riordan, ( RSS)
Apoya el software libre: Únete a la Fellowship de FSFE
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.