Jak kompilovat soubory .po do .mo (4 metody)

Strávili jste odpoledne zdokonalováním německého překladu. Každý řetězec ve vašem souboru de_DE.po vypadá perfektně, zástupné symboly jsou nedotčené, množná čísla správná. Nahrajete ho na svůj web, přepnete jazyk na němčinu a... nic. Stránka je stále v angličtině. Dvakrát zkontrolujete název souboru, složku, textovou doménu. Vše vypadá správně. Proč tedy WordPress nezobrazuje váš překlad?
V devíti z deseti případů je odpověď stejná: upravili jste .po, ale nikdy jste ho nezkompilovali do .mo. WordPress za běhu nenačítá soubory .po — načítá zkompilovaný binární soubor .mo. Chcete-li, aby se vaše překlady skutečně zobrazily, musíte kompilovat po do mo pokaždé, když změníte text. .po je váš upravitelný zdroj; .mo je to, co web zobrazuje.
Tato příručka vysvětluje, proč tento kompilační krok existuje, a poté představuje čtyři spolehlivé způsoby, jak ho provést: WP-CLI, klasický příkaz msgfmt, Poedit a cloudový nástroj, který vám .mo vygeneruje automaticky. Také se budeme zabývat nejčastější nástrahou — zapomenutím rekompilace — a novějším formátem .l10n.php, který WordPress nyní preferuje pro rychlost.
Proč WordPress načítá .mo a ne .po?
WordPress načítá soubory .mo, protože se jedná o zkompilované binární soubory optimalizované pro rychlé vyhledávání, zatímco soubory .po jsou prostý text určený pro čtení a úpravu lidmi. Parsování textu při každém načtení stránky by bylo pomalé; čtení předem vytvořené binární hash tabulky je téměř okamžité.
Soubor .po je řádkový a uživatelsky přívětivý. Každá položka spojuje zdrojový msgid s přeloženým msgstr, plus komentáře uvádějící, odkud řetězec pochází. To je skvělé pro úpravy, ale hrozné pro výkon — server by musel při každém požadavku znovu parsovat celý textový soubor.
#: includes/cart.php:88
msgid "Your cart is empty"
msgstr "Ihr Warenkorb ist leer"
Soubor .mo balí stejné dvojice řetězců do binárního formátu s interní vyhledávací tabulkou, takže WordPress může přejít přímo k překladu, aniž by skenoval text. Nevýhodou je, že .mo je pro lidi nečitelný a musí být znovu vygenerován, kdykoli se .po změní. Pokud je rozdíl mezi .po a .mo stále nejasný, náš vysvětlující článek o .po vs .mo vs .pot souborech podrobně rozebírá každý formát a jejich vzájemné vztahy.
Čtyři způsoby, jak kompilovat po do mo
Neexistuje jediný „správný“ nástroj — nejlepší volba závisí na tom, jak už pracujete. Níže jsou uvedeny čtyři spolehlivé metody, od jednořádkového příkazu až po plně automatizovaný cloudový pracovní postup. Všechny čtyři vytvářejí identický binární soubor .mo, který WordPress načítá za běhu.
Metoda 1: WP-CLI
Nejčistší moderní přístup je WP-CLI, který dokáže zkompilovat celou složku souborů .po jedním příkazem. Pokud již spravujete WordPress z příkazového řádku, tato metoda přirozeně zapadá do vašeho pracovního postupu.
# Compile every .po file in the languages folder to .mo
wp i18n make-mo languages/
# Compile into a specific destination directory
wp i18n make-mo languages/ build/languages/
Příkaz make-mo prohledá cílový adresář, zkompiluje každý nalezený .po soubor a zapíše odpovídající .mo soubor vedle něj (nebo do určeného cíle). Ladně zpracovává dávky, což ho činí ideálním, pokud spravujete mnoho jazyků najednou. Je to doporučený nástroj pro jakýkoli projekt, který již používá WP-CLI.
Metoda 2: msgfmt
Původní nástroj Gettext pro tuto práci je msgfmt, součást balíčku GNU gettext. Kompiluje jeden .po soubor do jednoho .mo souboru a je dostupný prakticky na každém systému Linux a macOS.
# Compile one file
msgfmt my-plugin-de_DE.po -o my-plugin-de_DE.mo
# Add statistics about translated, fuzzy, and untranslated strings
msgfmt --statistics my-plugin-de_DE.po -o my-plugin-de_DE.mo
# Install it first if missing
# macOS: brew install gettext
# Debian: sudo apt-get install gettext
Příznak -o pojmenuje výstupní soubor. Příznak --statistics je skutečně užitečný — řekne vám, kolik řetězců je přeloženo, „fuzzy“ nebo stále prázdných, takže zachytíte neúplný překlad, než ho nasadíte. Pro skriptování jednoho souboru najednou je msgfmt spolehlivou volbou bez zbytečných kudrlinek.
Protože msgfmt je jednoduchý nástroj příkazového řádku, snadno se začlení do automatizace. Můžete ho zabalit do shell smyčky pro kompilaci celé složky, nebo ho zapojit do CI pipeline, aby každý commit, který se dotkne souboru .po, automaticky vygeneroval čerstvý .mo. Běžným vzorem je for f in languages/*.po; do msgfmt "$f" -o "${f%.po}.mo"; done, který zkompiluje každý jazyk v jednom průchodu. Příznak --check přidává validaci, označující neshody formátovacích řetězců mezi msgid a msgstr dříve, než se dostanou do produkce — levná ochrana proti chybám s nefunkčními zástupnými symboly, které tiše poškozují přeložená rozvržení.
Metoda 3: Poedit (kompiluje při uložení)
Pokud upravujete překlady v grafickém editoru, Poedit za vás kompiluje automaticky. Pokaždé, když uložíte soubor .po, Poedit zapíše odpovídající .mo hned vedle něj — žádný samostatný příkaz, žádný další krok.
To je jeden z důvodů, proč Poedit zůstává populární mezi překladateli, kteří se necítí jistě v příkazovém řádku. Otevřete .po, napíšete své překlady, stisknete uložit a oba soubory se aktualizují společně. Chování můžete potvrdit v nastavení Poeditu, kde je automatická kompilace .mo při uložení ve výchozím nastavení povolena. Poedit a podobné desktopové nástroje jsou recenzovány v článku 5 nejlepších bezplatných nástrojů pro úpravu a překlad souborů PO na Macu a Windows.
Háček s desktopovým editorem je v tom, že kompilace probíhá pouze tehdy, když člověk soubor otevře a uloží. To je v pořádku pro projekt jedné osoby, ale nemění to rozsah na tucet jazyků nebo tým, který si soubory předává sem a tam. Pokud někdo upraví .po v jiném nástroji a zkopíruje ho do úložiště, aniž by otevřel Poedit, .mo se nikdy neaktualizuje. Pro větší nebo kolaborativní projekty automatizovaná metoda — příkazový řádek nebo cloud — odstraňuje tuto závislost na pamatování si stisknutí uložit.
Metoda 4: Cloudový nástroj, který vám vygeneruje .mo
Čtvrtá možnost zcela odstraňuje kompilační krok: použijte cloudovou službu, která vrátí zkompilovaný soubor .mo společně s přeloženým .po. Nikdy nespouštíte příkaz ani neukládáte soubor dvakrát — nahrajete a hotové, správně pojmenované soubory se vrátí.
SimplePoTranslate funguje přesně takto. Nahrajete soubor .po nebo .pot, přeloží řetězce pomocí Context-Aware AI a vrátí jeden ZIP obsahující soubory .po a .mo vygenerované vedle sebe — již zkompilované, již pojmenované tak, aby odpovídaly vaší textové doméně a lokalizaci. Neexistuje žádný samostatný kompilační průchod a žádná šance na zapomenutí.
Zpracovává také detaily, které narušují manuální pracovní postupy. Syntax Locking zmrazí zástupné symboly jako %s, %1$s a {name} a také HTML tagy před překladem, takže vaše proměnné zůstanou v .mo neporušené. Plná podpora Gettext plural znamená, že se správně kompilují i složité tvary množného čísla — téma, které stojí za hlubší pochopení a kterému se věnujeme v článku pochopení Gettext množného čísla. A protože běží v cloudu, není třeba instalovat žádný plugin ani udržovat žádné nástroje pro sestavení.
Nejčastější nástraha: Zapomněli jste rekompilovat
Největším důvodem, proč se překlady nezobrazují, je úprava souboru .po, ale zapomenutí rekompilace .mo. WordPress stále načítá starý binární soubor, takže se vaše čerstvé znění nikdy nezobrazí — a neexistuje žádná chybová zpráva, která by vám řekla proč.
Mentální model, který si zapamatujte: .po je váš koncept, .mo je to, co se nasadí. Jakákoli změna v .po je pro WordPress neviditelná, dokud nevygenerujete .mo. Udělejte z rekompilace reflex po každé úpravě, nebo použijte nástroj, který kompiluje automaticky, aby se tento krok nikdy nepřeskočil.
Tato nástraha je obzvláště zákeřná při předávání z testovacího do produkčního prostředí. Vývojář lokálně upraví a rekompiluje, vidí, že překlad funguje, poté nasadí pouze .po a zapomene na .mo — takže produkce tiše zachová starý text. Kdykoli přesouváte soubory s překlady mezi prostředími, přesuňte .po a čerstvě zkompilovaný .mo dohromady, nebo kompilujte jako součást vašeho kroku nasazení, aby byl binární soubor vždy znovu sestaven z aktuálního zdroje.
Pokud se vaše překlady po rekompilaci stále nezobrazují, problémem je obvykle nesoulad v pojmenování, špatná složka nebo vrstva cache, která drží starý soubor. Kompletní kontrolní seznam naleznete v článku proč se vaše překlady nezobrazují ve WordPressu.
Poznámka k novějšímu formátu .l10n.php
Nedávné verze WordPressu zavedly třetí formát pro běh: .l10n.php. Namísto binárního souboru .mo jsou překlady uloženy jako obyčejné PHP pole, které může PHP opcode cache držet v paměti, což činí vyhledávání ještě rychlejší než .mo na vytížených webech.
<?php
return [
'domain' => 'my-plugin',
'messages' => [ 'Your cart is empty' => 'Ihr Warenkorb ist leer' ],
];
WordPress generuje soubory .l10n.php automaticky, když má k dispozici odpovídající .mo, takže je nemusíte vytvářet ručně. Prozatím zůstává kompilace správného .mo základem — formát pro výkon je z něj odvozen.
Závěr
Chcete-li spolehlivě kompilovat po do mo, vyberte si metodu, která odpovídá vašemu způsobu práce: WP-CLI pro dávkové zpracování z příkazového řádku, msgfmt pro jednotlivé soubory se statistikami, Poedit pro automatickou kompilaci při uložení, nebo cloudový nástroj, který vám .mo vytvoří, aby se tento krok nikdy nevynechal. Všechny čtyři metody produkují stejný binární soubor, který WordPress potřebuje za běhu.
Ať už si vyberete jakoukoli cestu, pamatujte na zlaté pravidlo: upravte .po, poté zkompilujte do .mo — pokaždé. Tento jeden zvyk zabraňuje nejfrustrující chybě v překladech WordPressu, kdy vše vypadá správně, ale web tvrdohlavě zůstává v angličtině.
Jste připraveni přeskočit ruční kompilační krok nadobro? Vyzkoušejte SimplePoTranslate zdarma — není vyžadována kreditní karta. Nahrajte svůj
.poa stáhněte si připravený balíček.po+.mona bezplatné úrovni během několika minut.