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 | |
Hemsida | gnu.org/software/gettext/ |
Mediafiler på Wikimedia Commons |
gettext är ett GNU - projektbibliotek för internationalisering , flitigt använt i fri programvara .
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.
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 "" PluralsFö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.
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" PluralsFö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:
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"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.