Gettext

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 20 december 2021; kontroller kräver 7 redigeringar .

GNU gettext
Sorts programvarulokalisering , bibliotek
Författare Ulrich Drepper
Utvecklare GNU-projekt
Skrivet i Xi
Operativ system Unix-liknande , Microsoft Windows
Gränssnittsspråk ryska och 37 språk till
Hårdvaruplattform plattformsoberoende
senaste versionen
Läsbara filformat GNU Gettext Machine Object (big endian) [d] och GNU Gettext Machine Object (litte endian) [d]
Genererade filformat GNU Gettext Machine Object (big endian) [d] och GNU Gettext Machine Object (litte endian) [d]
stat aktiva
Licens
  • bibliotek - LGPL
  • verktyg - GPL
  • Dokumentation - GFDL /GPL
Hemsida gnu.org/software/gettext/
 Mediafiler på Wikimedia Commons

gettext  är ett GNU - projektbibliotek för internationalisering , flitigt använt i fri programvara .

Beskrivning

Den största skillnaden från andra liknande verktyg är att gettext använder sina engelska original för att ange översättbara strängar i programtexten, snarare än speciella identifierare. Således visar det sig att programmet inte behöver översättningsfiler för att visa gränssnittet på engelska. Detta är vanligtvis bekvämt, eftersom de flesta av de utvecklade applikationerna redan är skrivna på engelska.

gettext har stöd i plural . För att göra detta används en speciell funktion i programmets källkod, och två rader ges - i singular och plural. När du ersätter en översättning till ett annat språk används så många former av översättningssträngen som behövs för det språket. För att göra detta måste översättningsfilens rubrik innehålla ett språkspecifikt uttryck för att välja översättningssträngens nummer efter nummer.

Gettext-biblioteket förutsätter att översättningar lagras i filer med tilläggen .mo ( Eng.  Machine Object , en binär fil som är lätt att läsa av programmet och specifik för plattformen) eller .gmo (GNU .mo), .po ( English  Portable Object , en mänsklig läsbar filplattformsoberoende översättning) och .pot ( PO-mall är en   katalog, en förberedelse av en .po-fil för översättning till ett nytt språk). [2] Förutom själva översättningssträngarna kan .po-filer innehålla översättarens kommentarer och olika servicemärken.

För att generera och uppdatera dessa filer när programmet ändras, är det tänkt att det ska använda ett antal verktyg som ingår i gettext-biblioteket.

Till en början samlas rader från programmets källkod av programmet xgettexttill en .pot -fil (katalog). Denna fil och översättningsfiler uppdateras med nya och ändrade strängar som visas i källkoden av msgmerge. Samtidigt sparas alla redan översatta strängar, de som inte längre används markeras som föråldrade och de som har ändrats markeras som felaktiga ( engelska  fuzzy ). Som standard kommer inte föråldrade och felaktiga strängar att användas av programmet. De behövs för översättarens bekvämlighet: det är ofta lättare att basera på en befintlig, om än föråldrad, översättning än att översätta hela frasen igen.

För att börja översätta ett program till ett specifikt språk skapar översättaren en .po-fil: kopierar .pot-filen till rätt plats och ändrar titeln i den. För att göra detta kan du använda programmet msginit. Den färdiga översättningsfilen konverteras till .mo-filer av verktyget msgfmt. [2] .

Det finns också verktyg för översättare som gör det lättare att redigera översättningen, till exempel:

Utöver den grundläggande gettext-implementeringen för standard C , finns det implementeringar av ett liknande tillvägagångssätt för C++ , Objective-C , sh / bash scripting , Python , Perl , PHP , GNU CLISP , Emacs Lisp , librep, GNU Smalltalk , Java , Scala [3] , GNU awk , Pascal , wxWidgets (med klassen wxLocale), YCP ( YaST2 language ), Tcl , Pike och R , Mono - plattformsspråk (Mono.Unix-namnrymden) och för Qt- ramverket . Vissa av dessa språk stöds direkt av de ovan nämnda verktygen. [2] .

Användningen på de flesta språk liknar användningen i C.

Användning

För programmeraren

Enkla rader

De strängar som visas för användaren under programdrift och som därför kräver översättning är skrivna på engelska i programmets källkod och markerade med ett funktionsanrop gettexteller ngettextliknande.

printf ( gettext ( "Hej! Jag heter %s. \n " ), namn );

Vanligtvis, för att minska storleken på källkoden och förbättra läsbarheten, #define _ gettextdeklareras och används en kort funktionssynonym (understreck). Så samtalet konverteras till

printf ( _ ( "Hej! Jag heter %s. \n " ), namn );

För raden ovan kommer en post som denna att visas i katalogen, efter lämplig bearbetning av kommandona xgettext och msginit:

#: src/name.c:36 msgid "Hej! Mitt namn är %s.\n" msgstr "" Plurals

För att översätta plural används funktionen ngettext, som tar som parametrar två engelska strängar (för singular respektive plural) och ett heltal. I PHP ser anropet ngettextatt mata ut en sträng med ett nummer ut så här:

printf ( ngettext ( "%d dag sedan" , "%d dagar sedan" , $daysAgo ), $daysAgo );

Funktionen ngettexti sig ersätter inte ett numeriskt värde för %d, så programmeraren måste anropa en funktion printfeller liknande för att bilda den önskade strängen med ett nummer.

För översättaren

Enkla rader

Den översätter sedan raderna i den filen, till exempel för en rysk översättning:

#: src/name.c:36 msgid "Hej! Jag heter %s.\n" msgstr "Hej! Jag heter %s.\n" Plurals

För att översätta plural är det nödvändigt att rubriken (där data som Project-Id-Versionoch PO-Revision-Date) .poi filen anger regeln för bildandet av plural för ett givet språk. Till exempel på ryska finns det tre former av pluralformer:

  • 1, 21, 31... dag
  • 2, 3, 4, 22, 23, 24, 32, 33, 34... dagar
  • 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... dagar

Valet av en av dessa tre former, beroende på antalet, utförs med följande formel [4] :

" Plural-Forms: 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"

Uttrycket för pluralhär är skrivet med syntaxen för C-språket, och kan bara förlita sig på variabeln n, som anger utdatanumret.

Efter en sådan deklaration antar formulären siffrorna 0, 1 och 2, och översättningen av frasen är som följer:

msgid " %d dagar sedan" msgid_plural "%d dagar sedan" msgstr [ 0 ] "%d dagar sedan" msgstr[ 1 ] "%d dagar sedan" msgstr[ 2 ] "%d dagar sedan"

För användaren

Vanligtvis behöver en användare på UNIX- liknande operativsystem inte vidta ytterligare steg för att välja en viss översättning. Översättningen bestäms av en systemvariabel LANG, som vanligtvis redan är inställd på det önskade värdet.

Se även

Anteckningar

  1. Haible B. GNU gettext 0.21 släppt  - 2020 .
  2. 1 2 3 GNU gettext-manualen Arkiverad 5 december 2007 på Wayback Machine 
  3. makkarpov/scalingua: Ett enkelt gettext-liknande internationaliseringsbibliotek för Scala . github.com . Hämtad 28 april 2016. Arkiverad från originalet 24 april 2020.
  4. ↑ Så här ser en rad ut i en .po- översättningsfil . \ n i slutet av en rad betyder en radbrytning.

Länkar