Contents
Internacionalizar bloques de WordPress con @wordpress/i18n (JS) — tutorial completo
Este artículo detalla paso a paso cómo internacionalizar un bloque de Gutenberg usando la librería @wordpress/i18n (JavaScript). Se cubrirán las buenas prácticas, ejemplos de código (editor y PHP de registro), extracción y generación de ficheros de traducción, registro de traducciones para scripts y consejos de resolución de problemas.
Por qué y cómo funciona la internacionalización en bloques
WordPress permite traducir cadenas de texto tanto en PHP como en JavaScript. Para bloques modernos (escritos en ESNext/JSX) se recomienda usar @wordpress/i18n, que exporta funciones equivalentes a las de PHP (por ejemplo __(), _x(), _n(), _nx(), sprintf()). El flujo general es:
- Marcar cadenas en el código JS con las funciones de i18n.
- Extraer esas cadenas a un archivo .pot/.po usando herramientas (WP‑CLI u otras).
- Generar los ficheros de traducción en formato JSON destinados a JS (o .mo para PHP).
- Registrar/poner a disposición esas traducciones en WordPress con wp_set_script_translations o mediante la metadata del bloque y register_block_type.
Funciones clave en @wordpress/i18n
- __() — traducción simple: __(Hello, text-domain)
- _x() — traducción con contexto: _x(Post, noun, text-domain)
- _n() — pluralización: _n(One item, %d items, count, text-domain)
- _nx() — pluralización con contexto.
- sprintf() — formatea cadenas traducidas con placeholders.
Estructura recomendada de archivos
Ejemplo de estructura mínima de un plugin con bloque:
- my-plugin/
- block.json
- src/
- edit.js
- save.js
- build/
- index.js
- index.asset.php
- languages/
- my-plugin-es_ES.json (o PO/MO según flujo)
- my-plugin.php (archivo principal del plugin)
Paso 1 — Marcar cadenas en JavaScript
Importa las funciones desde @wordpress/i18n y úsalas en tu componente. Usa comentarios para traductores cuando sea necesario.
import { __, _n, _x, sprintf } from @wordpress/i18n import { useBlockProps } from @wordpress/block-editor export default function Edit( { attributes, setAttributes } ) { const count = attributes.count 0 // Texto simple const title = __( Saludo, my-plugin ) / translators: Nombre del usuario que aparece en el saludo / const greeting = sprintf( __( Hola %s, my-plugin ), attributes.name Invitado ) // Pluralización const items = sprintf( _n( %d elemento, %d elementos, count, my-plugin ), count ) return () }{ title }
{ greeting }
{ items }
Paso 2 — Añadir comentarios para traductores
Cuando una cadena necesita contexto o información adicional para el traductor, añade un comentario justo encima:
/ translators: Esto aparece cuando no hay elementos en la lista / const emptyText = __( No hay elementos, my-plugin )
Paso 3 — block.json y registro del bloque
Declara el bloque en block.json, incluyendo la referencia a editorScript y el textdomain (recomendado para claridad).
{ apiVersion: 2, name: my-plugin/hello, title: Bloque Hola, category: widgets, textdomain: my-plugin, editorScript: file:./build/index.js }
Paso 4 — Registro en PHP y carga de traducciones JS
Registra el script del editor (habitualmente generado por build) y usa wp_set_script_translations para indicar la ubicación de las traducciones JSON/PO. El handle que pases debe coincidir con el handle del script registrado.
Paso 5 — Generar POT / PO / JSON
Ejemplo con WP‑CLI para extraer cadenas y generar JSON para las traducciones JS:
- Generar POT (archivo base):
wp i18n make-pot . languages/my-plugin.pot --exclude=node_modules,build
- Crear archivos PO para cada idioma (puedes usar Poedit o herramientas CLI):
msginit --input=languages/my-plugin.pot --locale=es_ES --output-file=languages/my-plugin-es_ES.po
- Convertir PO a JSON para uso en JavaScript (WordPress dispone de comando make-json):
wp i18n make-json languages languages --domain=my-plugin
Esto generará archivos JSON en languages/ como my-plugin-es_ES.json que WordPress usará con wp_set_script_translations.
Notas sobre la generación de JSON
- El archivo JSON generado contiene las cadenas traducidas en un formato que wp.i18n puede usar en el navegador.
- Si usas herramientas de empaquetado (webpack/@wordpress/scripts), asegúrate de que las rutas de source maps y build no interfieran con la extracción.
Usar wp.i18n global como alternativa
Si tu script no está usando bundler o importaciones ES, puedes usar el global wp.i18n proporcionado por WordPress. Ejemplo:
const { __ } = wp.i18n function render() { return document.createElement(div).appendChild( document.createTextNode( __(Hola mundo, my-plugin) ) ) }
Plurales, contexto y sprintf — ejemplos prácticos
import { __, _n, _x, sprintf } from @wordpress/i18n // Contexto para la palabra Post (sustantivo o verbo) const postNoun = _x( Post, noun, my-plugin ) const postVerb = _x( Post, verb, my-plugin ) // Pluralización const count = 3 const items = sprintf( _n( %d comentario, %d comentarios, count, my-plugin ), count )
Problemas comunes y cómo resolverlos
- No se traducen las cadenas JS: comprueba que el handle pasado a wp_set_script_translations coincide exactamente con el handle del script registrado y que el textdomain es el correcto.
- Ficheros JSON no encontrados: asegúrate de que los JSON están en la carpeta indicada (por ejemplo languages/) y que tienen el nombre correcto (my-plugin-es_ES.json).
- Cadenas extraídas incompletas: verifica que las cadenas en JS están marcadas con funciones de @wordpress/i18n y que la extracción excluye los ficheros build/ si no quieres duplicados.
- Caché de navegador: a veces hace falta limpiar cache o forzar recarga para ver cambios en JSON en el navegador.
- Contexto y comentarios a traductores: siempre añade / translators: … / justo encima de la llamada cuando el significado puede no ser obvio.
Buenas prácticas
- Usa el mismo textdomain en todo el plugin/tema mantenlo en block.json y en las llamadas a __().
- Registra las traducciones con wp_set_script_translations para los scripts que contienen cadenas JS.
- Incluye comentarios para traductores cuando sea necesario y usa _x() para casos de palabras polisémicas.
- Automatiza la extracción y generación de JSON en tu pipeline de CI o scripts NPM.
- Para bloques que muestran texto generado por PHP, también marca las cadenas en PHP con __() y genera PO/MO.
Ejemplo completo resumido
Resumen mínimo de los pasos: marcar cadenas en src/edit.js con __(), construir (wp-scripts build), extraer POT, crear PO, generar JSON, colocar JSON en languages/, usar wp_set_script_translations en PHP y registrar el bloque.
Ejemplo de comando de build y extracción (flujo típico)
# 1. Build JS (con @wordpress/scripts o tu bundler) npm run build # 2. Extraer POT wp i18n make-pot . languages/my-plugin.pot --exclude=node_modules,build # 3. Traducir/editar PO (ej. con Poedit) # 4. Generar JSON para JS wp i18n make-json languages languages --domain=my-plugin
Con todo esto en su sitio, los bloques mostrarán sus cadenas traducidas tanto en el editor como en el front-end (si los scripts están registrados y las traducciones cargadas).
Conclusión
Internacionalizar bloques con @wordpress/i18n es directo: marca las cadenas en JS, extrae y convierte las traducciones a JSON y registra esas traducciones con wp_set_script_translations. Mantén consistente el textdomain, usa comentarios para traductores cuando haga falta y automatiza la extracción/generación para evitar errores manuales. Siguiendo este flujo lograrás que tus bloques sean traducibles y accesibles en cualquier idioma soportado por WordPress.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |