Gettext

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 20 decembrie 2021; verificările necesită 7 modificări .

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ță
  • bibliotecă - LGPL
  • instrumente - GPL
  • Documentatie - GFDL /GPL
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 .

Descriere

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.

Utilizare

Pentru programator

Linii simple

Ș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 " Plurale

Pentru 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.

Pentru traducător

Linii simple

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" Plurale

Pentru 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:

  • 1, 21, 31... zi
  • 2, 3, 4, 22, 23, 24, 32, 33, 34... zile
  • 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36… zile

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"

Pentru utilizator

Î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

Vezi și

Note

  1. Haible B. GNU gettext 0.21 lansat  - 2020 .
  2. 1 2 3 Manualul GNU gettext Arhivat 5 decembrie 2007 la Wayback Machine 
  3. makkarpov/scalingua: O bibliotecă de internaționalizare simplă asemănătoare gettext pentru Scala . github.com . Preluat la 28 aprilie 2016. Arhivat din original la 24 aprilie 2020.
  4. Așa arată o linie într-un fișier de traducere .po . \n de la sfârșitul unei linii înseamnă o întrerupere de linie.

Link -uri