.po vs .mo vs .pot: Fișierele de Traducere WordPress Explicate

Deschizi folderul languages al unei teme WordPress și găsești trei fișiere care arată aproape identic: twentytwentyfour.pot, twentytwentyfour-de_DE.po și twentytwentyfour-de_DE.mo. Aceeași temă, aceeași limbă, trei extensii diferite. Pe care o editezi? Pe care o încarcă de fapt WordPress? Și de ce editarea fișierului greșit face ca traducerile tale să dispară în liniște?
Dacă te-ai întrebat vreodată care fișier contează în dezbaterea fișier .po vs .mo, nu ești singur. Aceste trei extensii sunt coloana vertebrală a fiecărui site WordPress tradus, totuși diferența dintre ele îi încurcă atât pe începători, cât și pe dezvoltatorii experimentați. Editează fișierul greșit și vizitatorii tăi germani vor vedea în continuare engleza. Editează-l pe cel corect, dar sari un pas și nimic nu se va schimba.
Acest ghid explică exact ce sunt fișierele .pot, .po și .mo, cum se relaționează în cadrul fluxului de lucru GNU Gettext, unde se găsesc în WordPress și de ce nu ar trebui să deschizi niciodată un fișier .mo într-un editor de text. Până la final vei ști ce fișier să atingi și pe care să-l lași în pace.
Ce sunt fișierele .pot, .po și .mo?
Pe scurt: un fișier .pot este șablonul gol, un fișier .po este traducerea ta editabilă, iar un fișier .mo este binarul compilat pe care WordPress îl citește la rulare. Ele formează un lanț, iar fiecare verigă are exact o singură sarcină.
Toate aceste trei formate provin de la GNU Gettext, sistemul de localizare pe care se bazează WordPress, Drupal și mii de proiecte PHP și C. Gettext separă șirurile sursă scrise de un dezvoltator de traducerile oferite de un traducător, astfel încât aceeași bază de cod să poată vorbi zeci de limbi fără a atinge o singură linie de PHP.
Gândește-te la el ca la o fișă de rețetă. Fișierul .pot este fișa goală cu spații pentru ingrediente, dar fără cantități. Fișierul .po este fișa completată pentru un anumit fel de mâncare. Fișierul .mo este copia laminată, scanabilă de mașină, pe care bucătăria o folosește de fapt în timpul servirii. Scrii pe fișa de hârtie; nu mâzgălești niciodată pe cea laminată.
Fișierul .pot: Șablonul Principal
Un fișier .pot (Portable Object Template) conține fiecare șir traductibil dintr-o temă sau un plugin, cu traducerile lăsate goale. Este lista principală pe care dezvoltatorii o livrează pentru ca traducătorii să știe exact ce trebuie tradus. Liniile msgstr sunt goale deoarece nu a fost încă aleasă nicio limbă.
#: includes/checkout.php:42
msgid "Add to Cart"
msgstr ""
#: includes/account.php:108
msgid "Your order has been shipped to %s"
msgstr ""
Observă msgstr "" gol. Un .pot este un șablon, nu o traducere. Îl copiezi o dată pentru fiecare limbă și completezi spațiile libere. Rareori editezi un .pot manual; este regenerat din codul sursă ori de câte ori se modifică șirurile.
Fișierul .po: Traducerea ta Editabilă de Către Om
Un fișier .po (Portable Object) este o copie a fișierului .pot cu liniile msgstr completate pentru o singură limbă. Acesta este fișierul pe care traducătorii și dezvoltatorii îl editează de fapt. Este text simplu, lizibil de om și compatibil cu controlul versiunilor.
#: 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"
msgid este șirul sursă original în engleză și nu trebuie să se schimbe niciodată. msgstr este traducerea ta. %s este un substituent care trebuie să rămână intact în traducere — omiterea sau reordonarea lui este cea mai frecventă cauză a aspectelor rupte, pe care o abordăm în detaliu în cum să traduci fișiere .po fără a strica variabilele de cod.
Fișierul .mo: Binarul Compilat
Un fișier .mo (Machine Object) este versiunea compilată, binară a fișierului tău .po. WordPress nu poate citi fișierele .po eficient la rulare, așa că încarcă .mo pre-compilat în schimb. Deschiderea unui .mo într-un editor de text arată octeți ilizibili — este destinat mașinilor, nu oamenilor.
Atunci când WordPress apelează load_textdomain() sau load_theme_textdomain(), caută un fișier .mo, analizează tabelul său binar de hash și înlocuiește fiecare msgid cu msgstr-ul corespunzător din mers. Acest format binar face căutările rapide chiar și pe site-uri cu mii de șiruri.
Cum se Relaționează Cele Trei Fișiere în Fluxul de Lucru Gettext?
Ele formează o conductă unidirecțională: codul sursă devine un .pot, .pot-ul devine un .po per-limbă, iar fiecare .po se compilează într-un .mo. Traducerile curg întotdeauna în jos.
Iată ciclul de viață complet, în ordine:
- Un dezvoltator încadrează șirurile destinate utilizatorilor în funcții Gettext precum
__()și_e()în interiorul codului sursă PHP. - Un instrument de scanare citește sursa și generează șablonul
.potcare conține fiecare șir încadrat. - Un traducător copiază
.pot-ul într-un.pospecific limbii (de exemplude_DE.po) și completează fiecaremsgstr. - Fișierul
.pofinalizat este compilat într-un.mobinar. - WordPress încarcă
.mo-ul la rulare și afișează site-ul tradus.
Atunci când dezvoltatorul adaugă șiruri noi ulterior, .pot-ul este regenerat, noile intrări sunt fuzionate în fiecare .po existent (păstrând traducerile vechi), traducătorul completează golurile, iar .po-ul este recompilat în .mo. Ciclul se repetă pe durata de viață a proiectului.
Lucrul esențial de reținut: editezi .po-ul, apoi compilezi în .mo. Nu editezi niciodată .mo-ul direct și nu traduci niciodată în interiorul .pot-ului. Dacă vrei o imagine mai profundă de la cap la cap, ghidul suprem pentru localizarea WordPress parcurge întreaga conductă cu exemple.
Convenții de Denumire și Locul unde se Găsesc Fișierele
WordPress este strict în ceea ce privește numele fișierelor. Greșește denumirea și fișierul tău .mo perfect tradus va fi pur și simplu ignorat, deoarece WordPress caută o potrivire exactă bazată pe domeniul de text și localitate.
Modelul de denumire pentru traducerile temelor și pluginurilor este:
# 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
textdomain se potrivește cu șirul transmis ca al doilea argument funcțiilor Gettext precum __( 'Add to Cart', 'twentytwentyfour' ). locale este un cod de localitate WordPress, cum ar fi de_DE, fr_FR sau pt_BR. Șablonul .pot nu are un sufix de localitate deoarece este neutru din punct de vedere lingvistic.
Locația contează la fel de mult ca și denumirea. WordPress caută în câteva căi previzibile:
- Traducerile temelor sunt livrate în propriul folder al temei
wp-content/themes/your-theme/languages/. - Traducerile pluginurilor sunt livrate în
wp-content/plugins/your-plugin/languages/. - Traducerile de pe translate.wordpress.org și suprascrierile utilizatorilor ajung în directoarele globale
wp-content/languages/themes/șiwp-content/languages/plugins/, care au prioritate și supraviețuiesc actualizărilor.
Pune un fișier de_DE.mo denumit corect în folderul potrivit și vizitatorii germani vor vedea germana. Pune-l într-un folder prea adânc, sau greșește domeniul de text, iar WordPress va reveni în liniște la engleză fără mesaj de eroare. Dacă traducerile tale nu apar, o nepotrivire de denumire sau de cale este de obicei vinovatul, iar ghidul de depanare pentru traduceri lipsă acoperă fiecare cauză comună.
De ce nu ar trebui să editezi niciodată un fișier .mo direct
Deoarece un .mo este un binar compilat, nu există o modalitate sigură de a-l edita manual — și orice modificare pe care o forțezi va fi suprascrisă data viitoare când .po-ul este recompilat. .po-ul este sursa adevărului; .mo-ul este un artefact de compilare de unică folosință.
Această singură regulă explică o mare parte din tichetele de suport „traducerea mea s-a schimbat, dar site-ul nu s-a actualizat”. Cineva modifică un șir, salvează .po-ul și uită să recompileze .mo-ul. WordPress continuă să încarce binarul vechi, deci noua formulare nu apare niciodată. Soluția este întotdeauna: editează .po, recompilează în .mo, reîncarcă.
Există un al doilea motiv pentru care regula contează: fișierele .mo nu sunt ușor de diferențiat în controlul versiunilor. Deoarece sunt binare, o mică modificare a formulării produce o grămadă opacă în istoricul tău Git pe care niciun recenzor nu o poate citi. Păstrarea .po-ului ca sursă de adevăr urmărită și tratarea .mo-ului ca un artefact generat menține depozitul tău revizuibil și traducerile tale auditabile.
A face acest lucru manual pentru zeci de limbi este laborios și predispus la erori. Aici un flux de lucru în cloud economisește timp real. Instrumente precum SimplePoTranslate traduc șirurile tale .po și îți returnează un singur ZIP care conține .po și .mo-ul corespunzător împreună — deja compilate, denumite corect, gata de a fi plasate în wp-content/languages/. Nu există nimic de compilat manual și nicio șansă de un .mo învechit.
De asemenea, aplică Blocarea Sintaxei, care blochează fiecare substituent precum %s, %1$s și {name}, plus etichetele HTML, înainte de traducere. Variabilele tale supraviețuiesc intacte, deci nu livrezi niciodată un .mo care strică un aspect. Și pentru că rulează în întregime în cloud, nu există niciun plugin suplimentar care să-ți încetinească site-ul — încarci un fișier și descarci traduceri finalizate, compilate.
Recapitulare
Odată ce distincția fișier .po vs .mo devine clară, întregul sistem de traducere WordPress încetează să mai pară misterios. .pot-ul este șablonul dezvoltatorului, .po-ul este copia de lucru editabilă a traducătorului, iar .mo-ul este binarul compilat pe care WordPress îl servește efectiv vizitatorilor. Traducerile curg într-o singură direcție — șablon la .po la .mo — și editezi manual doar pe cel din mijloc.
Reține cele trei reguli care previn nouăzeci la sută din problemele de traducere: nu traduce niciodată în interiorul unui .pot, recompilează întotdeauna .mo-ul după editarea unui .po și potrivește exact denumirea textdomain-locale. Urmează aceste reguli și șirurile tale traduse vor apărea de fiecare dată.
Ești gata să nu te mai lupți cu compilarea și denumirea manuală a fișierelor de traducere? Încearcă SimplePoTranslate gratuit — nu este necesar card de credit. Încarcă fișierul tău
.posau.potși primești înapoi un pachet.po+.mogata de utilizat, pe nivelul gratuit, în câteva minute.