Cómo hacer un plugin de WordPress listo para traducción
¿Cuál es la mejor manera de crear un plugin que esté listo para traducción?
No necesita estar traducido desde el principio, pero debe ser fácilmente traducible para que otros desarrolladores de diferentes culturas puedan participar en el proceso de localización del plugin.

1. Escribe pensando en la localización
No uses echo
o print()
para generar texto de salida, en su lugar utiliza las funciones de WordPress __()
y _e()
:
/** No compatible con localización */
echo "Bienvenido a mi plugin";
// O
print("Bienvenido a mi plugin");
/** Compatible con localización */
_e('Bienvenido a mi plugin', 'mi-plugin');
// O
$mi_texto = __('Bienvenido a mi plugin', 'mi-plugin');
echo $mi_texto;
_e()
y __()
proporcionarán la traducción — en el idioma actual — del texto proporcionado como primer parámetro. _e()
mostrará el texto mientras que __()
lo devolverá.
El segundo parámetro es el dominio de texto, lo usarás para indicarle a WordPress que el texto proporcionado como primer parámetro pertenece a este plugin. Puedes usar cualquier nombre que desees pero yo prefiero usar el mismo nombre que usé para el archivo o directorio del plugin, lo encuentro más intuitivo.
¿Cómo mostrar texto dinámico como: "Hola <usuario>"?
Con __()
y sprintf()
:
/** Obtener el nombre de usuario */
$usuario = 'Magictrick';
/** No compatible con localización */
echo "Hola $usuario";
/** Compatible con localización */
printf(__('Hola %s', 'mi-plugin'), $usuario);
// O
$mi_texto = sprintf(__('Hola %s', 'mi-plugin'), $usuario);
echo $mi_texto;
2. Prepara los archivos .pot/.po/.mo
Definiciones
- El archivo .pot: es puesto a disposición por el desarrollador del plugin y se usa como punto de partida para crear nuevas traducciones, WordPress no lo usa.
- Un archivo .po: es un archivo de traducción que tú o alguien más comenzó, y quizás completó, WordPress no lo usa.
- Un archivo .mo: es creado automáticamente por Poedit cuando guardas un archivo .po, todo lo que puedes hacer con estos archivos es subirlos o volver a subirlos cuando creas o actualices un archivo .po. WordPress obtiene las traducciones de los archivos .mo.
Abre Poedit y crea un nuevo catálogo (Archivo › Nuevo catálogo...) con estos ajustes:
- Información del proyecto: Usa tu información (o la de tu equipo), el idioma y país deben coincidir con el idioma por defecto de tu plugin
- Rutas:
- Ruta base:
.
- Rutas: elimina todas y agrega
..
, (almacenaremos los archivos de idioma en un subdirectorio del plugin llamado languages)
- Ruta base:
- Palabras clave: elimina todas y agrega
__
y_e
Guarda el catálogo como /mi_wordpress_blog/wp-content/plugins/mi-plugin/languages/<strong>mi-plugin.pot</strong>
y escanea los archivos de tu plugin en busca de texto traducible presionando el botón de actualizar. Cuando termine la actualización cierra ese catálogo, no necesitarás actualizar ese archivo a menos que agregues nuevas cadenas traducibles (es decir, encerradas en __()
o _e()
) a tu plugin.
Ahora creemos la primera traducción (usaré fr_FR):
Usando Poedit, crea un catálogo desde un archivo POT (Archivo › Nuevo catálogo desde archivo POT...):
- Información del proyecto: Usa tu información (o la de tu equipo), cambia el idioma y país, usaré Francés y Francia
- Rutas: No cambies
- Palabras clave: No cambies
Guarda el catálogo como /mi_wordpress_blog/wp-content/plugins/mi-plugin/languages/<strong>mi-plugin-fr_FR.po</strong>
. Traduce algunas o todas las cadenas, guarda nuevamente el archivo .po, sube ambos archivos .po y .mo.
Nota que cada vez que guardas un archivo .po se genera un archivo .mo con el mismo nombre, el nombre del archivo .po es crucial, está compuesto por la concatenación del dominio de texto del plugin (mi-plugin) y el locale del idioma (fr_FR), siempre nombra tus archivos .po para plugins así: [dominiodetexto]-[locale].po, aquí algunos ejemplos:
- Italiano/Italia:
wpcf7-it_IT.po
- Portugués/Brasil:
wpcf7-pt_BR.po
- Árabe:
wpcf7-ar.po
... ¡Sí!
Cuando el plugin sea actualizado con nuevo texto, actualiza el archivo po, traduce las nuevas cadenas y vuelve a subir los archivos .po y .mo
3. Indica al plugin que cargue el texto traducido para el idioma actual
En algún lugar de tu plugin, debes decirle a WordPress que use tu archivo .mo, puedes hacerlo usando este código al principio de tu archivo de plugin:
function mi_plugin_init() {
load_plugin_textdomain( 'mi-plugin', false, 'mi-plugin/languages' );
}
add_action('init', 'mi_plugin_init');
Reemplaza mi-plugin
con el nombre de tu plugin en el 1er y 3er parámetro de la función load_plugin_textdomain
.
4. Prueba y soluciona problemas
Algunas razones por las que puede no funcionar:
- Las cadenas no se importaron al archivo .pot o .po
- → Configuración incorrecta del catálogo (ruta o palabras clave o ambas)
- El texto no se traduce en el sitio de WordPress
- → Archivo .mo para ese idioma faltante o con nombre incorrecto
- → Dominio de texto no usado (reemplaza
_e('mi texto')
con_e('mi texto', 'mi-plugin')
) - → Dominio de texto no cargado (usa el ejemplo anterior con los parámetros correctos, WP no te avisará sobre errores)

+1 Buen artículo :) Echa un vistazo a este artículo: Cargar archivos de idioma de WordPress correctamente, "Pautas prácticas para facilitar la carga de archivos de idioma en WordPress". :::::: También vale la pena mencionar Glotpress y el grupo de Polyglots.

La respuesta de Nabil es bastante completa, pero hay una variación fácil que se puede aplicar:
Tu plugin está en el repositorio de plugins de WordPress.org
Estás dispuesto a requerir que tu plugin solo funcione con WordPress 4.6 o superior.
Los pasos son los siguientes:
En el archivo readme.txt de tu plugin, añade
Requires at least: 4.6
. Consulta https://developer.wordpress.org/plugins/wordpress-org/how-your-readme-txt-works/Si aún no lo está, sube tu plugin al repositorio de plugins de WordPress. Mira https://wordpress.org/plugins/developers/add/.
Encuentra el slug/dominio de texto de tu plugin. Para hacerlo, ve a la página de tu plugin en el repositorio de WordPress. La URL será similar a https://wordpress.org/plugins/your-plugin-slug/. La última parte de la URL, "your-plugin-slug", es el slug de tu plugin. Eso es lo que usarás como dominio de texto en las funciones de traducción.
Usa las funciones de traducción de WordPress en tu plugin (como
__e(‘hello’, ‘my-plugin-domain’);
). Solo asegúrate de usar el dominio de texto correcto del plugin, obtenido en el paso anterior. Consulta https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/ para más información.
Si sigues los pasos anteriores, WordPress se encargará de:
- Analizar tu plugin en busca de todas las cadenas traducibles (no necesitas instalar ni ejecutar Poedit ni nada similar)
- Facilitar que cualquiera pueda contribuir con traducciones de tu plugin en translate.wordpress.org (no necesitas tener tu propio sitio dedicado a traducir tu plugin, ni un proceso personalizado para que los traductores envíen sus traducciones)
- Cuando alguien use tu plugin, WordPress verificará si está traducido a su idioma y, de ser así, lo mostrará en su idioma (no es necesario que ellos, ni tú, carguen archivos de traducción en su sitio web)
(Respuesta de mi publicación de blog aquí: https://cmljnelson.blog/2019/01/01/the-really-lazy-way-to-translate-a-wordpress-plugin/)

No estoy seguro de por qué recibió votos negativos. Esto es lo que he hecho para que https://wordpress.org/plugins/print-my-blog/ esté listo para traducción (y el plugin se ha traducido con éxito)

¿Significa eso que si un plugin/tema no está en el repositorio de plugins de WordPress pero usa el dominio de texto de un plugin que sí está allí, WordPress cargaría los archivos de traducción incorrectos?
