Proporcionar traducciones de la interfaz de Drupal 8 para módulos custom

Tengo la sensación de que cuando buscas en internet sobre este problema las respuestas no son muy claras así he compilado aquí los pasos que sigo para conseguirlo.

 

Cuando escribo “traducciones de la interfaz” me refiero a esas cadenas que se escriben siempre en inglés (incluso cuando el sitio que desarrollamos no tiene el inglés activado), están generalmente envueltas por la función t(), usan el filtro trans de twig, o son parte de una definición YAML como por ejemplo module_name.links.menu.yml. Para traducir configuración el proceso es bastante distinto.

 

La página principal de información acerca de este tema es la documentación de la API Drupal y sus comentarios pero a medida que aparecen nuevas versiones de Drupal estos se van hundiendo entre las diferentes versiones menores que van saliendo.

 

Vamos a hacer un ejemplo con dos cadenas que tenemos en nuestro código envueltas por la función t().

 

t(‘My custom string’)

 

t(‘Every last Thursday of the month at 20:00 in @location’)

 

El primer paso es añadir dos líneas a nuestro fichero example_event.info.yml de esta manera:

 

name: Example event
type: module
description: Functionality related with the date the event happens
package: Custom
core: 8.x

'interface translation project': example_event
'interface translation server pattern': 'modules/custom/example_event/translations/%language.po'

 

Así le decimos a Drupal que mire en el directorio de traducciones de este módulo por un fichero que se llame “es.po” o cualquiera que sea el idioma al que queremos traducir.

 

Los ficheros .po están el formato gettext que tiene esta pinta:

 

msgid ""
msgstr ""
"Project-Id-Version: Example event\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

msgid "My custom string"
msgstr "Mi cadena personalizada"

msgid "Every last Thursday of the month at 20:00 in @location"
msgstr "Todos los últimos jueves de mes en @location a las 20:00"
 

 

Ahora ya podemos incluir este fichero en nuestro control de versiones para llevar un seguimiento de los cambios.

 

Las traducciones de Drupal están en la base de datos y no en ficheros esto hace que necesitamos los dos siguiente comandos para actualizarla.

 

drush locale-check

 

Para comprobar si hay nuevas traducciones (se comprobarán también otros módulos contrib).

 

drush locale-update

 

Para guardar en la base de datos las traducciones basandose en los ficheros .po.

 

Puedes añadir estos dos comandos a tu despliegue y/o integración continua para tener la interfaz traducida.

 

Esto está probado en Drupal 8.5.x aunque creo que nunca desaparecerá la compatibilidad.

 

Para poder leer tu código en busca de cadenas traducibles en vez de crear tus ficheros .po a mano puedes usar el módulo potx. El módulo potx es para Drupal 7 pero hay una versión muy parcheada para poder ejecutar en tu misma instalación.

 

Esto es todo lo necesario para traducir cadenas desde ficheros .po. En general cre que el proceso se podría cambiar para necesitar menos código, por ejemplo: cualquier directorio “translations” debería ser descubierto automáticamente por drupal para añadir traducciones.

Hay casos abiertos sobre este tema si quieres dar alguna idea.