
Índice
Para crear web multilingües se pueden combinar tres herramientas gratuitas y de código abierto: un CMS, un sistema de control de versiones y un programa de traducción asistida:
- Grav
- Git
- OmegaT
¿Qué es Grav?
Grav es un CMS de archivo plano y código abierto. CMS significa Content Management System, sistema de gestión de contenidos. Un CMS es un programa instalado en un servidor web que facilita la creación y gestión de webs. Normalmente dispone de una interfaz gráfica de administración, el back end, desde la que se pueden controlar los aspectos visibles de la web, el llamado front end, sin necesidad de escribir código.
Por su parte, la apariencia de la web se controla mediante los llamados temas o plantillas, un conjunto de archivos instalables por separado que cambian el diseño, los colores, la distribución del contenido de la página, etc.
Los CMS más conocidos son WordPress, Joomla, Drupal, pero hay cientos de ellos. Se estima que alrededor de la mitad de todas las webs existentes se basan en un CMS. La mayoría de estos sistemas, como WordPress o Joomla, guarda los contenidos generados por el usuario en una database (normalmente MySQL), mientras que las páginas del sitio se generan mediante archivos PHP. Estos sistemas se denominan CMS basados en una base de datos.
Ventajas de Grav
Al contrario de WordPress, Grav no guarda los cotenidos en una database. De hecho, pertenece a la categoría de CMS que se conoce como flat file, es decir, basada en archivos. El contenido generado por el usuario se guarda como un archivo de texto en formato Markdown (*.md). Markdown es un lenguaje de marcado que facilita la escritura de archivos que luego serán convertidos a HTML u otros formatos. hablamos de ello en profundidad en otro artículo de este blog, "Qué es Markdown y cómo usarlo". Los archivos Markdown son archivos de texto simple que siguen una sintaxis especial.
Esta característica agiliza enormemente el trabajo de administración y de gestión. Un dato: para hacer una copia de seguridad de un sitio desarrollado con Grav (u otro CMS flat-file) basta con descargar el directorio que contiene el sitio. No es necesario, como en un CMS basado en una base de datos, descargar los archivos por un lado y «volcar» (exportar) la base de datos por el otro.
Otra ventaja, muy importante para nuestro objetivo, es que para localizar la web solo hay que crear los archivos de texto en los distintos idiomas y cambiar unos cuantos ajustes en el archivo de configuración del sistema. En cambio, en un CMS basado en una database, deberíamos intervenir en la estructura de la database o instalar complementos especiales a tal fin (plugin).
En definitiva, Grav es un proyecto open source, es decir, su código es abierto, libremente visible y modificable. Fue votado como «Mejor CMS de código abierto» en 2016 y como «Mejor CMS de archivos planos» en 2017 por CMS Critic. El hecho de no tener que recuperar el contenido de una base de datos es muy rápido, pero también es lo suficientemente versátil y potente como para ser utilizado para la creación de casi cualquier tipo de sitios.
Dispone de una interfaz de administración, pero también puede ejecutar toda la gestión directamente desde la línea de comandos, lo que ofrece a los administradores una ventaja adicional en términos de flexibilidad. En cuanto a sus funciones multilingües, Grav nace ya internacionalizado, es decir, ya está preparado para publicar webs en varios idiomas. Para nosotros, este es un aspecto sustancial y uno de los motivos por el cual lo estudiamos y analizamos.
¿Qué es Git?
Git es un programa para el control de versiones distribuidas.
El control de versiones es un sistema utilizado por los programadores para llevar un registro de los cambios realizados en un archivo o serie de archivos. Estos archivos normalmente pertenecen al código fuente de un programa, pero el sistema puede registrar las modificaciones en cualquier archivo. En nuestro caso, utilizaremos el control de versiones para controlar las modificaciones de los archivos pertenecientes a nuestro sitio, como veremos a continuación.
Sin entrar en detalles, los sistemas de control de versiones pueden ser:
- locales
- centralizados
- distribuidos
Los sistemas de control de versiones centralizados, como CVS o Subversion, tienen un único servidor que contiene todas las versiones de los archivos. Los usuarios descargan («hacen el checkout») archivos del servidor central y luego los vuelven a subir una vez que han terminado de realizar sus cambios («hacen el commit»).
En cambio, en los sistemas de control de versiones distribuidos, como Git, todos los usuarios tienen una copia completa del llamado «repositorio» (es decir, del proyecto completo) en su propio dispositivo.
De esta manera, si el servidor dejara de estar disponible, el usuario podría recuperarlo a partir de la copia que ha realizado. Accede a la documentación oficial de Git para obtener más detalles. De acuerdo con lo que nos interesa, basta con saber que los usuarios de Git pueden trabajar cada uno en su propia «rama» de desarrollo, introducir y registrar cambios, y luego compartir esos cambios o fusionarlos con otros.
Para utilizar Git, hay que instalar el programa en tu dispositivo y, si lo deseas, una interfaz gráfica para mayor comodidad. Viene por default en prácticamente todas las distribuciones de Linux, mientras que para Mac y Windows se instala aparte. También existen servicios online que permiten tener un repository Git en un servidor remoto sin tener que instalar Git en el ordenador. Utilizaremos uno de estos: GitLab.
¿Qué es GitLab?
GitLab es una plataforma web, también de código abierto, para la gestión de los repositorios de Git. Ofrece diversas funciones en función del tipo de suscripción. En su versión gratuita ofrece proyectos privados y colaborativos ilimitados, pero con un número de operaciones limitado a 2000 (expresadas como minutos de CI pipeline por grupo al mes).
Para utilizar GitLab es necesario estar registrado en el sitio y crear uno o más proyectos en la interfaz online.
¿Qué es OmegaT?
OmegaT es un programa de traducción asistida de código abierto. Un programa de traducción asistida, o CAT tool, es un programa informático, compuesto por varios módulos, que guarda los textos originales y sus respectivas traducciones en una base de datos (llamada «memoria de traducción») y que, al mismo tiempo, proporciona al usuario-traductor diversas herramientas integradas para facilitar la actividad de traducción (glosarios, diccionarios, corrector ortográfico, etc.)
Ya hemos hablado de OmegaT en repetidas ocasiones en esta web, por lo que remitimos al lector a las diversas presentaciones sobre el tema que podrá encontrar en nuestro canal de YouTube.
Una de las particularidades de OmegaT es que puede leer archivos en numerosos formatos, incluyendo archivos de markdown (*.md) y archivos de texto simple (*.txt).
Otra particularidad es que puede leer un proyecto guardado en un repository Git, y permite que varios traductores lo modifiquen. Esta función, llamada «proyecto de trabajo en grupo», reemplaza eficazmente el uso de un sistema especial de memoria de traducción centralizada. Ya hemos explicado en otro tutorial cómo crear un proyecto compartido con OmegaT y Subversion. El procedimiento con Git es prácticamente el mismo.
Cómo unir los sistemas entre ellos
Grav, Git y OmegaT se pueden unir entre sí. Para los casos en los que no se detalle el procedimiento, recomendamos leerlo en la documentación oficial de cada programa.
Damos por descontado que ya estás utilizando Grav en la creación y administración de un sitio. En caso contrario, la clara documentación del sistema explica cómo descargarlo, instalarlo y configurarlo.
En Grav es necesario instalar un plugin que te permita sincronizar bidireccionalmente toda tu web con un repositorio Git. Este plugin se llama Git Sync.
«Bidireccionalmente» significa que los cambios realizados por un usuario en el repositorio de Git se reflejarán en la web y, a la inversa, cualquier cambio realizado desde dentro de Grav se propagará en el repositorio.
Varios autores podrán, de esta manera, colaborar en los textos del sitio, tanto en modo compartido, es decir, entrando en el back-end de Grav, como interviniendo directamente los archivos de texto y sincronizándolos luego con Git.
Por cuestiones de comodidad, creamos el repository Git principal en GitLab, para seguir todo el proceso sin siquiera preocuparnos por descargar Git de manera local. Las instrucciones precisas para ccrear un repository se encuentran aqui: https://docs.gitlab.com/ee/user/project/repository/.
Ten en cuenta: si hay que traducir un sitio en más de un idioma, existen dos posibilildades: o crear un repository distinto para cada idioma target, es decir, uno por cada proyecto de OmegaT, o crear un único repository con subcarpetas que tendrán los distintos proyectos de OmegaT, o sea, una subcarpeta por idioma. Se recomienda crear un repo para cada idioma.
Si hipotéticamente quisieramos crear un sitio en tres idiomas: italiano (lengua de origen o L1), español (lengua de llegada, L2) e inglés (lengua de llegada, L3). Decidimos utilizar la primera opción, es decir, crear tres repository distintos:
- un repository Git que tendrá la estructura del sitio en la lengua original (L1)
- un repositorio Git para el proyecto de traducción de OmegaT de L1 a L2,
- un repository Git para el proyecto de traducción de OmegaT de L1 a L3.
La sincronización entre el repository 1 y el sitio se hace a través del plugin Git Sync, cada vez que se hace clic en el icono de sincronización
La sincronización entre el repository 2 y los respectivos proyectos locales de OmegaT, tendrán lugar en el momento en el que OmegaT se vincule al repository por primera vez y todas las veces que se guarde (tambien automáticamente) e proyecto de traducción por parte de uno de los traductores involucrados (si hubiera más de uno). Lo mismo para el repository 3.
Puedes guardar los archivos traducidos con OmegaT dentro del repositorio 1 de dos maneras:
- seleccionando el comando «Commit target files» en OmegaT, lo que genera los archivos de destino y los envía al repositorio, o
- copiando los archivos de destino del proyecto local al servidor web a través de un FTP.
Cómo configurar OmegaT
El flujo de trabajo de las traducciones se gestiona con OmegaT.
Un proyecto común de OmegaT se constituye de una serie de carpetas:
dictionary
glossary
omegat
source
target
tm
así como de un archivo omegat.project
que contiene las especificaciones del proyecto.
Para empezar, vamos a crear un nuevo proyecto localmente, en nuestro ordenador, haciendo clic en Proyecto > Nuevo, y eligiendo el par de idiomas que necesitamos (en nuestro ejemplo, del italiano al español). Recuerda marcar la casilla que establece las reglas de segmentación como específicas del proyecto, para evitar diferencias de segmentación entre los distintos traductores que participan en el proyecto. De la misma forma, desmarca la casilla que hace que las opciones de filtro de archivos sean específicas del proyecto.
El procedimiento habitual es copiar los archivos a traducir en la carpeta /source/
del proyecto. Una vez traducidos, se crean los archivos de destino en la carpeta /target/
.
Sin embargo, en nuestro caso, los archivos a traducir corresponden a los archivos *.md contenidos en la carpeta user/pages/
de la web creada con Grav. Para evitar el paso intermedio de copiar dichos archivos y volver a cargar los archivos traducidos online, utiliza la función «mapeo» de las carpetas del proyecto. Gracias a esta función de OmegaT, no es necesario que todas las carpetas estén dentro de la carpeta principal del proyecto. Es posible configurar OmegaT de forma que cada una de las carpetas de proyecto sea redirigida a una carpeta de otro repository siempre que sea igualmente accesible.
A continuación, indica a OmegaT que utilice la carpeta user/pages/
como carpeta de origen para los archivos que se van a traducir. Los archivos traducidos, que se crearán localmente en la carpeta /target/
, también se copiarán/sincronizarán en esa carpeta. Esto es necesario para que funcione el mecanismo multilingüe de Grav, que requiere que los contenidos de los distintos idiomas (los archivos *.md) estén todos presentes en la misma carpeta.
Por ejemplo, para tener una página de inicio en los 3 idiomas mencionados anteriormente, necesitas tener home.it.md
, home.es.md
y home.en.md
dentro de la carpeta 01.home
.
A propósito del filtro de archivos: OmegaT puede traducir archivos en formato Markdown. Sin embargo, este filtro, que forma parte del plugin de Okapi para OmegaT, está todavía en fase beta de desarrollo. Uno de los defectos actuales es que no respeta los espacios en blanco al principio de la línea al generar los archivos traducidos, que son tan inutilizables en Grav Mientras esperamos que este problema se solucione por los desarrolladores del plugin Okapi, aconsejamos utilizar el fultro para archivos de texto simple (Text).
La mayor parte de las opciones de la cabecera deben dejarse intactas, pero dependiendo del tema y de las opciones que elijas puede haber cadenas que deban ser localizadas en la cabecera también. El filtro de archivos Markdown detecta algunas, pero puede no detectarlas todas.
Advertencia Si se usa el filtro para archivos de texto:
- aparecerán como traducibles tanto la cabecera de los archivos como el cuerpo del texto de los archivos Markdown;
- hay que prestar especial atención a la sintaxis, por ejemplo, a los superíndices que encierran los valores de las cadenas. La ausencia de un superíndice puede impedir la renderización de todo el archivo.
En la ventana Project Specific File Filters, haz clic en Text y luego en Options… Selecciona la opción que segmenta el texto de origen en correspondencia a los saltos de línea (line breaks).
A continuación, se debe indicar a OmegaT que guarde los archivos traducidos con un nombre diferente del original, siguiendo la sintaxis con el sufijo del idioma de destino. Como indicamos, luego de que los archivos traducidos se guarden en la misma carpeta que contiene los orifinales, es necesario renomobrarlos por dos motivos:
- no quieres que se sobrescriban los originales,
- como se ha visto anteriormente, la presencia de los archivos de los diferentes idiomas en la misma carpeta es un requisito previo para el buen funcionamiento de la web multilingüe.
Para tal fin, en las configuraciones del proyecto, haz clic en File Filters…, y elige el filtro Text, luego clic en Edit… En el cuadro de diálogo que se abre, añade el patrón *.it.md
y ${nameOnly-0}.es.md
en la casilla Translated Filename Pattern. nameOnly-0
es el código que le dice a OmegaT que tome solo la parte del nombre de archivo excluyendo el sufijo y la extensión. En caso de que se esté traduciendo a otro idioma, deberás cambiar el código ISO del idioma.
Añadir el patrón *.it.md
hará que OmegaT ignore los archivos contenidos en el directorio de origen que estén en un idioma distinto al original (italiano en nuestro caso).
En las propiedades del proyecto, es necesario hacer clic en Repository Mapping y agregar en la primer tabla la dirección de todos los repository que se van a utilizar, es decir la URL del proyecto/repository 1 creado en GitLab y por ende el de todos los repository que contendran los proyectos de OmegaT.
En la parte inferior de la misma pantalla, escribe el mapeo de las carpetas:
- la carpeta
source
= a la carpetauser/pages
del repositorio 1, - la carpeta
target
= a la carpetauser/pages
del repositorio 1.
La carpeta user/pages
de Grav es la que contiene las carpetas y archivos correspondientes a las páginas de una web.
Para evitar cargar en la lista de archivos a traducir las imágenes y los PDF presentes en el sitio, es necesario configurar un filtro en la configuración del proyecto compartido, excluyendo todos los archivos con extensión jpg, gif, png y pdf. También es posible escribir una regex que le diga a OmegaT que ignore cualquier otra cosa que no sea .md, pero por simplicidad decidimos hacer explícitos los archivos para excluir uno por tipo.
Prueba con recargar el proyecto y controla que funcione la sincronización con los repository establecidos.
Llegados a este punto, es necesario «hacer el commit» del proyecto local a un proyecto compartido a través de Git, utilizando el comando Git correspondiente.
En el caso de GitLab, el procedimiento puede realizarse por terminal, si utilizas un sistema operativo en el que Git está instalado, o puedes utilizar la interfaz web de GitLab, que sin embargo no te permite cargar carpetas, sino solo archivos.
La forma mas sencilla es crear manualmente las carpetas de un proyecto de OmegaT, es decir:
glossary
omegat
source
tm
y cargar el archivo omegat.project
en el nivel raíz del proyecto (debe cargarse el archivo omegat.project del proyecto creado localmente).
Con esta configuración, todos los traductores que trabajen en el proyecto podrán descargar localmente el proyecto de traducción correspondiente a su idioma, traducir los archivos y finalmente generar los archivos de destino, que se guardarán en la misma carpeta establecida como fuente, pero con el sufijo del idioma de destino.
Como decíamos, llegados a este punto solo queda guardar todos los archivos traducidos en el servidor web para que aparezcan online junto al resto de la web. Esto se hace con «Commit target files» o mediante un FTP.
Además de esto, hay algunos arreglos necesarios que deben hacerse dentro de Grav. Todos ellos se explican en el capítulo Multi-language de la documentación oficial, por lo que no nos detendremos en ellos aquí.
Es especialmente importante añadir la opción «slug» dentro de cada página. Esta opción indica a Grav cómo tiene que ser traducida la URL de una página. Utilizando el mismo ejemplo de la documentación, si el sitio tuviera la siguiente estructura:
- 01.Animales
- 01.Mamíferos
- 01.Murciélagos
- 02.Osos
- 03.Zorros
- 04.Gatos
- 02.Reptiles
- 03.Aves
- 04.Insectos
tendríamos por ejemplo una URL como http://dominio.com/animales/mamiferos/osos
. Al momento de traducir el sitio en español, resulta útil que además la URL aparezca en español. Para hacerlo, basta con añadir la opción «slug:» seguida de la traducción (sin caracteres especiales). Por ejemplo:
---
title: Mamíferos
slug: mamiferos
---
Siguiendo este criterio, la URL en español tendrá un aspecto como este: http://dominio.com/animales/mamiferos/osos
.
Gracias al procedimiento que se explica brevemente en este artículo es posible no solo traducir un nuevo sitio, sino también traducir todas las actualizaciones que se introducen en el sitio mismo. Simplemente configura las notificaciones (automáticas o no) que se recibirán cada vez que los autores añadan o editen contenido en el idioma de origen y luego traduzcan los nuevos textos.
Por complejo que parezca, el proceso es mucho más fácil de realizar que de explicar. Una vez configurado para un primer sitio, los pasos son los mismos para todos los demás. Para un gestor de proyectos, un propietario de una pequeña empresa e incluso para el propietario de una agencia de traducción como nosotros, la combinación de Grav, GitLab y OmegaT realmente abre un abanico de oportunidades para gestionar la creciente demanda de desarrollo de sitios multilingües con más flexibilidad y eficacia.
La web en la que estás navegando es el mejor ejemplo de la estrategia descrita en este artículo: está íntegramente construida con Grav y ha sido traducido a 3 idiomas utilizando OmegaT y Git.
Para cualquier duda o pregunta, la sección de comentarios a continuación está abierta a todo el mundo. Si deseas internacionalizar tu página web o traducirla a otro idioma, puedes reservar una sesión de asesoramiento gratuita sin compromiso.
