WordPress website maken

Thema vertaalbaar maken (Translation ready)

Niet ieder WordPress thema is “translation-ready”, oftewel klaar om te vertalen. Zo kan het zijn dat je een thema in het Engels downloadt, hem wilt vertalen naar een andere taal en je geen .POT bestand vindt en dat POEdit ook geen teksten laat zien. In zo’n geval kun je er zelf voor kiezen om het thema vertaalbaar te maken. In dit artikel wordt uitgelegd hoe je dit zelf kunt doen. Let er wel op dat je de bestanden van je thema aan gaat passen en fouten ervoor kunnen zorgen dat je thema niet goed meer werkt. Maak dus altijd een backup voordat je iets aanpast, of gebruik een child theme.

Ook voor de developers die zelf een thema hebben ontwikkeld, is het verstandig om hem “translation-ready” te maken. Voor veel mensen maakt dit je thema een stuk aantrekkelijker om te downloaden.

Wat zijn .POT, .PO en .MO bestanden
WordPress maakt gebruik van het GNU gettext localization framework voor vertalingen. In dit framework wordt er gebruik gemaakt drie soorten bestanden:
POT (Portable Object Template) bestanden: De eerste stap in het vertaalproces is een programma gebruiken dat door de WordPress code zoekt naar teksten die in een __() of _e() functie voorkomen. Hierbij worden de gevonden teksten in een bestand opgeslagen. Dit bestand bevat dan alle, originele, teksten die klaar zijn om te vertalen.
PO (Portable Object) bestanden: De tweede stap is het vertalen van de teksten in een POT bestand naar de doeltaal. Hierbij worden zowel de originele teksten als de vertalingen opgeslagen in een zogeheten PO bestand. Een POT en PO bestand zijn in principe dus hetzelfde, behalve dat het PO bestand de vertalingen bevat.
MO (Machine Object) bestanden: In de laatste stap wordt het gecreëerde PO bestand omgezet naar een versie die leesbaar is voor computers. Een MO bestand is dus identiek aan een PO bestand, maar dan omgezet in een taal te begrijpen voor computers, zodat de vertalingen ook daadwerkelijk te zien zijn op je website.

Thema klaarmaken voor vertalingen
Om je thema klaar te maken om vertaald te worden, moet je een textdomain hebben gedefinieerd. Dit doe je door de volgende regel code in je functions.php bestand te plaatsen:

load_theme_textdomain( ‘je_thema’, ‘themapad’.’/languages’ );

Hierin moet je ‘je_thema’ vervangen door de naam van je thema en ‘themapad’ door het pad naar de hoofdmap van het thema. Vervolgens zal je in de hoofdmap van het thema een nieuwe map aan moeten maken waarin je de vertalingen gaat opslaan. In dit voorbeeld is gekozen voor ‘languages’. Indien je afwijkt van deze naam, zorg er dan voor dat je in het stukje code de naam ook vervangt door degene die jij gebruikt.

Teksten klaarmaken voor vertalingen
Nadat je de code hebt toegevoegd aan je functions.php bestand, moet je de thema bestanden doorlopen en aangeven welke teksten vertaald moeten worden. Het aangeven gebeurt in de meeste gevallen door de teksten te omringen met de __() of _e() functies, maar er zijn ook andere functies mogelijk. Hier komen we verderop in dit artikel op terug.

Wanneer je je thema bestanden doorloopt, zal je teksten tegenkomen die op verschillende manieren worden gebruikt. Sommige zullen worden opgeslagen in variabelen (bijvoorbeeld: $tekst = “Een regel tekst”; ) en andere zullen direct worden geprint (bijvoorbeeld: echo “Hallo bezoeker”; ).
Als er gebruikt wordt gemaakt van het “echo” commando en deze direct wordt gevolgd door de tekst, zal je de _e() functie moeten gebruiken om het vertaalbaar te maken.

echo ‘Hallo bezoeker’;

Zal dus aangepast worden naar:

echo _e(‘Hallo bezoeker’, ‘je_thema’);

Hierin is ‘Hallo bezoeker’ de originele tekst die je wilt vertalen en ‘je_thema’ is de gebruikte naam in het stukje code dat je in het functions.php bestand had geplaatst. Wanneer deze niet overeenkomen, zal deze aangegeven tekst later niet gevonden worden.

Voor de gevallen dat er niet gebruik gemaakt wordt van ‘echo’, of er tussen ‘echo’ en de tekst iets staat, gebruik je de __() functie (twee maal underscore).

the_content( ‘Read more’ );

en

<?php echo '
<h2>Hallo wereld!</h2>
'; ?>

worden:

the_content( __(‘Read more’, ‘je_thema’) );

en

<?php echo '
<h2>’ . __(‘Hallo wereld!’, ‘je_thema’) . ‘</h2>
'; ?>

Indien je losstaande tekst vindt, kun je deze door _e() omringen. Hiervoor moet je wel de php tags openen en sluiten:

Hallo wereld

wordt:

<?php _e(‘Hallo wereld’, je_thema’)­­; ?>

Teksten met dynamische data
Het kan voorkomen dat je thema gebruikt maakt van een variabele die in een tekst wordt geplaatst om bijvoorbeeld aan te kunnen geven hoeveel zoekresultaten er zijn. In dat geval kun je gebruik maken van de sprintf functie, in combinatie met __() of _e(), om de daadwerkelijke tekst te verkrijgen.

$aantal_resultaten = 5;
$bericht = $aantal_resultaten . ‘resultaten gevonden’;

wordt in dit geval met sprintf en __() samengevoegd tot het volgende stuk code:

$aantal_resultaten = 5;
$bericht = sprintf( __(‘%s resultaten gevonden , ‘je_thema’) , $aantal_resultaten );

Hierin wordt $aantal_resultaten op de plek van de %s geplaatst wanneer de tekst voor de bezoeker zichtbaar wordt.

Teksten met enkelvoud en meervoud
Sommige onderdelen in je WordPress thema kunnen afhankelijk zijn van een bepaald aantal. Denk bijvoorbeeld aan reacties onder een bericht. Je kunt ervoor kiezen om het altijd als ‘reacties’ te vertalen, maar dit zal resulteren in ‘1 reacties’, wat natuurlijk niet mooi staat. Om dit probleem op te lossen, is het met WordPress mogelijk om een enkelvoud en meervoud van een bepaalde tekst op te geven. Zo kun je ervoor zorgen dat er zowel ‘1 reactie’ als ‘2 reacties’ als vertaling mogelijk is, afhankelijk van het voorgaande nummer.

De standaard functie hiervoor in WordPress is _n(‘ev’, ‘mv’, $aantal, ‘je_thema’). Hierin staat ‘ev’ voor de vertaling in enkelvoud, ‘mv’ voor de vertaling in meervoud en $aantal is het aantal dat gebruikt wordt in de huidige tekst. Een voorbeeld:

$rating = 3;
$tekst = sprintf( _n( '1 ster, '%s sterren, $rating, ‘je_thema’ ), $rating );

Dit zal resulteren in de tekst ‘3 sterren’.

Het nadeel van de _n() functie is dat hij in vertaalsoftware niet altijd goed wordt weergegeven. Hierbij komt het vaak voor dat alleen de eerste paramater (‘ev’) wordt gebruikt en je vervolgens dus alleen een vertaling voor de enkelvoud vorm kunt ingeven. Om dit probleem niet te hebben, kun je ervoor kiezen om je code anders op te schrijven als je met een enkelvoud en meervoud vorm te maken hebt. Het eerder gebruikte voorbeeld over de sterren kan bijvoorbeeld ook geschreven worden als:

$rating = 3;
if($rating == 1)
$tekst = __(‘1 ster’, ‘je_thema’);
else
$tekst = sprintf( __(‘%s sterren’, ‘je_thema’), $rating);

In dat geval worden ‘1 ster’ en ‘%s sterren’ altijd gevonden in het vertaalprogramma.

Wanneer je alle tekst in je WordPress thema bestanden op deze manier hebt omgeschreven, kun je met vertaalsoftware zoals POEdit een .POT bestand genereren en beginnen met het vertalen van het thema.

Als je vragen hebt, of er iets onduidelijk is in het artikel, neem dan gerust contact op of laat een reactie achter.