DeepL vs Google Translate vs AI: Het beste voor .po-bestanden?

Je exporteert een .pot vanuit je WordPress-plugin, plakt een paar honderd strings in DeepL of Google Translate, krijgt een nette Duitse kolom terug, dropt deze in je .po-bestand, compileert en lanceert. Dan meldt een gebruiker dat de winkelwagenpagina een rauwe %1$s toont waar een productnaam zou moeten staan, of erger nog, de prijsregel luidt You have 1 items in elke taal omdat de meervoudsvorm instortte. De vertaalkwaliteit was prima. De vertaalstructuur werd vernietigd.
Dat is de kern van de spanning in het DeepL vs Google Translate-debat wanneer de bron een gettext .po-bestand is in plaats van een paragraaf proza. Beide zijn van wereldklasse in het vertalen van natuurlijke zinnen. Geen van beide is ontworpen om een printf-placeholder, een Gettext meervoudsarray, of een msgctxt-disambiguatie te respecteren. Ze behandelen %1$s als een typfout die moet worden opgeruimd en een tweevoudig meervoud als een enkele zin die moet worden afgevlakt. Voor marketingteksten is dat onzichtbaar. Voor softwarelokalisatie breekt het sites.
Dit bericht vergelijkt klassieke machinevertaling - DeepL en Google Translate - met een contextbewuste AI-pijplijn die specifiek is gebouwd voor gettext. We zullen kijken naar de assen die er echt toe doen voor .po-bestanden: placeholder-afhandeling, meervoudsvormen, context, ondersteuning voor bulkbestanden en kosten. Als je de diepere LLM-versus-LLM kwaliteitsdiscussie wilt, hebben we die behandeld in AI-vertaalkwaliteit: Gemini vs GPT-4 vs DeepSeek. Hier is de vraag smaller en praktischer: wat is het beste voor .po-bestanden?
DeepL vs Google Translate: Waarvoor ze zijn gebouwd
Beide zijn algemene machinevertaalengines die zijn geoptimaliseerd voor vloeiende, natuurlijke taaloutput. Geen van beide parseert bestandsformaten.
DeepL - Vloeiend, maar formaatblind
DeepL wordt alom geprezen om de meest natuurlijk klinkende uitvoer, vooral in Europese talen. Maar het verwerkt tekst, geen structuur. Voer het een .po msgid met %1$s ordered %2$s en het vertaalt de woorden rond de placeholders, terwijl het regelmatig de tokens herordent, van afstand verandert of laat vallen - omdat ze voor DeepL slechts vreemde tekens in een zin zijn.
Google Translate - Brede dekking, dezelfde blinde vlek
Google Translate ondersteunt veel meer talen en is de standaard budgetoplossing achter plugins zoals GTranslate. De afhandeling van placeholders is niet beter. Beide engines delen dezelfde fundamentele beperking: ze optimaliseren de zinsvloeiendheid en hebben geen model van gettext-regels.
De echte vraag is niet kwaliteit - het is structuur
Voor .po-bestanden is ruwe linguïstische kwaliteit vanzelfsprekend. Hetgeen de productie breekt, is structurele integriteit: overleven de variabelen, blijven de meervouden meervoudig, wordt de context gerespecteerd? Dat is waar een gettext-bewuste AI-pijplijn DeepL en Google Translate voorbijstreeft.
Waarom placeholders en meervouden machinevertaling breken
Een .po-bestand is geen proza. Het is code-achtige tekst met strikte regels, en drie van die regels verslaan routinematig klassieke MT.
Verminking van placeholders en variabelen
WordPress-strings zitten vol met printf-achtige placeholders: %s, %d, en positionele vormen zoals %1$s en %2$s. De positionele zijn belangrijk omdat sommige talen de zin herordenen, en de nummers vertellen sprintf welk argument waar hoort. Kijk wat klassieke MT hiermee doet:
// Source string in your .po file
$msg = sprintf( __( '%1$s left a comment on %2$s', 'mytheme' ), $user, $post );
// What DeepL / Google Translate often return (German):
// "%2$s hat einen Kommentar zu %1$s hinterlassen" <- reordered, OK
// "% 1$ s hat einen Kommentar..." <- spaces injected, BROKEN
// "hat einen Kommentar hinterlassen" <- placeholders dropped, BROKEN
Een enkele ingevoegde spatie (% 1$ s) of een weggelaten token veroorzaakt een PHP-waarschuwing of print ruwe code naar je gebruikers. We gaan dieper in op deze faalmodus in hoe je PO-bestanden vertaalt zonder codevariabelen te breken.
Meervoudsvormen storten in
Gettext-meervouden zijn geen enkele string – het zijn een array gesleuteld aan de meervoudsregel van de taal. Engels heeft twee vormen; Pools heeft er drie; Arabisch heeft er zes. Klassieke MT ontvangt de msgid_plural als twee afzonderlijke zinnen en vertaalt deze onafhankelijk, zonder besef dat ze een coherent meerledig geheel moeten blijven. Het resultaat is vaak een enkele vorm die wordt gedupliceerd, zodat 1 item en 5 items identiek worden weergegeven.
msgid "%d item in your cart"
msgid_plural "%d items in your cart"
msgstr[0] ""
msgstr[1] ""
# A gettext-aware pipeline fills BOTH forms correctly with %d preserved.
# DeepL/Google translate each line in isolation and lose the plural relationship.
Context (msgctxt) wordt genegeerd
Gettext gebruikt msgctxt om identieke strings te disambigueren –