Localisatie van een PHP-website

Trefwoorden: internationalisatie
Het aanbieden van een website in verschillende talen lijkt voor velen een fluitje van een cent. De klassieke methode bestaat erin een hoop variables te gebruiken en afhankelijk van de taal een andere file te includen. Dat is misschien wel een logische manier, maar een zijn een heleboel nadelen aan verbonden. Je hebt een groot aantal variables, dus als je er één verwijdert, aanpast of ergens wil gebruiken, moet je die manueel gaan opzoeken. Dat is niet zo erg voor kleine systemen, maar als je enkele honderden of zelfs duizenden te vertalen strings hebt is het nogal een omslachtig en feilbaar systeem om te hanteren.

Die nadelen heb je dus niet met Gettext, waar we direct verder op in gaan. PHP's gettext functies zijn een interface tot GNU Gettext, een tool dat veel programmeurs gebruiken om grote applicaties te internationaliseren. Met Gettext kun je gemakkelijk verschillende vertalingen beheren. Als je verschillende versies bij elkaar voegt, worden de woorden die nog moet vertaald worden, gemarkeerd. En bovendien wordt de standaard tekst getoond als er geen vertaling aanwezig is.

De basis is redelijk eenvoudig. Je stelt met een variable in welke taal er moet gebruikt worden en dan output je met een speciale functie de vertaling:
PHP
  1. <?php
  2.  
  3. echo _('Hallo wereld');
  4.  
  5. // ofwel
  6.  
  7. echo gettext('Hallo wereld');
  8.  
  9. ?>
Deze twee functies doen het zelfde, en als er geen vertaling gevonden wordt, wordt in ons voorbeeld gewoon "Hallo wereld" geoutput.

De vertalingen worden opgeslagen in een gecomprimeerd binair .MO-bestand. Zulke bestanden kun je maken vertrekkende van een .PO-bestand. Eerst maak je dus een .PO-script door alle strings die kunnen vertaald worden te extraheren uit je PHP-bestanden (zo vergeet je nooit strings). Daarvoor gebruik je het xgettext-programma. Dat is geen PHP-functie maar is een onderdeel van GNU Gettext. Een voorbeeld:
CODE
  1. xgettext --default-domain=voorbeeld -k_ index.php
In dit geval krijgen we een nieuw bestand "voorbeeld.po". De inhoud van dit bestand ziet er zo uit:
CODE
  1. #: index.php:2
  2. msgid 'Hallo wereld'
  3. msgstr ''
De eerste regel is een commentaar, de tweede regel is de te vertalen string en de derde regel zal de vertaling bevatten.

Laten we ter illustratie even een Duitse vertaling maken. Open "voorbeeld.po" in een teksteditor en vul de msgstr in. Dan krijgen we:
CODE
  1. #: index.php:2
  2. msgid 'Hallo wereld'
  3. msgstr 'Hallo Welt'
Het enige wat we nu nog moeten doen is hier een .MO-bestand van maken. Daarvoor kun je "msgfmt" gebruiken, opnieuw een onderdeel van GNU Gettext. Dat gebeurt als volgt:
CODE
  1. msgfmt -o voorbeeld.mo voorbeeld.po
Hoe laten we PHP nu alles netjes vertalen? We zullen alle vertalingen in een eigen map plaatsten. Neem bijvoorbeeld "locale" of "localisatie". In die map maak je dan mappen per taal. In ons geval wordt dat voor standaardduits "de_DE". In die map kun je dan nog eventueel verschillende mappen maken voor de eventuele verschillende onderdelen. Plaats in een van die mappen dan de .MO-file.
Ten tweede moet ons PHP-script aangepast worden. De nieuwe taal (locale) moet ingesteld worden en het juiste bestand (textdomain) moet gekozen worden.
PHP
  1. <?php
  2.  
  3. // de taal selecteren
  4. putenv('LANG=de_DE');
  5. setlocale('LC_ALL', 'de_DE');
  6.  
  7. bindtextdomain('voorbeeld', './localisatie/'); // de map aanduiden
  8. textdomain('voorbeeld '); // het bestand selecteren
  9.  
  10. echo _('Hallo wereld');
  11.  
  12. ?>
Nu zou je een werkend script moeten hebben dat "Hallo Welt" print. :)

Om dit te laten werken onder je Windows-installatie moet je eerst je php.ini-bestand openen en deze regel uncommenten:
CODE
  1. ;extension=php_gettext.dll
De "extension_dir" moet ook naar de map verwijzen waar je extensies (inclusief php_gettext.dll) zich bevinden. Controleer met "phpinfo()" of Gettext geactiveerd is.

Om de .MO-files enz. te kunnen maken en bewerken moet je GNU Gettext voor Win32 downloaden.

Er zijn ook een aantal editors speciaal voor .PO-bestanden. Gekende zijn GTranslator (Gnome), KBabel (KDE) en poEdit (ook voor Windows).Dit artikel werd geschreven door rObkE op woensdag 21 juli 2004 om 16:56 en werd sindsdien 7009 keer gelezen.

  • Pagina
  • 1 van 1

Bericht geplaatst door PC_Freak op zondag 31 oktober 2004 om 19:01:49.
PC_Freak heeft nog geen avatar toegevoegd
Multiviteit: 186
Leuke mogelijkheid, maar voor een gewone site is het haast ondoenbaar. Voor online applicaties a la phpMyAdmin is het dan wel weer een goede keuze.
Bericht geplaatst door een gast op dinsdag 21 december 2004 om 10:05:43.
Zijn er nog andere manieren om een site in meerdere talen beschikbaar te stellen?

Het gaat om een (nog statische) website welke in 10+ talen moet worden uitgevoerd... :s
Bericht geplaatst door een gast op dinsdag 7 november 2006 om 22:27:35.
Je kan als je system() ofzo kan gebruiken en je op een Linux-server zit normaal aspell gebruiken voor spellcheck, misschien dt er dus ook wel iets is om te vertalen.
Bericht geplaatst door een gast op donderdag 25 februari 2016 om 16:38:47.
Als u .po taalbestanden wilt vertalen, kan u dit online instrument ook gebruiken: https://poeditor.com
  • Pagina
  • 1 van 1