GNU gettext | |
---|---|
Tip de | localizare software , bibliotecă |
Autor | Ulrich Drepper |
Dezvoltatori | proiect GNU |
Scris in | Xi |
Sistem de operare | Unix , Microsoft Windows |
Limbi de interfață | Rusă și încă 37 de limbi |
Platformă hardware | multiplatformă |
ultima versiune | |
Formate de fișiere care pot fi citite | GNU Gettext Machine Object (big endian) [d] și GNU Gettext Machine Object (litte endian) [d] |
Formate de fișiere generate | GNU Gettext Machine Object (big endian) [d] și GNU Gettext Machine Object (litte endian) [d] |
Stat | activ |
Licență | |
Site-ul web | gnu.org/software/gettext/ |
Fișiere media la Wikimedia Commons |
gettext este o bibliotecă de proiecte GNU pentru internaționalizare , utilizată pe scară largă în software-ul liber .
Principala diferență față de alte instrumente similare este că gettext își folosește originalele în limba engleză pentru a desemna șiruri de caractere traducibile în textul programului, mai degrabă decât identificatori speciali. Astfel, se dovedește că programul nu are nevoie de fișiere de traducere pentru a afișa interfața în limba engleză. Acest lucru este de obicei convenabil, deoarece majoritatea aplicațiilor dezvoltate sunt deja scrise în limba engleză.
gettext are suport pentru plural . Pentru a face acest lucru, în codul sursă al programului este utilizată o funcție specială și sunt date două linii - la singular și la plural. Când înlocuiți o traducere într-o altă limbă, sunt folosite atâtea forme ale șirului de traducere cât este necesar pentru acea limbă. Pentru a face acest lucru, antetul fișierului de traducere trebuie să conțină o expresie specifică limbii pentru selectarea numărului șirului de traducere după număr.
Biblioteca gettext presupune că traducerile sunt stocate în fișiere cu extensiile .mo ( Eng. Machine Object , un fișier binar ușor de citit de program și specific platformei) sau .gmo (GNU .mo), .po ( English Portable Object , o traducere independentă de platformă de fișiere care poate fi citită de om) și .pot ( șablonul PO este un director, o pregătire a unui fișier .po pentru traducere într-o nouă limbă). [2] Pe lângă șirurile de traducere în sine, fișierele .po pot conține comentarii ale traducătorului și diferite mărci de serviciu.
Pentru a genera și actualiza aceste fișiere atunci când programul se schimbă, se presupune că trebuie să folosească o serie de utilitare incluse în biblioteca gettext.
Inițial, liniile din codul sursă al programului sunt colectate de program xgettextîntr-un fișier .pot (director). Acest fișier și fișierele de traducere sunt actualizate cu șiruri noi și modificate care apar în codul sursă de către msgmerge. În același timp, toate șirurile deja traduse sunt salvate, cele care nu mai sunt utilizate sunt marcate ca învechite, iar cele care s-au schimbat sunt marcate ca inexacte ( English fuzzy ). În mod implicit, șirurile învechite și inexacte nu vor fi folosite de program. Ele sunt necesare pentru comoditatea traducătorului: este adesea mai ușor să te bazezi pe o traducere existentă, deși depășită, decât să traduci din nou întreaga frază.
Pentru a începe traducerea unui program într-o anumită limbă, traducătorul creează un .pofișier -: copiază .potfișierul - în locul potrivit și schimbă titlul din acesta. Pentru a face acest lucru, puteți utiliza programul msginit. Fișierul de traducere finalizat este convertit în fișiere .mo de către utilitarul msgfmt. [2] .
Există, de asemenea, utilități pentru traducători care facilitează editarea traducerii, de exemplu:
Pe lângă implementarea de bază gettext pentru C standard , există implementări ale unei abordări similare pentru C++ , Objective-C , scripting sh / bash , Python , Perl , PHP , GNU CLISP , Emacs Lisp , librep, GNU Smalltalk , Java , Scala [3] , GNU awk , Pascal , wxWidgets (folosind clasa wxLocale), YCP ( limba YaST2 ), Tcl , Pike și R , limbaje de platformă Mono (spațiul de nume Mono.Unix) și pentru framework-ul Qt . Unele dintre aceste limbi sunt acceptate direct de utilitățile menționate mai sus. [2] .
Utilizarea în majoritatea limbilor este similară cu utilizarea în C.
Șirurile care sunt afișate utilizatorului în timpul funcționării programului și, în consecință, necesită traducere, sunt scrise în limba engleză în codul sursă al programului și marcate cu un apel de funcție gettextsau ngettextsimilar.
printf ( gettext ( "Bună ziua! Numele meu este %s. \n " ), nume );De obicei, pentru a reduce dimensiunea codului sursă și pentru a îmbunătăți lizibilitatea, #define _ gettexteste declarat și utilizat un sinonim scurt al funcției (marca de subliniere). Deci apelul este convertit în
printf ( _ ( "Bună ziua! Numele meu este %s. \n " ), nume );Pentru linia de mai sus, o intrare ca aceasta va apărea în director, după procesarea corespunzătoare de către comenzile xgettext și msginit:
#: src/name.c:36 msgid "Hello! My name is %s.\n" msgstr "Bună ziua! Numele meu este %s.\n " PluralePentru a traduce pluralul se folosește funcția ngettext, care ia ca parametri două șiruri englezești (pentru singular și, respectiv, plural) și un număr întreg. În PHP , apelul ngettextde a scoate un șir cu un număr arată astfel:
printf ( ngettext ( " acum %d zi " , " acum %d zile " , $ zile în urmă ), $ zile în urmă );Funcția ngettextîn sine nu înlocuiește o valoare numerică pentru %d, așa că programatorul trebuie să apeleze o funcție printfsau o funcție similară pentru a forma șirul dorit cu un număr.
Apoi traduce liniile din acel fișier, de exemplu, pentru o traducere în limba rusă:
#: src/name.c:36 msgid "Hello! My name is %s.\n" msgstr "Bună ziua! Numele meu este %s.\n" PluralePentru a traduce pluralele, este necesar ca antetul (unde sunt indicate date precum Project-Id-Versionși PO-Revision-Date) .poal fișierului să indice regula pentru formarea pluralelor pentru o anumită limbă. De exemplu, în rusă există trei forme de plural:
Alegerea uneia dintre aceste trei forme, în funcție de număr, se realizează prin următoarea formulă [4] :
" Forme-plural: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"Expresia pentru pluralaici este scrisă folosind sintaxa limbajului C și se poate baza doar pe variabila n, care denotă numărul de ieșire.
După o astfel de declarație, formele iau numerele 0, 1 și 2, iar traducerea expresiei este următoarea:
msgid " Acum %d zile" msgid_plural "Acum %d zile" msgstr [ 0 ] "Acum %d zile" msgstr[ 1 ] "Acum %d zile" msgstr[ 2 ] "Acum %d zile"În mod obișnuit, un utilizator de sisteme de operare similare UNIX nu trebuie să facă pași suplimentari pentru a selecta o anumită traducere. Translația este determinată de o variabilă de sistem , care este de obicei deja setată la valoarea necesară. LANG