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.potWP-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 .
popara cada idioma de destino .moArchivos , compilados y listos para su distribución.jsonArchivos para sus cadenas de JavaScript.l10n.phpArchivos 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.

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.moDentro 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.moTenga 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.

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
¿Cuál es la diferencia entre los archivos POT, PO, MO y l10n.php?
Todos forman parte del mismo flujo de traducción, y cada uno tiene un propósito diferente:
- Un archivo POT (Portable Object Template) es el archivo fuente que usted genera a partir de su código. Contiene todas sus cadenas traducibles en su idioma original pero ninguna traducción. Es el archivo que entrega a PTC.
- Un archivo PO (Portable Object) es una copia de su archivo POT con las traducciones añadidas para un idioma específico. Es legible por humanos, por lo que los traductores pueden trabajar con él directamente.
- Un archivo MO (Machine Object) es una versión binaria compilada de un archivo PO. WordPress utiliza esto para cargar traducciones en PHP porque es más rápido de leer que el formato PO de texto plano.
- Los archivos JSON sirven para el mismo propósito que los archivos MO pero para cadenas de JavaScript. WordPress no puede utilizar archivos MO para JavaScript, por lo que sus traducciones de JS se extraen y se almacenan por separado en formato JSON.
- Un archivo l10n.php es una alternativa más reciente a los archivos MO, introducida en WordPress 6.5. Se carga más rápido y utiliza menos memoria, y WordPress lo utilizará automáticamente cuando haya uno disponible junto al archivo MO.
¿Puedo confiar en la comunidad de traducción de WordPress en lugar de utilizar una herramienta de traducción?
En la mayoría de los casos, no. La traducción comunitaria en WordPress.org está impulsada por voluntarios. En la práctica, esto significa que solo un pequeño número de plugins muy utilizados tienen traducciones completas a los principales idiomas europeos. La mayoría de los plugins tienen traducciones parciales y, para configuraciones regionales menos comunes, muchos no tienen ninguna.
Si desea que sus usuarios tengan una experiencia totalmente traducida desde el primer día, esperar a la comunidad no es una estrategia realista. Las traducciones pueden tardar meses o años en aparecer, si es que aparecen. El uso de una herramienta como PTC significa que usted distribuye traducciones completas junto con su idioma de origen, según su propio calendario, sin depender de voluntarios.
Un análisis de más de 60.000 plugins y temas de WordPress respalda esto: la traducción comunitaria cubre menos del 5% de las necesidades de traducción en 40 idiomas.
Si utilizo PTC, ¿necesito Poedit?
No. Todo lo que aparece en esta guía funciona con WP-CLI y PTC. WP-CLI genera tu archivo POT y puede compilar archivos MO y JSON cuando sea necesario. PTC se encarga de la traducción y devuelve todos los formatos de archivo que WordPress necesita. Poedit es un editor de escritorio útil si prefieres traducir manualmente, pero no forma parte de este flujo de trabajo.
¿Debo hacer algo diferente para que mi tema/plugin admita idiomas RTL?
El flujo de trabajo de traducción es el mismo. Los idiomas de derecha a izquierda (RTL) utilizan el mismo flujo POT/PO/MO que cualquier otro idioma. El paso adicional es asegurarse de que su tema admita estilos RTL. WordPress carga automáticamente un archivo rtl.css si existe uno en el directorio de su tema, y puede utilizar la función is_rtl() para aplicar condicionalmente estilos o scripts específicos para RTL.
¿Cómo me aseguro de que las fechas y los números se muestren correctamente para cada configuración regional?
Si su plugin o tema muestra fechas o números, utilice las funciones de formato integradas de WordPress en lugar de las nativas de PHP. date_i18n() formatea las fechas según la configuración regional activa, y number_format_i18n() se encarga del formato de números adaptado a la configuración regional. Estas no forman parte del flujo de trabajo del archivo de traducción, pero son importantes para una experiencia totalmente localizada.
¿Por qué no aparecen las traducciones en mi tema o plugin?
La causa más común es una discrepancia en el dominio de texto. Su código, los nombres de archivo y la llamada a load_plugin_textdomain() deben utilizar exactamente la misma cadena. Las traducciones comunitarias de WordPress.org también pueden anular silenciosamente sus archivos incluidos. Consulte la guía completa de resolución de problemas para ver escenarios y soluciones específicos.

¿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