sql >> Base de Datos >  >> RDS >> Mysql

Cómo ejecutar o cargar archivos .po/.mo para localización en php

En primer lugar, debe informar a PHP qué configuración regional y dominio está utilizando.

putenv("LANG=da_DK"); 
setlocale('LC_ALL', "da_DK"); 
bindtextdomain("mycatalog", "./locale/");  
textdomain("mycatalog");

En este caso, tengo una traducción al danés y un archivo llamado mycatalog.mo (y .po). Estos archivos se colocan (desde su raíz) aquí:locale/da_DK/LC_MESSAGES/mycatalog.mo/po

Para mostrar su traducción, debe hacer esto:

echo _("Hello world");   // Which would become "Hej verden"

_(); es un alias de gettext(); Lo inteligente de gettexts es que si no hay traducción, no tendrá un código de idioma feo como "MSG_HELLO_WORLD" en su interfaz de usuario, sino una mejor alternativa:simplemente el texto en inglés sin formato.

En el archivo message.po debe tener todos los mensajes (sensible a mayúsculas y minúsculas y también con respecto a las comas, puntos, dos puntos, etc.) en este formulario:

msgid "Hello world!"
msgstr "Hej verden!"

Cuando haya agregado esto a su archivo .po, abra este archivo en poedit, presione "Guardar" y generará un archivo .mo. Este archivo se carga en el mismo directorio que el archivo .po (normalmente algo así como \locale\da_DK\LC_MESSAGES\ desde la raíz del script)

Para traducir contenido dinámico/variable, puede usar, entre otras cosas, sprintf, de esta manera:

echo sprintf(_("My name is %s"), $name);

En este caso, el %s aparecerá en el archivo .po; Cuando tenga la cadena traducida (que contiene el %s), sprintf se asegurará de reemplazar el %s con el contenido variable. SI la variable también debe traducirse, puede hacer esto:

echo sprintf(_("The color of my house is %s"), _($color));

Entonces no necesita una oración completa para cada color, pero aún obtiene los colores traducidos.

Es importante tener en cuenta que la primera vez que se ejecuta un .mo en el servidor, se almacena en caché, y no hay forma de eliminar este archivo del caché sin reiniciar (Apache o similar debería ser suficiente). Esto significa que cualquier cambio que realice en el .mo después de la primera vez que se use, no será efectivo. Hay una serie de trucos para solucionar esto, pero, sinceramente, en su mayoría no son muy bonitos (incluyen copiar el .mo, agregar el tiempo () detrás de él y luego importarlo y almacenarlo en caché nuevamente). Este último párrafo solo tiene importancia si no vas a traducirlo todo de una vez, sino por partes.

Si desea crear su propia herramienta de traducción en algún momento, esta herramienta lo ayuda a convertir .po a .mo usando PHP:

http://www.josscrowcroft.com/2011/code/php-mo-convert-gettext-po-file-to-binary-mo-file-php/