.po vs .mo vs .pot: WordPress vertaalbestanden uitgelegd

U opent de languages map van een WordPress thema en vindt drie bestanden die er bijna identiek uitzien: twentytwentyfour.pot, twentytwentyfour-de_DE.po, en twentytwentyfour-de_DE.mo. Hetzelfde thema, dezelfde taal, drie verschillende extensies. Welke bewerkt u? Welke laadt WordPress eigenlijk? En waarom verdwijnen uw vertalingen geruisloos als u de verkeerde bewerkt?
Als u zich ooit heeft afgevraagd welk bestand belangrijk is in het po vs mo bestand debat, dan bent u niet de enige. Deze drie extensies vormen de ruggengraat van elke vertaalde WordPress site, maar het verschil ertussen brengt zowel beginners als ervaren ontwikkelaars in verwarring. Bewerk het verkeerde bestand en uw Duitse bezoekers zien nog steeds Engels. Bewerk het juiste, maar sla een stap over, en er verandert ook niets.
Deze gids legt precies uit wat .pot, .po en .mo bestanden zijn, hoe ze zich verhouden binnen de GNU Gettext workflow, waar ze zich bevinden in WordPress, en waarom u nooit een .mo bestand in een teksteditor zou moeten openen. Aan het einde weet u welk bestand u moet aanraken en welk u met rust moet laten.
Wat zijn .pot-, .po- en .mo-bestanden?
Kortom: een .pot bestand is de lege sjabloon, een .po bestand is uw bewerkbare vertaling, en een .mo bestand is de gecompileerde binaire versie die WordPress tijdens runtime leest. Ze vormen een keten, en elke schakel heeft precies één taak.
Deze drie formaten komen allemaal van GNU Gettext, het lokalisatiesysteem waarop WordPress, Drupal en duizenden PHP- en C-projecten vertrouwen. Gettext scheidt de bronstrings die een ontwikkelaar schrijft van de vertalingen die een vertaler levert, zodat dezelfde codebase tientallen talen kan spreken zonder ook maar één regel PHP aan te raken.
Denk eraan als een receptenkaartje. Het .pot is het lege kaartje met ingrediëntenplaatsen, maar zonder hoeveelheden. Het .po is het kaartje dat is ingevuld voor één specifiek gerecht. Het .mo is de gelamineerde, machinaal scanbare kopie die de keuken daadwerkelijk gebruikt tijdens het serveren. U schrijft op het papieren kaartje; u krabbelt nooit op de gelamineerde.
Het .pot-bestand: De mastersjabloon
Een .pot bestand (Portable Object Template) bevat elke vertaalbare string in een thema of plugin met de vertalingen leeg gelaten. Het is de masterlijst die ontwikkelaars meeleveren, zodat vertalers precies weten wat er vertaald moet worden. De msgstr regels zijn leeg omdat er nog geen taal is gekozen.
#: includes/checkout.php:42
msgid "Add to Cart"
msgstr ""
#: includes/account.php:108
msgid "Your order has been shipped to %s"
msgstr ""
Let op de lege msgstr "". Een .pot is een sjabloon, geen vertaling. U kopieert het één keer per taal en vult de lege velden in. U bewerkt zelden een .pot handmatig; het wordt opnieuw gegenereerd vanuit de broncode wanneer strings veranderen.
Het .po-bestand: Uw handmatig bewerkbare vertaling
Een .po bestand (Portable Object) is een kopie van de .pot met de msgstr regels ingevuld voor één taal. Dit is het bestand dat vertalers en ontwikkelaars daadwerkelijk bewerken. Het is platte tekst, menselijk leesbaar en versiebeheer-vriendelijk.
#: includes/checkout.php:42
msgid "Add to Cart"
msgstr "In den Warenkorb"
#: includes/account.php:108
msgid "Your order has been shipped to %s"
msgstr "Ihre Bestellung wurde an %s versandt"
De msgid is de originele Engelse bronstring en mag nooit veranderen. De msgstr is uw vertaling. De %s is een placeholder die onaangeroerd in de vertaling moet blijven — het weglaten of opnieuw rangschikken ervan is de meest voorkomende oorzaak van kapotte lay-outs, wat we uitgebreid behandelen in hoe PO-bestanden te vertalen zonder codevariabelen te breken.
Het .mo-bestand: De gecompileerde binaire code
Een .mo bestand (Machine Object) is de gecompileerde, binaire versie van uw .po. WordPress kan .po bestanden niet efficiënt lezen tijdens runtime, dus laadt het in plaats daarvan de voorgecompileerde .mo. Het openen van een .mo in een teksteditor toont onleesbare bytes — het is bedoeld voor machines, niet voor mensen.
Wanneer WordPress load_textdomain() of load_theme_textdomain() aanroept, zoekt het naar een .mo bestand, parseert de binaire hashtabel ervan, en wisselt elke msgid om voor de overeenkomstige msgstr on-the-fly. Dit binaire formaat maakt zoekopdrachten snel, zelfs op sites met duizenden strings.
Hoe verhouden de drie bestanden zich tot elkaar in de Gettext workflow?
Ze vormen een eenrichtingspijplijn: broncode wordt een .pot, de .pot wordt een taal-specifieke .po, en elke .po compileert naar een .mo. Vertalingen stromen altijd bergafwaarts.
Hier is de volledige levenscyclus in volgorde:
- Een ontwikkelaar omhult user-facing strings in Gettext functies zoals
__()en_e()binnen de PHP broncode. - Een scan-tool leest de broncode en genereert de
.potsjabloon die elke omhulde string bevat. - Een vertaler kopieert de
.potnaar een taal-specifieke.po(bijvoorbeeldde_DE.po) en vult elkemsgstrin. - Het voltooide
.powordt gecompileerd naar een binaire.mo. - WordPress laadt de
.motijdens runtime en toont de vertaalde site.
Wanneer de ontwikkelaar later nieuwe strings toevoegt, wordt de .pot opnieuw gegenereerd, worden de nieuwe vermeldingen samengevoegd in elke bestaande .po (waarbij oude vertalingen behouden blijven), vult de vertaler de gaten, en wordt de .po opnieuw gecompileerd naar .mo. De cyclus herhaalt zich gedurende de levensduur van het project.
De cruciale les: u bewerkt de .po, en compileert vervolgens naar .mo. U bewerkt nooit de .mo direct, en u vertaalt nooit binnen de .pot. Als u een dieper, end-to-end beeld wilt, leidt de ultieme gids voor WordPress lokalisatie u door de hele pijplijn met voorbeelden.
Naamgevingsconventies en waar de bestanden zich bevinden
WordPress is strikt over bestandsnamen. Als de naamgeving verkeerd is, wordt uw perfect vertaalde .mo eenvoudigweg genegeerd, omdat WordPress zoekt naar een exacte match op basis van het tekstdomein en de locale.
Het naamgevingspatroon voor thema- en pluginvertalingen is:
# Pattern: textdomain-locale.po / .mo
twentytwentyfour-de_DE.po # German (Germany) translation
twentytwentyfour-de_DE.mo # compiled binary WordPress loads
twentytwentyfour-fr_FR.po # French (France)
twentytwentyfour.pot # template, no locale suffix
De textdomain komt overeen met de string die als tweede argument wordt doorgegeven aan Gettext functies zoals __( 'Add to Cart', 'twentytwentyfour' ). De locale is een WordPress locale code zoals de_DE, fr_FR, of pt_BR. De .pot sjabloon heeft geen locale achtervoegsel omdat deze taalneutraal is.
De locatie is net zo belangrijk als de naamgeving. WordPress zoekt op een paar voorspelbare paden:
- Themavertalingen worden geleverd in de eigen
wp-content/themes/your-theme/languages/map van het thema. - Pluginvertalingen worden geleverd in
wp-content/plugins/your-plugin/languages/. - Vertalingen van translate.wordpress.org en gebruikers-overrides komen terecht in de globale
wp-content/languages/themes/enwp-content/languages/plugins/mappen, die prioriteit hebben en updates overleven.
Plaats een correct benoemd de_DE.mo in de juiste map en Duitse bezoekers zien Duits. Plaats het één map te diep, of spel het tekstdomein verkeerd, en WordPress valt geruisloos terug op Engels zonder foutmelding. Als uw vertalingen niet verschijnen, is een onjuiste naamgeving of pad de gebruikelijke boosdoener, en de probleemoplossingsgids voor ontbrekende vertalingen behandelt elke veelvoorkomende oorzaak.
Waarom u nooit een .mo-bestand direct moet bewerken
Omdat een .mo een gecompileerd binair bestand is, is er geen veilige manier om het handmatig te bewerken — en elke wijziging die u forceert, wordt overschreven de volgende keer dat de .po opnieuw wordt gecompileerd. De .po is de bron van waarheid; de .mo is een wegwerpbaar build-artefact.
Deze ene regel verklaart een groot deel van de supporttickets met de melding "mijn vertaling is gewijzigd, maar de site is niet bijgewerkt". Iemand past een string aan, slaat de .po op en vergeet de .mo opnieuw te compileren. WordPress blijft de oude binaire versie laden, waardoor de nieuwe formulering nooit verschijnt. De oplossing is altijd: .po bewerken, opnieuw compileren naar .mo, opnieuw laden.
Er is een tweede reden waarom de regel belangrijk is: .mo bestanden zijn niet diff-vriendelijk in versiebeheer. Omdat ze binair zijn, produceert een kleine wijziging in de formulering een ondoorzichtige blob in uw Git-geschiedenis die geen enkele reviewer kan lezen. Door de .po te bewaren als de getraceerde bron van waarheid en de .mo te behandelen als een gegenereerd artefact, blijft uw repository controleerbaar en uw vertalingen traceerbaar.
Dit handmatig doen voor tientallen talen is vervelend en foutgevoelig. Dit is waar een cloud workflow echte tijd bespaart. Tools zoals SimplePoTranslate vertalen uw .po strings en geven een enkele ZIP terug met de overeenkomstige .po en .mo samen — al gecompileerd, correct benoemd, klaar om in wp-content/languages/ te plaatsen. Er is niets handmatig te compileren en geen kans op een verouderde .mo.
Het past ook Syntax Locking toe, wat elke placeholder zoals %s, %1$s, en {name}, plus HTML tags, blokkeert vóór vertaling. Uw variabelen blijven intact, zodat u nooit een .mo verstuurt die een lay-out kapotmaakt. En omdat het volledig in de cloud draait, is er geen extra plugin die uw site vertraagt — u uploadt een bestand en downloadt voltooide, gecompileerde vertalingen.
Alles samenvatten
Zodra het onderscheid tussen po vs mo bestand duidelijk wordt, voelt het hele WordPress vertaalsysteem niet langer mysterieus aan. De .pot is de sjabloon van de ontwikkelaar, de .po is de bewerkbare werkkopie van de vertaler, en de .mo is de gecompileerde binaire code die WordPress daadwerkelijk aan bezoekers presenteert. Vertalingen stromen in één richting — sjabloon naar .po naar .mo — en u bewerkt altijd alleen de middelste handmatig.
Onthoud de drie regels die negentig procent van de vertaalproblemen voorkomen: vertaal nooit binnen een .pot, compileer altijd de .mo opnieuw na het bewerken van een .po, en zorg ervoor dat de textdomain-locale naamgeving exact overeenkomt. Volg deze en uw vertaalde strings zullen elke keer verschijnen.
Klaar om te stoppen met worstelen met het handmatig compileren en benoemen van vertaalbestanden? Probeer SimplePoTranslate gratis — geen creditcard vereist. Upload uw
.poof.poten ontvang binnen enkele minuten een kant-en-klaar.po+.mobundel terug op de gratis tier.