Een website meertalig maken met GNU gettext

Internationalisering is het proces om een webapplicatie te ontwikkelen welke aangepast kan worden naar verschillende talen en regio's zonder technische veranderingen.

Eerder dit jaar heb ik de website van Gravatar vertaald naar het Nederlands.

Deze maakt gebruik van de gettext functie voor elke string die vertaald moet worden :

gettext("Globally Recognized Avatars");

Om alle strings te verzamelen, heb ik eerst een overzicht nodig van alle .php bestanden die we gaan doorzoeken :

find /Applications/MAMP/htdocs/davidvandertuijn/application/classes/controller -name "*.php" > /Users/davidvandertuijn/Desktop/controllers.txt

Een controllers.po (Portable Object) document wordt gegenereerd door alle .php bestanden te doorzoeken :

/Applications/MAMP/Library/bin/xgettext --from-code=utf-8 --keyword=gettext --default-domain=controllers --files-from=/Users/davidvandertuijn/Desktop/controllers.txt

Hetzelfde doen we voor de views, deze hebben geen .php maar een .tpl extensie :

find /Applications/MAMP/htdocs/davidvandertuijn/application/views -name "*.tpl" > /Users/davidvandertuijn/Desktop/views.txt

In tegenstelling tot de controllers vinden we geen gettext functie in de views, maar een alias van deze functie (Smarty Plugin) :

/Applications/MAMP/Library/bin/xgettext --from-code=utf-8 --keyword=__ --default-domain=views --files-from=/Users/davidvandertuijn/Desktop/views.txt

Het .po (Portable Object) document ziet er ongeveer zo uit :

msgid "Globally Recognized Avatars"
msgstr "Wereldwijd Erkende Avatars"

Voor een vertaalbureau niet echt gebruiksvriendelijk, maar er is Sofware zoals Poedit beschikbaar om deze bestanden te bewerken :

Poedit

Tot slot wordt het .po (Portable Object) document gecompileerd met msgfmt naar een .mo (Machine Object) bestand :

msgfmt -o /Users/davidvandertuijn/controllers.mo /Users/davidvandertuijn/controllers.po

Installatie GNU Gettext Tools (optioneel)

mkdir -p /tmp/gettext
cd /tmp/gettext
curl -O ftp://ftp.gnu.org/gnu/gettext/gettext-0.17.tar.gz
tar xzpf gettext-0.17.tar.gz
cd gettext-0.17
./configure
make
make install

Maak de volgende directory structuur aan in de document root :

/locale/nl/LC_MESSAGES

Het .mo (Machine Object) bestand wordt in deze directory geplaatst.

Een voorbeeld in PHP met één textdomain :

putenv ("LC_ALL=nl");

bindtextdomain('controllers', '/Applications/MAMP/htdocs/davidvandertuijn/locale');
textdomain('controllers');

echo gettext('Globally Recognized Avatars');

Meer informatie : GNU gettext