Como internacionalizar bloques con @wordpress/i18n (JS) en WordPress

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:

  1. Generar POT (archivo base):
wp i18n make-pot . languages/my-plugin.pot --exclude=node_modules,build
  1. 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
  1. 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 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *