Internacionalización de WordPress: cómo traducir temas y plugins de WordPress

Conozca todos los pasos para internacionalizar su tema o plugin de WordPress para que esté listo para traducirse a cualquier idioma.

Esta guía es para desarrolladores que escriben el código. Si ya tiene un archivo POT o PO y solo necesita traducirlo, puede hacerlo en 3 sencillos pasos con PTC.

¿Qué es la internacionalización de WordPress?

La internacionalización (i18n) es el proceso de preparar su código para que pueda ser traducido. No es el proceso de traducción en sí. La localización (l10n) es el paso siguiente, donde las cadenas se traducen realmente a idiomas específicos.

Para los temas y plugins de WordPress, la i18n significa:

  • Envolver todas las cadenas orientadas al usuario en funciones gettext para que WordPress pueda intercambiarlas
  • Definir un dominio de texto que vincule sus traducciones a su proyecto
  • Generar un archivo POT a partir del cual puedan trabajar los traductores (o PTC)

Una vez hecho esto, tendrá todo lo necesario para producir archivos PO, MO y JSON traducidos para cualquier idioma.

Preparación de su tema o plugin de WordPress para la traducción

Antes de poder traducir nada, debe configurar su código correctamente. Esto significa definir un dominio de texto, envolver todas las cadenas orientadas al usuario en funciones gettext y generar un archivo POT.

Nada de esto es complicado, pero los detalles importan. Un dominio de texto que no coincida o una cadena sin envolver significan que ese texto nunca aparecerá en su versión traducida.

Paso 1

Defina su dominio de texto y la ruta del dominio

Cada tema o plugin necesita un dominio de texto. Es un identificador único que indica a WordPress qué archivos de traducción pertenecen a su proyecto, y debe coincidir exactamente con el slug de su plugin o tema.

Declárelo en la cabecera del archivo principal de su plugin:

/**
 * Plugin Name: My Plugin
 * Text Domain: my-plugin
 * Domain Path: /languages
 */

O en el style.css de su tema:

/*
Theme Name: My Theme
Text Domain: my-theme
Domain Path: /languages
*/

La ruta del dominio indica a WordPress dónde residen sus archivos de traducción en relación con la raíz del plugin o tema. El directorio /languages es el estándar.

Paso 2

Envuelva sus cadenas de PHP en funciones Gettext

Cualquier cadena que desee hacer traducible debe estar envuelta en una de las funciones gettext de WordPress. En tiempo de ejecución, estas funciones buscan la traducción correcta y recurren a la cadena original si no se encuentra ninguna traducción.

Cadenas básicas

Utilice __() cuando necesite devolver una cadena. Para la salida HTML (que es casi siempre el caso), utilice las variantes con escape:

// Return a translated string
$label = __( 'Settings', 'my-plugin' );

// Echo a translated string, escaped for HTML
echo esc_html__( 'Settings saved.', 'my-plugin' );

Los estándares de codificación de WordPress recomiendan echo esc_html__() en lugar de _e() porque hace que el escape de salida sea explícito. Es una buena práctica aplicarla de forma consistente.

Cadenas con variables

Si concatenas una variable directamente en una cadena, los traductores solo ven los fragmentos, no la frase completa. Eso hace imposible traducir correctamente, especialmente en idiomas donde el orden de las palabras es diferente. En su lugar, usa printf() o sprintf() con un placeholder, y añade un comentario para traductores para que sepan qué representa %s:

printf(
    /* translators: %s: the user's display name */
    esc_html__( 'Welcome back, %s.', 'my-plugin' ),
    esc_html( $display_name )
);

Formas plurales

En inglés, los plurales son simples: one comment, two comments. Otros idiomas no son tan sencillos. Algunos tienen múltiples formas plurales según el número. Usa _n() para gestionar esto correctamente independientemente del idioma al que se traduzca tu plugin:

printf(
    esc_html( _n(
        '%s comment',
        '%s comments',
        $count,
        'my-plugin'
    ) ),
    number_format_i18n( $count )
);

Cadenas que necesitan contexto

Algunas palabras significan cosas diferentes según el lugar donde aparezcan. Utilice _x() para dar a los traductores el contexto que necesitan para realizar la traducción correctamente:

// "Export" as a noun (the file) vs. a verb (the action)
echo esc_html_x( 'Export', 'button label', 'my-plugin' );

Paso 3

Internacionalice sus cadenas de JavaScript

WordPress proporciona el paquete wp-i18n para que pueda utilizar en JavaScript las mismas funciones gettext que utiliza en PHP. Al registrar su script, declare wp-i18n como una dependencia:

wp_register_script(
    'my-plugin-script',
    plugins_url( 'js/app.js', __FILE__ ),
    array( 'wp-i18n' ),
    '1.0.0',
    true
);

Después, en su archivo JavaScript:

const { __, _n, sprintf } = wp.i18n;

const message = __( 'Settings saved.', 'my-plugin' );

Si utiliza un empaquetador como Webpack, utilice @wordpress/babel-plugin-makepot para extraer las cadenas traducibles de su paquete como parte de su proceso de compilación.

Paso 4

Genere su archivo POT

Una vez envueltas las cadenas, debe generar un archivo POT (Portable Object Template). Este es el archivo fuente a partir del cual trabaja PTC (o cualquier traductor). Contiene todas sus cadenas traducibles pero aún ninguna traducción.

Ejecute este comando desde el directorio raíz de su plugin o tema:

wp i18n make-pot . languages/my-plugin.pot

WP-CLI escanea sus archivos PHP, JavaScript y block.json en busca de llamadas gettext y las compila en un único archivo POT. Si utiliza Composer, puede añadir esto como un script de Composer para que el comando sea coherente en todo su equipo y no requiera una instalación global de WP-CLI.

La suite completa wp i18n incluye todo lo demás que necesitará más adelante en el flujo de trabajo:

Comando Qué hace
wp i18n make-pot Generar un archivo POT desde el código fuente
wp i18n update-po Sincronizar archivos PO existentes cuando cambia su POT
wp i18n make-mo Compilar archivos PO en archivos MO binarios
wp i18n make-json Extraer cadenas JS de PO a archivos JSON
wp i18n make-php Generar archivos l10n.php (WordPress 6.5+)

Traducción de archivos POT con PTC

PTC es una plataforma de traducción creada pensando en los desarrolladores de WordPress. Usted comienza con un archivo POT y recibe archivos de traducción listos para producción sin necesidad de realizar ninguna conversión manual por su parte.

Si no ha utilizado PTC antes, puede registrarse para una prueba gratuita de 30 días. Su primer proyecto incluye hasta 20.000 palabras en dos idiomas, para que pueda traducir un plugin o tema real antes de comprometerse.

1

Configuración de su primer proyecto de traducción

Para empezar, suba su archivo POT y elija qué formatos de salida necesita. PTC puede devolver cualquier combinación de:

  • Archivos .po para cada idioma de destino
  • .mo Archivos , compilados y listos para su distribución
  • .json Archivos para sus cadenas de JavaScript
  • .l10n.php Archivos para una carga más rápida en WordPress 6.5 y versiones posteriores

Vale la pena habilitar el formato .l10n.php para nuevos proyectos. WordPress lo carga automáticamente en lugar del archivo MO cuando ambos están presentes, y es más rápido y ligero en memoria.

Salidas de traducción para archivos POT

El asistente de configuración también le pedirá que describa su tema o plugin para que PTC pueda generar traducciones con el tono y el contexto adecuados para su producto específico. También puede añadir términos específicos de la marca al glosario en esta etapa, lo que garantiza que los nombres, las funciones y cualquier terminología se traduzcan de forma coherente en todos los idiomas.

Consulte la guía de inicio para ver un recorrido completo por estos pasos.

2

Transición a la localización continua

Una vez traducidos sus primeros archivos, puede conectar PTC a su repositorio de GitHub, GitLab o Bitbucket. O bien, puede integrar la localización en su flujo de CI/CD con la API.

A partir de ese momento, no necesitará subir archivos manualmente. Cuando su archivo POT cambie, PTC detectará las cadenas nuevas y actualizadas y devolverá los archivos traducidos: a través de una solicitud de extracción (merge request) para Git, o directamente a través de la API. Sus traducciones se mantienen sincronizadas con su código en cada lanzamiento.

Cargando traducciones en WordPress

Una vez que tenga sus archivos traducidos, debe colocarlos en la ubicación correcta e indicar a WordPress dónde encontrarlos.

Antes de hacer cualquiera de esas dos cosas, asegúrese de que sus nombres de archivo sean correctos. WordPress busca los archivos de traducción utilizando un patrón de nomenclatura específico, y un nombre de archivo que no coincida significa que el archivo simplemente no se cargará.

Cómo asignar correctamente los nombres de archivo

Los códigos de configuración regional siguen el formato language_COUNTRY: de_DE para alemán (Alemania), fr_FR para francés (Francia), pt_BR para portugués (Brasil). Puede encontrar la lista completa de códigos de configuración regional de WordPress en translate.wordpress.org.

El nombre de archivo esperado depende de dónde coloque el archivo.

Dentro de la carpeta /languages/ de su plugin:

{text-domain}-{locale}.mo
my-plugin-de_DE.mo

Dentro de la carpeta /languages/ de su tema:

{locale}.mo
de_DE.mo

En el directorio global de idiomas de WordPress (/wp-content/languages/):

{text-domain}-{locale}.mo
my-plugin-de_DE.mo

Tenga en cuenta que los temas utilizan una convención de nomenclatura más corta cuando los archivos se incluyen dentro del propio tema. Si coloca los archivos en el directorio global de idiomas, tanto los plugins como los temas utilizan el patrón {text-domain}-{locale}.

Carga de traducciones para plugins (PHP)

Una vez que sus archivos de traducción estén en su lugar, debe registrarlos en WordPress para que sepa qué archivos pertenecen a su plugin y dónde encontrarlos. Utilice load_plugin_textdomain() vinculado a init. No utilice plugins_loaded. Provoca un aviso de obsolescencia en las versiones actuales de WordPress.

add_action( 'init', function () {
    load_plugin_textdomain(
        'my-plugin',
        false,
        dirname( plugin_basename( __FILE__ ) ) . '/languages/'
    );
} );

Carga de traducciones para temas (PHP)

Para los temas, utilice load_theme_textdomain() vinculado a after_setup_theme. Este gancho se ejecuta durante la inicialización del tema, que es el momento adecuado para que WordPress cargue sus archivos de traducción.

add_action( 'init', function () {
    wp_set_script_translations(
        'my-plugin-script',
        'my-plugin',
        plugin_dir_path( __FILE__ ) . 'languages'
    );
} );

Traducción de su README y de su ficha en WordPress.org

Su readme.txt no es un archivo de recursos, por lo que WP-CLI no lo detectará al generar un archivo POT. Para traducirlo, utilice la función Pegar para traducir de PTC: pegue el contenido, elija sus idiomas de destino y descargue el resultado.

Función Pegar para traducir

Si su plugin o tema aparece en WordPress.org, la descripción traducida aparece en la pestaña Detalles del plugin en el idioma del usuario. Para que sus traducciones se publiquen allí, siga el proceso de importación de WordPress.org.

Preguntas frecuentes

¿Está listo para distribuir temas y plugins de WordPress totalmente traducidos?

Regístrese para una prueba gratuita de 30 días y traduzca su primer proyecto a dos idiomas —hasta 20.000 palabras— de forma totalmente gratuita.

Traducir temas y plugins con PTC

Obtenga traducciones precisas en cuestión de minutos

Cargue archivos individuales o automatice el proceso mediante la API o la integración de Git


Ir arriba