Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment exécuter ou charger des fichiers .po/.mo pour la localisation en php

Tout d'abord, vous devez informer PHP des paramètres régionaux et du domaine que vous utilisez.

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

Dans ce cas, j'ai une traduction danoise et un fichier appelé mycatalog.mo (et .po). Ces fichiers sont placés (depuis votre racine) ici :locale/da_DK/LC_MESSAGES/mycatalog.mo/po

Afin de montrer votre traduction, vous ferez ceci :

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

_(); est un alias de gettext(); La chose intelligente à propos de gettexts est que s'il n'y a pas de traduction, vous n'aurez pas un code de langue laid comme "MSG_HELLO_WORLD" dans votre interface utilisateur, mais plutôt une meilleure alternative :simplement le texte en anglais brut.

Dans le fichier messages.po, vous devez avoir tous les messages (sensibles à la casse et également en ce qui concerne les virgules, points, deux-points, etc.) utilisés sur ce formulaire :

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

Lorsque vous l'avez ajouté à votre fichier .po, vous ouvrez ce fichier dans poedit, appuyez sur "Enregistrer" et il générera un fichier .mo. Ce fichier est téléchargé dans le même répertoire que le fichier .po (généralement quelque chose comme \locale\da_DK\LC_MESSAGES\ à partir de la racine du script)

Pour traduire un contenu dynamique/variable, vous pouvez utiliser - entre autres - sprintf, de cette manière :

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

Dans ce cas, le %s apparaîtra dans le fichier .po ; Lorsque vous avez la chaîne traduite (qui contient le %s), sprintf s'assurera de remplacer le %s par le contenu de la variable. SI la variable doit également être traduite, vous pouvez le faire :

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

Ensuite, vous n'avez pas besoin d'une phrase complète pour chaque couleur, mais vous obtenez toujours les couleurs traduites.

Il est important de noter que la première fois qu'un .mo est exécuté sur le serveur, il est mis en cache - et il n'y a aucun moyen de supprimer ce fichier du cache sans redémarrer (Apache ou similaire devrait suffire). Cela signifie que toute modification apportée au .mo après sa première utilisation ne sera pas effective. Il existe un certain nombre de hacks pour contourner ce problème, mais honnêtement, ils ne sont généralement pas très jolis (ils incluent la copie du .mo, l'ajout de time() derrière, puis l'importation et le cache à nouveau). Ce dernier paragraphe n'a d'importance que si vous n'allez pas tout traduire d'un coup, mais par morceaux.

Si vous souhaitez créer votre propre outil de traduction à un moment donné, cet outil vous aide à convertir .po en .mo en utilisant PHP :

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