cum se construiește o aplicație multilingvă: un Demo cu PHP și Gettext

indiferent dacă construiți un site web sau o aplicație web cu drepturi depline, ceea ce îl face accesibil unui public mai larg necesită adesea ca acesta să fie disponibil în diferite limbi și locații.

diferențele fundamentale dintre cele mai multe limbi umane fac acest lucru orice, dar ușor. Diferențele dintre regulile gramaticale, nuanțele de limbă, formatele de dată și multe altele se combină pentru a face localizarea o provocare unică și formidabilă.

luați în considerare acest exemplu simplu.

Regulile pluralizării în limba engleză sunt destul de simple: puteți avea o formă singulară a unui cuvânt sau o formă plurală a unui cuvânt.

în alte limbi, Deși – cum ar fi limbile slave-există două forme de plural în plus față de cea singulară. Puteți găsi chiar și limbi cu un total de patru, cinci sau șase forme de plural, cum ar fi în Slovenă, Irlandeză sau arabă.

modul în care este organizat codul dvs. și modul în care sunt proiectate componentele și interfața dvs. joacă un rol important în determinarea cât de ușor puteți localiza aplicația.

internaționalizarea (i18n) a bazei dvs. de cod, vă ajută să vă asigurați că poate fi adaptată la diferite limbi sau regiuni cu relativă ușurință. Internaționalizarea se face de obicei o singură dată, de preferință la începutul proiectului pentru a evita necesitatea unor schimbări uriașe în codul sursă pe drum.

Cum de a construi o aplicație multilingvă: un Demo cu PHP și Gettext

odată ce baza de cod a fost internaționalizată, localizarea (l10n) devine o chestiune de traducere a conținutului aplicației dvs. într-o anumită limbă/localizare.

localizarea trebuie efectuată de fiecare dată când o nouă limbă sau regiune trebuie să fie acceptată. De asemenea, ori de câte ori o parte a interfeței (care conține text) este actualizată, conținutul nou devine disponibil – care trebuie apoi localizat (adică tradus) în toate localurile acceptate.

în acest articol, vom învăța cum să internaționalizăm și să localizăm software-ul scris în PHP. Vom parcurge diferitele opțiuni de implementare și diferitele instrumente care sunt disponibile la dispoziția noastră pentru a ușura procesul.

instrumente pentru internaționalizare

cel mai simplu mod de a internaționaliza software-ul PHP este prin utilizarea fișierelor matrice. Matrice vor fi populate cu siruri de caractere traduse, care pot fi apoi privit în sus din cadrul template-uri:

<h1><?=$TRANS?></h1>

cu toate acestea, acesta este cu greu un mod recomandat pentru proiecte serioase, deoarece va pune cu siguranță probleme de întreținere pe drum. Unele probleme ar putea apărea chiar la început, cum ar fi lipsa de sprijin pentru interpolarea variabilă sau pluralizarea substantivelor și așa mai departe.

unul dintre cele mai clasice instrumente (adesea luate ca referință pentru i18n și l10n) este un instrument Unix numit Gettext.

deși datează din 1995, este încă un instrument cuprinzător pentru traducerea software-ului, care este, de asemenea, ușor de utilizat. Deși este destul de ușor să începeți, are încă instrumente puternice de susținere.

Gettext este ceea ce vom folosi în acest post. Vom prezenta o aplicație GUI excelentă care poate fi utilizată pentru a actualiza cu ușurință fișierele sursă l10n, evitând astfel necesitatea de a face față liniei de comandă.

biblioteci pentru a face lucrurile mai ușor

cadre web PHP majore și biblioteci care acceptă Gettext

există cadre și biblioteci web PHP majore care acceptă gettext și alte implementări ale i18n. unele sunt mai ușor de instalat decât altele sau oferă funcții suplimentare sau acceptă diferite formate de fișiere i18n. Deși în acest document, ne concentrăm pe instrumentele furnizate cu nucleul PHP, iată o listă a altora care merită menționate:

  • oscarotero / Gettext: suport Gettext cu o interfață orientată pe obiecte; include funcții de ajutor îmbunătățite, Extractoare puternice pentru mai multe formate de fișiere (unele dintre ele nu sunt acceptate nativ de comanda gettext). De asemenea, poate exporta în formate dincolo de fișierele .mo/.po, care pot fi utile dacă trebuie să integrați fișierele de traducere în alte părți ale sistemului, cum ar fi o interfață JavaScript.

  • symfony / traducere: suportă o mulțime de formate diferite, dar recomandă utilizarea verbose lui XLIFF. nu include funcții de ajutor sau un extractor built-in, dar sprijină substituenți folosind strtr() intern.

  • zend / i18n: Suporta matrice și fișiere INI, sau formate Gettext. Implementează un strat de cache pentru a evita necesitatea de a citi sistemul de fișiere de fiecare dată. De asemenea, include ajutoare de vizualizare, și filtre de intrare locale-conștient și validatoare. Cu toate acestea, nu are extractor de mesaje.

alte cadre includ, de asemenea, module i18n, dar acestea nu sunt disponibile în afara codebases lor:

  • Laravel: acceptă fișiere matrice de bază; nu are extractor automat, dar include un ajutor @lang pentru fișierele șablon.

  • Yii: Suporta matrice, gettext, și traducere bazată pe baze de date, și include un extractor de mesaje. Susținută de extensia Intl, disponibilă începând cu PHP 5.3 și bazată pe proiectul UCI. Acest lucru permite Yii să ruleze înlocuiri puternice, cum ar fi scrierea numerelor, datele de formatare, orele, intervalele, moneda și ordinalele.

dacă decideți să alegeți una dintre bibliotecile care nu oferă Extractoare, poate doriți să utilizați formatele Gettext, astfel încât să puteți utiliza lanțul de instrumente gettext original (inclusiv Poedit) așa cum este descris în restul capitolului.

instalarea Gettext

poate fi necesar să instalați gettext și Biblioteca PHP aferentă utilizând managerul de pachete, cum ar fi apt-get sau yum. După ce este instalat, activați-l adăugând extension=gettext.so (Linux/Unix) sau extension=php_gettext.dll (Windows) la fișierul php.ini.

aici vom folosi și Poedit pentru a crea fișiere de traducere. Probabil îl veți găsi în managerul de pachete al sistemului dvs.; este disponibil pentru Unix, Mac și Windows și poate fi descărcat gratuit și pe site-ul său web.

tipuri de fișiere Gettext

există trei tipuri de fișiere cu care vă ocupați de obicei în timp ce lucrați cu Gettext.

principalele sunt fișierele PO (Portable Object) și Mo (Machine Object), primul fiind o listă de „obiecte traduse” lizibile, iar al doilea fiind binarul corespunzător (care trebuie interpretat de Gettext atunci când se face localizarea). Există, de asemenea, un fișier POT (șablon PO), care conține pur și simplu toate cheile existente din fișierele sursă și poate fi folosit ca ghid pentru generarea și actualizarea tuturor fișierelor PO.

fișierele șablon nu sunt obligatorii; în funcție de instrumentul pe care îl utilizați pentru a face l10n, veți fi bine doar cu fișiere PO/MO. Veți avea o pereche de fișiere PO / MO pe limbă și regiune, dar numai un POT pe domeniu.

separarea domeniilor

există unele cazuri, în proiecte mari, în care s-ar putea să fie nevoie să separați traducerile atunci când aceleași cuvinte transmit un sens diferit în contexte diferite.

în aceste cazuri, va trebui să le împărțiți în diferite „domenii”, care sunt denumite practic grupuri de fișiere POT/PO/MO, unde numele fișierului este domeniul de traducere menționat.

proiecte mici și mijlocii de obicei, pentru simplitate, utilizați un singur domeniu; numele său este arbitrar, dar vom folosi „principal” pentru probele noastre de cod.

în proiectele Symfony, de exemplu, domeniile sunt utilizate pentru a separa traducerea pentru mesajele de validare.

Cod local

o localizare este pur și simplu un cod care identifică o versiune a unei limbi. Este definit după specificațiile ISO 639-1 și ISO 3166-1 alpha-2: două litere mici pentru limbă, urmate opțional de o subliniere și două litere mari care identifică țara sau codul regional.

pentru limbile rare, se folosesc trei litere.

pentru unii vorbitori, partea de țară poate părea redundantă. De fapt, unele limbi au dialecte în diferite țări, cum ar fi germana austriacă (De_at) sau Portugheza Braziliană (pt_BR). A doua parte este folosită pentru a distinge între aceste dialecte – atunci când nu este prezentă, este luată ca o versiune „generică” sau „hibridă” a limbii.

structura directorului

pentru a utiliza Gettext, va trebui să aderăm la o structură specifică de foldere.

mai întâi, va trebui să selectați o rădăcină arbitrară pentru fișierele l10n din depozitul sursă. În interiorul acestuia, veți avea un folder pentru fiecare localizare necesară și un folder fix „LC_MESSAGES” care va conține toate perechile PO/MO.

dosarul LC_MESSAGES

forme de Plural

după cum am spus în introducere, diferite limbi ar putea avea reguli de pluralizare diferite. Cu toate acestea, Gettext ne salvează această problemă.

la crearea unui nou .fișierul po, va trebui să declarați regulile de pluralizare pentru acea limbă, iar piesele traduse care sunt sensibile la plural vor avea o formă diferită pentru fiecare dintre aceste reguli.

când apelați Gettext în cod, va trebui să specificați un număr legat de propoziție (de exemplu, pentru fraza „aveți n mesaje.”, va trebui să specificați valoarea lui n) și va elabora forma corectă de utilizat – chiar și folosind înlocuirea șirului, dacă este necesar.

Regulile pluralului sunt compuse din numărul de reguli necesare cu un test boolean pentru fiecare regulă (testul pentru cel mult o regulă poate fi omis). De exemplu:

  • Japoneză: nplurals=1; plural=0; – o regulă: nu există forme de plural

  • engleză: nplurals=2; plural=(n != 1); – două reguli: utilizați forma plurală numai atunci când n nu este 1, altfel utilizați forma singulară.

  • Portugheză Braziliană: nplurals=2; plural=(n > 1); – două reguli, folosiți forma plurală numai atunci când n este mai mare de 1, altfel folosiți forma singulară.

pentru o explicație mai profundă, există un tutorial informativ LingoHub disponibil online.

Gettext va determina ce regulă să folosească pe baza numărului furnizat și va folosi versiunea corectă localizată a șirului. Pentru siruri de caractere în cazul în care pluralizarea trebuie să fie manipulate, va trebui să includă în .po fișier o propoziție diferită pentru fiecare regulă plural definit.

exemplu de punere în aplicare

după toate că teoria, să trecem un pic practic. Iată un fragment din a .fișier po (nu vă faceți griji încă prea mult despre sintaxa, dar în schimb obține doar un sentiment de conținutul general):

msgid ""msgstr """Language: pt_BR\n""Content-Type: text/plain; charset=UTF-8\n""Plural-Forms: nplurals=2; plural=(n > 1);\n"msgid "We're now translating some strings"msgstr "Nós estamos traduzindo algumas strings agora"msgid "Hello %1$s! Your last visit was on %2$s"msgstr "Olá %1$s! Sua última visita foi em %2$s"msgid "Only one unread message"msgid_plural "%d unread messages"msgstr "Só uma mensagem não lida"msgstr "%d mensagens não lidas"

prima secțiune funcționează ca un antet, având msgid și msgstr goale.

descrie codificarea fișierelor, formele de plural și alte câteva lucruri. A doua secțiune traduce un șir simplu din engleză în Portugheză Braziliană, iar a treia face același lucru, dar folosește înlocuirea șirului de la sprintf, permițând traducerii să conțină numele de utilizator și data vizitei.

ultima secțiune este un eșantion de forme de pluralizare, afișând versiunea singular și plural ca msgid în engleză și traducerile lor corespunzătoare ca msgstr 0 și 1 (urmând numărul dat de regula plural).

acolo, înlocuirea șir este folosit, de asemenea, astfel încât numărul poate fi văzut direct în propoziție, prin utilizarea %d. Formele de plural au întotdeauna două msgid(singular și plural), deci este recomandat să nu folosiți un limbaj complex ca sursă de traducere.

Taste de localizare

după cum probabil ați observat, folosim propoziția engleză reală ca ID sursă. Că msgid este același folosit în întreaga ta.fișierele po, adică alte limbi vor avea același format și aceleași câmpuri msgid, dar traduse msgstr linii.

vorbind de chei de traducere, există două abordări standard „filosofice” aici:

1. msgstr ca propoziție reală

principalele avantaje ale acestei abordări sunt:

  • dacă există părți ale software-ului netraduse în orice limbă dată, cheia afișată va menține în continuare un anumit sens. De exemplu, dacă știți cum să traduceți din engleză în spaniolă, dar aveți nevoie de ajutor pentru traducerea în franceză, puteți publica noua pagină cu propoziții franceze lipsă, iar părți ale site-ului web vor fi afișate în engleză.

  • este mult mai ușor pentru Traducător să înțeleagă ce se întâmplă și să facă o traducere corectă bazată pe msgid.

  • Acesta vă oferă” gratuit ” l10n pentru o singură limbă-sursa.

pe de altă parte, dezavantajul principal este că, dacă trebuie să schimbați textul real, trebuie să înlocuiți același msgid în mai multe fișiere de limbă.

2. msgstr ca cheie unică, structurată

aceasta ar descrie rolul propoziției în aplicație într-un mod structurat, inclusiv șablonul sau partea în care șirul este localizat în locul conținutului său.

aceasta este o modalitate excelentă de a organiza codul, separând conținutul textului de logica șablonului. Cu toate acestea, acest lucru ar putea prezenta probleme traducătorului care ar pierde contextul.

un fișier de limbă sursă ar fi necesar ca bază pentru alte traduceri. De exemplu, dezvoltatorul ar avea în mod ideal un „en.po ” fișier, că traducătorii ar citi pentru a înțelege ce să scrie în „fr.po”.

traduceri lipsă ar afișa chei lipsite de sens pe ecran („top_menu.bine ați venit” în loc de ” Bună ziua, utilizator!”pe pagina Franceză netradusă menționată).

este bine, deoarece ar forța traducerea să fie completă înainte de publicare – dar rău, deoarece problemele de traducere ar fi cu adevărat îngrozitoare în interfață. Unele biblioteci, totuși, includ o opțiune de a specifica o anumită limbă ca „rezervă”, având un comportament similar cu cealaltă abordare.

manualul Gettext favorizează prima abordare, deoarece, în general, este mai ușor pentru traducători și utilizatori în caz de probleme. Aceasta este abordarea pe care o vom folosi și aici.

trebuie remarcat, totuși, că documentația Symfony favorizează traducerea bazată pe cuvinte cheie, pentru a permite modificări independente ale tuturor traducerilor fără a afecta și șabloanele.

utilizarea de zi cu zi

într-o aplicație comună, ar folosi unele funcții Gettext în timp ce scrie text static în paginile.

acele propoziții ar apărea apoi în .po fișiere, pentru a primi tradus, compilate în fișiere .mo, și apoi utilizate de Gettext atunci când redarea interfața reală. Având în vedere acest lucru, să legăm împreună ceea ce am discutat până acum într-un exemplu pas cu pas:

1. Un fișier șablon eșantion, inclusiv unele apeluri gettext diferite

<?php include 'i18n_setup.php' ?><div> <h1><?=sprintf(gettext('Welcome, %s!'), $name)?></h1> <!-- code indented this way only for legibility → <?php if ($unread): ?> <h2> <?=sprintf( ngettext('Only one unread message', '%d unread messages', $unread), $unread )?> </h2> <?php endif ?></div><h1><?=gettext('Introduction')?></h1><p><?=gettext('We\'re now translating some strings')?></p>
  • gettext() pur și simplu traduce un msgid în msgstr corespunzător pentru o anumită limbă. Există, de asemenea, funcția de stenografie _() care funcționează în același mod

  • ngettext() face același lucru, dar cu reguli plural

  • există, de asemenea, dgettext() și dngettext() , care vă permite să suprascrieți domeniul pentru un singur apel (mai multe despre configurația domeniului în exemplul următor)

2. Un fișier de configurare eșantion (i18n_setup.php așa cum este folosit mai sus), selectarea localizării corecte și configurarea Gettext

utilizarea Gettext implică un pic de cod boilerplate, dar este vorba mai ales despre configurarea directorului locale și alegerea parametrilor corespunzători (o localizare și un domeniu).

<?php/** * Verifies if the given $locale is supported in the project * @param string $locale * @return bool */function valid($locale) { return in_array($locale, ) && valid($_GET)) { // the locale can be changed through the query-string $lang = $_GET; //you should sanitize this! setcookie('lang', $lang); //it's stored in a cookie so it can be reused} elseif (isset($_COOKIE) && valid($_COOKIE)) { // if the cookie is present instead, let's just keep it $lang = $_COOKIE; //you should sanitize this!} elseif (isset($_SERVER)) { // default: look for the languages the browser says the user accepts $langs = explode(',', $_SERVER); array_walk($langs, function (&$lang) { $lang = strtr(strtok($lang, ';'), ); }); foreach ($langs as $browser_lang) { if (valid($browser_lang)) { $lang = $browser_lang; break; } }}// here we define the global system locale given the found languageputenv("LANG=$lang");// this might be useful for date functions (LC_TIME) or money formatting (LC_MONETARY), for instancesetlocale(LC_ALL, $lang);// this will make Gettext look for ../locales/<lang>/LC_MESSAGES/main.mobindtextdomain('main', '../locales');// indicates in what encoding the file should be readbind_textdomain_codeset('main', 'UTF-8');// if your application has additional domains, as cited before, you should bind them here as wellbindtextdomain('forum', '../locales');bind_textdomain_codeset('forum', 'UTF-8');// here we indicate the default domain the gettext() calls will respond totextdomain('main');// this would look for the string in forum.mo instead of main.mo// echo dgettext('forum', 'Welcome back!');?>

3. Pregătirea traducerii pentru prima rulare

unul dintre marile avantaje pe care gettext le are asupra pachetelor i18n framework personalizate este formatul său de fișier extins și puternic.

poate că te gândești „Oh, omule, asta e destul de greu de înțeles și edita de mână, un tablou simplu ar fi mai ușor!”Nu faceți nicio greșeală, aplicații precum Poedit sunt aici pentru a vă ajuta – foarte mult. Puteți obține programul de pe site-ul lor, este gratuit și disponibil pentru toate platformele. Este un instrument destul de ușor de obișnuit și unul foarte puternic în același timp – folosind toate funcțiile pe care Gettext le are la dispoziție. Vom lucra aici cu cea mai recentă versiune, Poedit 1.8.

vezi în interiorul Poedit.

în prima rulare, ar trebui să selectați „File > New…” din meniu. Vi se va cere limba; selectați / filtrați limba în care doriți să traduceți sau utilizați formatul menționat anterior, cum ar fi en_US sau pt_BR.

selectarea limbii.

Acum, salvați fișierul-folosind acea structură de directoare pe care am menționat-o. Apoi, ar trebui să faceți clic pe „extrageți din surse”, iar aici veți configura diverse setări pentru sarcinile de extracție și traducere. Veți putea găsi toate acestea mai târziu prin „Catalog > proprietăți”:

  • căi sursă: Includeți toate folderele din proiect în care sunt numite gettext() (și frații) – acesta este de obicei folderul (folderele) șabloane/vizualizări. Aceasta este singura setare obligatorie.

  • Proprietăți de traducere:

    • numele proiectului și versiunea, echipa și adresa de e-mail echipei: informații utile care merge în .antet fișier po.
    • forme de Plural: acestea sunt regulile pe care le-am menționat anterior. Puteți să o lăsați cu opțiunea implicită de cele mai multe ori, deoarece Poedit include deja o bază de date la îndemână cu reguli plural pentru multe limbi.
    • Seturi de caractere: UTF-8, de preferință.
    • set de caractere cod sursă: setul de caractere folosit de codebase-probabil UTF-8, de asemenea, nu?
  • cuvinte cheie sursă: software-ul de bază știe cum arată gettext() și apelurile de funcții similare în mai multe limbaje de programare, dar s-ar putea să vă creați propriile funcții de traducere. Acesta va fi aici veți adăuga aceste alte metode. Acest lucru va fi discutat mai târziu în secțiunea „Sfaturi”.

după setarea acestor proprietăți, Poedit va rula o Scanare prin fișierele sursă pentru a găsi toate apelurile de localizare. După fiecare scanare, Poedit va afișa un rezumat al ceea ce a fost găsit și ce a fost eliminat din fișierele sursă. Intrările noi vor fi goale în tabelul de traducere, permițându-vă să introduceți versiunile localizate ale acestor șiruri. Salvați-l și un fișier .mo va fi (re)compilat în același folder și, presto!, proiectul dvs. este internaționalizat!

proiect internaționalizat.

Poedit poate sugera, de asemenea, traduceri comune de pe web și din fișierele anterioare. Este la îndemână, așa că trebuie doar să verificați dacă au sens și să le acceptați. Dacă nu sunteți sigur despre o traducere, puteți marca ca Fuzzy, și va fi afișat în galben. Intrările albastre sunt cele care nu au traducere.

4. Traducerea șirurilor

după cum probabil ați observat, există două tipuri principale de șiruri localizate: cele simple și cele cu forme de plural.

cele Simple au doar două cutii: sursă și șir localizat. Șirul sursă nu poate fi modificat, deoarece Gettext / Poedit nu include capacitatea de a modifica fișierele sursă; mai degrabă, va trebui să schimbați sursa în sine și să rescanați fișierele. (Sfat: Dacă faceți clic dreapta pe o linie de traducere, aceasta va afișa un indiciu cu fișierele sursă și liniile în care este utilizat acel șir.)

șirurile de forme Plural includ două casete pentru a afișa cele două șiruri sursă și filele, astfel încât să puteți configura diferitele forme finale.

Configurarea formularelor finale.

exemplu de șir cu o formă de plural pe Poedit, care arată o filă de traducere pentru fiecare.

ori de câte ori schimbați fișierele de cod sursă și trebuie să actualizați traducerile, trebuie doar să apăsați Refresh și Poedit va rescana codul, eliminând intrările inexistente, fuzionând cele care s-au schimbat și adăugând altele noi.

Poedit poate încerca, de asemenea, să ghicească unele traduceri, bazate pe altele pe care le-ați făcut. Aceste presupuneri și intrările modificate vor primi un marker” Fuzzy”, indicând faptul că au nevoie de revizuire, afișat în galben în listă.

de asemenea, este util dacă aveți o echipă de traducere și cineva încearcă să scrie ceva despre care nu sunt sigur: doar marcați-l Fuzzy și altcineva îl va revizui mai târziu.

în cele din urmă, este recomandat să lăsați „vizualizare > intrări netraduse mai întâi” marcat, deoarece vă va ajuta să evitați uitarea oricăror intrări. Din acel meniu, puteți deschide, de asemenea, părți ale UI care vă permit să lăsați informații contextuale pentru traducători, dacă este necesar.

sfaturi & trucuri

serverele Web pot ajunge în cache fișierele .mo.

dacă executați PHP ca un modul pe Apache (mod_php), s-ar putea confrunta cu probleme cu fișierul .mo fiind în cache. Se întâmplă prima dată când este citit și apoi, pentru a-l actualiza, poate fi necesar să reporniți serverul.

pe Nginx și PHP5 durează de obicei doar câteva reîmprospătări de pagină pentru a reîmprospăta memoria cache de traducere, iar pe PHP7 este rareori necesară.

Bibliotecile oferă funcții de ajutor pentru a menține codul de localizare scurt.

ca preferat de mulți oameni, este mai ușor de utilizat _()în loc de gettext(). Multe biblioteci personalizate i18n din cadre folosesc ceva similar cu t(), de asemenea, pentru a face codul Tradus mai scurt. Cu toate acestea, aceasta este singura funcție care oferă o comandă rapidă.

s-ar putea să doriți să adăugați în proiectul dumneavoastră unele altele, cum ar fi __() sau _n() pentru ngettext(), sau poate o fantezie _r() care ar alătura gettext() și sprintf() apeluri. Alte biblioteci, cum ar fi gettext oscarotero oferă, de asemenea, funcții de ajutor ca acestea.

în aceste cazuri, va trebui să instruiți utilitarul Gettext despre cum să extrageți șirurile din acele funcții noi. Nu vă fie teamă, este foarte ușor. Este doar un câmp în .fișier po sau un ecran de setări în Poedit (în editor, această opțiune se află în interiorul „Catalog > proprietăți > surse cuvinte cheie”).

amintiți-vă: Gettext cunoaște deja funcțiile implicite pentru multe limbi, așa că nu vă îngrijorați dacă lista respectivă pare goală. Trebuie să includeți în această listă specificațiile noilor funcții, urmând acest format specific:

  • dacă creați ceva de genul t(), care returnează pur și simplu traducerea pentru un șir, îl puteți specifica ca t. Gettext va ști singurul argument funcție este șirul de tradus;

  • dacă funcția are mai mult de un argument, puteți specifica în care este primul șir și, dacă este necesar, și forma de plural. De exemplu, dacă semnătura funcției noastre este __('one user', '%d users', $number), specificația ar fi __:1,2, adică prima formă este primul argument, iar a doua formă este al doilea argument. Dacă numărul dvs. vine ca primul argument în schimb, spec ar fi __:2,3, indicând prima formă este al doilea argument, și așa mai departe.

după includerea acestor noi reguli în .fișierul po, o nouă scanare va aduce noile dvs. șiruri la fel de ușor ca înainte.

Faceți aplicația PHP multilingvă cu Gettext

Gettext este un instrument foarte puternic pentru internaționalizarea proiectului PHP. Dincolo de flexibilitatea sa care permite suport pentru un număr mare de limbi umane, suportul său pentru mai mult de 20 de limbaje de programare vă permite să transferați cu ușurință cunoștințele despre utilizarea acestuia cu PHP în alte limbi precum Python, Java sau C#.

mai mult, Poedit poate ajuta la netezirea căii dintre cod și șiruri traduse, făcând procesul mai simplu și mai ușor de urmărit. De asemenea, poate eficientiza eforturile de traducere partajate cu integrarea sa Crowdin.

ori de câte ori este posibil, luați în considerare alte limbi pe care utilizatorii dvs. le-ar putea vorbi. Acest lucru este important mai ales pentru proiectele non-engleze: puteți spori accesul utilizatorului dacă îl eliberați în limba engleză, precum și în limba maternă.

desigur, nu toate proiectele au nevoie de internaționalizare, dar este mult mai ușor să începi i18n în timpul copilăriei unui proiect, chiar dacă nu este necesar inițial, decât să o faci mai târziu pe drum, dacă devine ulterior o cerință. Și, cu instrumente precum Gettext și Poedit, este mai ușor ca niciodată.

Related: Introducere în PHP 7: Ce este nou și ce a dispărut

Leave a Reply

Adresa ta de email nu va fi publicată.