1. Escribir con la localización en mente
No use echo
o print()
para producir salida de texto, en su lugar use las funciones de WordPress __()
y _e()
:
/** Not localization friendly */
echo "Welcome to my plugin";
// OR
print("Welcome to my plugin");
/** Localization friendly */
_e('Welcome to my plugin', 'my-plugin');
// OR
$my_text = __('Welcome to my plugin', 'my-plugin');
echo $my_text;
_e()
y __()
proporcionará la traducción, en el idioma actual, del texto proporcionado como primer parámetro. _e()
generará el texto mientras que __()
lo devolverá.
El segundo parámetro es el dominio de texto , lo usará para decirle a WordPress que el texto proporcionado como primer parámetro pertenece a este complemento, puede usar el nombre que desee, pero prefiero usar el mismo nombre que usé para el complemento archivo de directorio, lo encuentro más intuitivo.
¿Cómo generar texto dinámico como: "Hola <nombre de usuario>"?
Con __()
y sprintf()
:
/** Get the username */
$username = 'Magictrick';
/** Not localization friendly */
echo "Hello $username";
/** Localization friendly */
printf(__('Hello %s', 'my-plugin'), $username);
// OR
$my_text = sprintf(__('Hello %s', 'my-plugin'), $username);
echo $my_text;
2. Prepare los archivos .pot / .po / .mo
Definiciones
- El archivo .pot : está a su disposición por el desarrollador del complemento 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 usted u otra persona comenzaron, y tal vez completado, WordPress no lo usa.
- Archivo A.mo : Poedit crea automáticamente cada vez que guarda un archivo .po, todo lo que puede hacer con estos archivos es cargarlos o volver a cargarlos cada vez que cree o actualice un archivo .po. WordPress obtiene traducciones de archivos .mo .
Abra Poedit y cree un nuevo catálogo (Archivo ›Nuevo catálogo ...) con esta configuración:
- Información del proyecto: use su información (o la de su equipo), el idioma y el país deben coincidir con el idioma predeterminado de su complemento
- Rutas:
- Camino base:
.
- Rutas: elimine todo y agregue
..
, (almacenaremos el archivo de idioma en un subdirectorio de plugin llamado idiomas)
- Palabras clave: eliminar todo y agregar
__
y_e
Guarde el catálogo como y escanee sus archivos de complemento en busca de texto traducible presionando el botón de actualización. Cuando finalice la actualización, cierre ese catálogo, no necesitará actualizar ese archivo a menos que agregue nuevas cadenas traducibles (es decir, incluidas en o ) a su complemento./my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin.pot
__()
_e()
Ahora creemos la primera traducción (usaré fr_FR):
Con Podeit , cree un catálogo desde un archivo POT
(Archivo ›Nuevo catálogo desde un archivo POT ...) :
- Información del proyecto: use su información (o la de su equipo), cambie el idioma y el país , usaré francés y Francia
- Caminos: no cambies
- Palabras clave: no cambies
Guarde el catálogo como . Traduzca algunas o todas las cadenas, guarde el archivo .po nuevamente, cargue los archivos .po y .mo./my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin-fr_FR.po
Tenga en cuenta que cada vez que guarda un archivo .po, se genera un archivo .mo con el mismo nombre, el nombre de archivo del archivo .po es crucial , se compone de la concatenación del dominio de texto del complemento (my-plugin) y el idioma local ( fr_FR), siempre nombra tus archivos .po para complementos como este: [textdomain] - [locale] .po , aquí hay algunos ejemplos:
- Italiano / Italia:
wpcf7-it_IT.po
- Portugués / Brasil:
wpcf7-pt_BR.po
- Árabe:
wpcf7-ar.po
... ¡Sí!
Siempre que el complemento se actualice con texto nuevo, actualice el archivo po, traduzca nuevas cadenas y vuelva a cargar los archivos .po y .mo
3. Indique al complemento que cargue el texto traducido para el idioma actual
En algún lugar de su complemento, debe decirle a WordPress que use su archivo .mo, puede hacerlo usando este código al comienzo de su archivo de complemento:
function my_plugin_init() {
load_plugin_textdomain( 'my-plugin', false, 'my-plugin/languages' );
}
add_action('init', 'my_plugin_init');
Reemplace my-plugin
con el nombre de su complemento en el primer y tercer parámetro de la load_plugin_textdomain
función.
4. Prueba y solución de problemas
Algunas razones pueden no funcionar:
- Las cadenas no se importan al archivo .pot o .po
- → Configuración de catálogo incorrecta (ruta o palabras clave o ambas)
- El texto no está traducido en el sitio de WordPress
- → Falta el archivo .mo para ese idioma o tiene un nombre de archivo incorrecto
- → Dominio de texto no utilizado (reemplazar
_e('my text')
con _e('my text', 'my-plugin')
)
- → El dominio de texto no está cargado (use el ejemplo anterior con los parámetros correctos, WP no le advertirá sobre los errores)
La respuesta de Nabil es bastante completa, pero se proporciona una variación fácil:
Su complemento está en el repositorio de complementos de WordPress.org
Estás dispuesto a exigir que tu complemento solo funcione con WordPress 4.6 o superior.
Los pasos son estos:
En el archivo readme.txt de su complemento, agregue
Requires at least: 4.6
. Ver https://developer.wordpress.org/plugins/wordpress-org/how-your-readme-txt-works/si aún no lo está, suba su complemento al repositorio de complementos de WordPress. Ver https://wordpress.org/plugins/developers/add/ .
Encuentra el dominio slug / text de tu complemento. Para hacer eso, vaya a la página de su complemento en el repositorio de complementos de WordPress. La URL será como https://wordpress.org/plugins/your-plugin-slug/ . La última parte de la URL, "your-plugin-slug", es la babosa de su complemento. Eso es lo que usa para el dominio de texto de las funciones de traducción.
Use las funciones de traducción de WordPress en su complemento (como
__e(‘hello’, ‘my-plugin-domain’);
). Solo asegúrese de usar el dominio de texto de complemento correcto, adquirido en el paso anterior. Consulte https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/ para obtener más información.Si sigue los pasos anteriores, WordPress se encargará de:
(Respuesta de mi blog aquí: https://cmljnelson.blog/2019/01/01/the-really-lazy-way-to-translate-a-wordpress-plugin/ )
fuente