Cum să compilezi fișiere .po în .mo (4 Metode)

Ai petrecut o după-amiază perfecționând o traducere în limba germană. Fiecare șir din fișierul tău de_DE.po se citește frumos, placeholder-ele sunt intacte, formele de plural sunt corecte. Îl încarci pe site-ul tău, schimbi limba în germană și... nimic. Pagina este încă în engleză. Verifici din nou numele fișierului, folderul, domeniul de text. Totul pare în regulă. Atunci de ce nu afișează WordPress traducerea ta?
De nouă ori din zece răspunsul este același: ai editat .po-ul, dar nu l-ai compilat niciodată în .mo. WordPress nu citește fișierele .po la rulare — încarcă fișierul binar compilat .mo. Dacă vrei ca traducerile tale să apară efectiv, trebuie să compilezi po în mo de fiecare dată când modifici textul. .po este sursa ta editabilă; .mo este ceea ce servește site-ul.
Acest ghid explică de ce există acest pas de compilare și apoi prezintă patru modalități fiabile de a o face: WP-CLI, comanda clasică msgfmt, Poedit și un instrument cloud care produce .mo-ul pentru tine automat. Vom acoperi, de asemenea, cea mai comună capcană — uitarea recompilării — și noul format .l10n.php pe care WordPress îl preferă acum pentru viteză.
De ce încarcă WordPress fișierele .mo și nu pe cele .po?
WordPress încarcă fișiere .mo deoarece sunt binare compilate, optimizate pentru căutări rapide, în timp ce fișierele .po sunt text simplu create pentru a fi citite și editate de oameni. Analizarea textului la fiecare încărcare de pagină ar fi lentă; citirea unei tabele hash binare preconstruite este aproape instantanee.
Un fișier .po este bazat pe linii și ușor de utilizat. Fiecare intrare împerechează un msgid sursă cu un msgstr tradus, plus comentarii care notează de unde provine șirul. Acest lucru este excelent pentru editare, dar teribil pentru performanță — serverul ar trebui să re-analizeze întregul fișier text la fiecare cerere.
#: includes/cart.php:88
msgid "Your cart is empty"
msgstr "Ihr Warenkorb ist leer"
Un fișier .mo împachetează aceleași perechi de șiruri într-un format binar cu o tabelă de căutare internă, astfel încât WordPress poate sări direct la o traducere fără a scana textul. Dezavantajul este că .mo este ilizibil pentru oameni și trebuie regenerat ori de câte ori se modifică .po-ul. Dacă distincția dintre .po și .mo este încă neclară, ghidul nostru explicativ despre fișierele .po vs .mo vs .pot detaliază fiecare format și modul în care acestea se relaționează.
Patru moduri de a compila po în mo
Nu există un singur instrument „corect” — cea mai bună alegere depinde de modul în care lucrezi deja. Mai jos sunt patru metode fiabile, de la o comandă pe o singură linie la un flux de lucru cloud complet automatizat. Toate cele patru produc același fișier binar .mo pe care WordPress îl încarcă la rulare.
Metoda 1: WP-CLI
Cea mai curată abordare modernă este WP-CLI, care poate compila un întreg folder de fișiere .po într-o singură comandă. Dacă gestionezi deja WordPress din linia de comandă, aceasta se potrivește natural în fluxul tău de lucru.
# 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/
Comanda make-mo scanează directorul țintă, compilează fiecare fișier .po pe care îl găsește și scrie un fișier .mo corespunzător lângă acesta (sau în destinația specificată). Gestionează loturile cu ușurință, ceea ce îl face ideal atunci când menții multe limbi simultan. Este instrumentul recomandat pentru orice proiect care utilizează deja WP-CLI.
Metoda 2: msgfmt
Utilitarul original Gettext pentru această sarcină este msgfmt, parte a pachetului GNU gettext. Acesta compilează un singur fișier .po într-un singur .mo și este disponibil pe aproape fiecare sistem Linux și 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
Flag-ul -o numește fișierul de ieșire. Flag-ul --statistics este cu adevărat util — îți spune câte șiruri sunt traduse, neclare (fuzzy) sau încă goale, astfel încât să poți identifica o traducere incompletă înainte de a o lansa. Pentru scriptarea unui fișier la un moment dat, msgfmt este alegerea fiabilă, fără bătăi de cap.
Deoarece msgfmt este un instrument simplu de linie de comandă, se integrează perfect în automatizare. Îl poți include într-o buclă shell pentru a compila un întreg folder, sau îl poți integra într-un pipeline CI, astfel încât fiecare commit care modifică un fișier .po să producă automat un .mo proaspăt. Un model comun este for f in languages/*.po; do msgfmt "$f" -o "${f%.po}.mo"; done, care compilează fiecare limbă într-o singură trecere. Flag-ul --check adaugă validare, semnalând nepotrivirile format-string între msgid și msgstr înainte ca acestea să ajungă în producție — o măsură de siguranță ieftină împotriva erorilor de placeholder spart care corup în tăcere layout-urile traduse.
Metoda 3: Poedit (Compilare la Salvare)
Dacă editezi traduceri într-un editor grafic, Poedit compilează automat pentru tine. De fiecare dată când salvezi un fișier .po, Poedit scrie fișierul .mo corespunzător chiar lângă el — fără comandă separată, fără pas suplimentar.
Acesta este unul dintre motivele pentru care Poedit rămâne popular printre traducătorii care nu se simt confortabil cu linia de comandă. Deschizi fișierul .po, tastezi traducerile, apeși salvare și ambele fișiere se actualizează împreună. Poți confirma comportamentul în preferințele Poedit, unde compilarea automată a fișierelor .mo la salvare este activată implicit. Poedit și instrumente desktop similare sunt analizate în top 5 instrumente gratuite pentru editarea și traducerea fișierelor PO pe Mac și Windows.
Dezavantajul unui editor desktop este că compilarea are loc doar atunci când un om deschide fișierul și îl salvează. Acest lucru este în regulă pentru un proiect individual, dar nu se scalează la o duzină de limbi sau o echipă care își transmite fișierele reciproc. Dacă cineva editează un fișier .po într-un alt instrument și îl copiază în depozit fără a deschide Poedit, fișierul .mo nu se actualizează niciodată. Pentru proiecte mai mari sau colaborative, o metodă automatizată — linie de comandă sau cloud — elimină această dependență de a-și aminti să apese salvare.
Metoda 4: Un instrument cloud care generează fișierul .mo pentru tine
A patra opțiune elimină complet pasul de compilare: utilizează un serviciu cloud care returnează fișierul .mo compilat împreună cu fișierul .po tradus. Nu execuți niciodată o comandă și nu salvezi un fișier de două ori — tu încarci, iar fișierele finalizate, denumite corect, ți se returnează.
SimplePoTranslate funcționează exact în acest fel. Încarci un fișier .po sau .pot, acesta traduce șirurile cu Context-Aware AI și îți returnează un singur ZIP care conține .po și .mo generate una lângă alta — deja compilate, deja denumite pentru a se potrivi cu domeniul tău de text și cu setările regionale. Nu există un pas de compilare separat și nicio șansă de a uita unul.
De asemenea, gestionează detaliile care strică fluxurile de lucru manuale. Blocarea Sintaxei îngheață placeholder-ele precum %s, %1$s și {name}, plus etichetele HTML înainte de traducere, astfel încât variabilele tale să rămână intacte în fișierul .mo. Suportul complet pentru Gettext plural înseamnă că și formele complexe de plural se compilează corect — un subiect care merită înțeles în profunzime, pe care îl abordăm în înțelegerea pluralelor Gettext. Și deoarece rulează în cloud, nu există niciun plugin de instalat și niciun instrument de construire de întreținut.
Cea mai frecventă capcană: ai uitat să recompilzi
Cel mai mare motiv pentru care traducerile nu apar este editarea fișierului .po dar uitarea recompilării fișierului .mo. WordPress continuă să încarce binarul vechi, astfel încât formularea ta proaspătă nu apare niciodată — și nu există niciun mesaj de eroare care să-ți spună de ce.
Modelul mental de reținut: .po este ciorna ta, .mo este ceea ce se livrează. Orice modificare a fișierului .po este invizibilă pentru WordPress până când regenerezi fișierul .mo. Fă din recompilare un reflex după fiecare editare, sau folosește un instrument care compilează automat, astfel încât pasul să nu poată fi niciodată omis.
Această capcană este deosebit de insidioasă la transferurile de la staging la producție. Un dezvoltator editează și recompilă local, vede traducerea funcționând, apoi implementează doar fișierul .po și uită fișierul .mo — astfel, producția păstrează în tăcere textul vechi. Ori de câte ori muți fișiere de traducere între medii, mută fișierul .po și fișierul .mo proaspăt compilat împreună, sau compilează ca parte a pasului de implementare, astfel încât binarul să fie întotdeauna reconstruit din sursa curentă.
Dacă traducerile tale refuză în continuare să apară după recompilare, problema este de obicei o nepotrivire de denumire, un folder greșit sau un strat de caching care reține fișierul vechi. Lista completă de verificare se găsește în de ce traducerile tale nu apar în WordPress.
O notă despre noul format .l10n.php
Versiunile recente de WordPress au introdus un al treilea format de rulare: .l10n.php. În loc de un fișier binar .mo, traducerile sunt stocate ca un array PHP simplu pe care cache-ul de opcode PHP îl poate reține în memorie, făcând căutările chiar mai rapide decât .mo pe site-urile aglomerate.
<?php
return [
'domain' => 'my-plugin',
'messages' => [ 'Your cart is empty' => 'Ihr Warenkorb ist leer' ],
];
WordPress generează fișiere .l10n.php automat atunci când are disponibil fișierul .mo corespunzător, deci nu trebuie să le construiești manual. Pentru moment, compilarea unui fișier .mo corect rămâne fundamentul — formatul de performanță este derivat din acesta.
Încheiere
Pentru a compila po în mo în mod fiabil, alege metoda care se potrivește cu modul tău de lucru: WP-CLI pentru loturi din linia de comandă, msgfmt pentru fișiere individuale cu statistici, Poedit pentru compilare automată la salvare, sau un instrument cloud care construiește .mo-ul pentru tine, astfel încât pasul să nu fie niciodată omis. Toate patru produc același fișier binar de care WordPress are nevoie la rulare.
Indiferent de calea pe care o alegi, reține regula de aur: editează fișierul .po, apoi compilează-l în .mo — de fiecare dată. Acest obicei unic previne cea mai frustrantă eroare de traducere din WordPress, cea în care totul pare în regulă, dar site-ul rămâne încăpățânat în engleză.
Ești gata să sari peste pasul de compilare manuală pentru totdeauna? Încearcă SimplePoTranslate gratuit — nu este necesar un card de credit. Încarcă-ți fișierul
.poși descarcă un pachet.po+.mogata de implementat, la nivelul gratuit, în câteva minute.