GNU gettext | |
---|---|
Type | software lokalisering , bibliotek |
Forfatter | Ulrich Drepper |
Udviklere | GNU projekt |
Skrevet i | Xi |
Operativ system | Unix-lignende , Microsoft Windows |
Interface sprog | Russisk og 37 flere sprog |
Hardware platform | på tværs af platforme |
nyeste version | |
Læsbare filformater | GNU Gettext Machine Object (big endian) [d] og GNU Gettext Machine Object (litte endian) [d] |
Genererede filformater | GNU Gettext Machine Object (big endian) [d] og GNU Gettext Machine Object (litte endian) [d] |
Stat | aktiv |
Licens | |
Internet side | gnu.org/software/gettext/ |
Mediefiler på Wikimedia Commons |
gettext er et GNU - projektbibliotek til internationalisering , som er meget brugt i fri software .
Den største forskel fra andre lignende værktøjer er, at gettext bruger deres engelske originaler til at udpege oversættelige strenge i programteksten i stedet for specielle identifikatorer. Det viser sig således, at programmet ikke behøver oversættelsesfiler for at vise grænsefladen på engelsk. Dette er normalt praktisk, fordi de fleste af de udviklede applikationer allerede er skrevet på engelsk.
gettext har støtte i flertal . For at gøre dette bruges en speciel funktion i programmets kildekode, og der gives to linjer - i ental og flertal. Når du erstatter en oversættelse til et andet sprog, bruges så mange former for oversættelsesstrengen som nødvendigt for det pågældende sprog. For at gøre dette skal oversættelsesfilens overskrift indeholde et sprogspecifikt udtryk til valg af oversættelsesstrengnummer efter nummer.
Gettext-biblioteket antager, at oversættelser gemmes i filer med filtypenavnene .mo ( Eng. Machine Object , en binær fil, der er let at læse af programmet og specifik for platformen) eller .gmo (GNU .mo), .po ( Engelsk Portable Object , en menneskelig læsbar filplatformsuafhængig oversættelse) og .pot ( PO-skabelon er en mappe, en forberedelse af en .po-fil til oversættelse til et nyt sprog). [2] Ud over selve oversættelsesstrengene kan .po-filer indeholde oversætterens kommentarer og forskellige servicemærker.
For at generere og opdatere disse filer, når programmet ændres, er det meningen, at det skal bruge en række hjælpeprogrammer inkluderet i gettext-biblioteket.
Indledningsvis samles linjer fra programmets kildekode af programmet xgettexttil en .pot -fil (mappe). Denne fil og oversættelsesfiler opdateres med nye og ændrede strenge, der vises i kildekoden af msgmerge. Samtidig gemmes alle allerede oversatte strenge, de der ikke længere bruges markeres som forældede, og de der er ændret markeres som unøjagtige ( engelsk fuzzy ). Som standard vil forældede og unøjagtige strenge ikke blive brugt af programmet. De er nødvendige for oversætterens bekvemmelighed: det er ofte lettere at basere på en eksisterende, omend forældet, oversættelse end at oversætte hele sætningen igen.
For at begynde at oversætte et program til et bestemt sprog, opretter oversætteren en .po-fil: kopierer .pot-filen til det rigtige sted og ændrer titlen i den. For at gøre dette kan du bruge programmet msginit. Den færdige oversættelsesfil konverteres til .mo-filer af værktøjet msgfmt. [2] .
Der er også hjælpeprogrammer til oversættere, der gør det nemmere at redigere oversættelsen, for eksempel:
Ud over den grundlæggende gettext-implementering for standard C , er der implementeringer af en lignende tilgang til C++ , Objective-C , sh / bash scripting , Python , Perl , PHP , GNU CLISP , Emacs Lisp , librep, GNU Smalltalk , Java , Scala [3] , GNU awk , Pascal , wxWidgets (ved hjælp af wxLocale-klassen), YCP ( YaST2 -sprog ), Tcl , Pike og R , Mono -platformsprog (Mono.Unix-navneområde) og for Qt -rammeværket . Nogle af disse sprog understøttes direkte af de ovennævnte værktøjer. [2] .
Brug på de fleste sprog svarer til brug i C.
De strenge, der vises for brugeren under programdrift og derfor kræver oversættelse, er skrevet på engelsk i programmets kildekode og markeret med et funktionskald gettexteller ngettextlignende.
printf ( gettext ( "Hej! Mit navn er %s. \n " ), navn );Normalt, for at reducere størrelsen af kildekoden og forbedre læsbarheden, #define _ gettexterklæres og bruges et kort funktionssynonym (understregning). Så opkaldet konverteres til
printf ( _ ( "Hej! Mit navn er %s. \n " ), navn );For ovenstående linje vil en post som denne vises i mappen, efter passende behandling med kommandoerne xgettext og msginit:
#: src/name.c:36 msgid "Hej! Mit navn er %s.\n" msgstr "" FlertalsformerFor at oversætte flertal bruges funktionen ngettext, der tager som parametre to engelske strenge (for henholdsvis ental og flertal) og et heltal. I PHP ser opfordringen ngettexttil at udskrive en streng med et tal sådan ud:
printf ( ngettext ( "%d dag siden" , "%d dage siden" , $daysAgo ), $daysAgo );Funktionen ngettexti sig selv erstatter ikke en numerisk værdi for %d, så programmøren skal kalde en funktion printfeller lignende for at danne den ønskede streng med et tal.
Den oversætter derefter linjerne i den fil, for eksempel til en russisk oversættelse:
#: src/name.c:36 msgid "Hej! Mit navn er %s.\n" msgstr "Hej! Mit navn er %s.\n" FlertalsformerFor at oversætte flertalsformer er det nødvendigt, at overskriften (hvor data som Project-Id-Versionog PO-Revision-Date) er angivet) .poaf filen angiver reglen for dannelsen af flertalsformer for et givet sprog. For eksempel er der tre former for flertal på russisk:
Valget af en af disse tre former, afhængigt af antallet, udføres med følgende 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"Udtrykket for pluralher er skrevet ved hjælp af C-sprogets syntaks og kan kun stole på variablen n, som angiver outputnummeret.
Efter en sådan erklæring antager formularerne tallene 0, 1 og 2, og oversættelsen af sætningen er som følger:
msgid " %d dage siden" msgid_plural "%d dage siden" msgstr [ 0 ] "%d dage siden" msgstr[ 1 ] "%d dage siden" msgstr[ 2 ] "%d dage siden"Typisk behøver en bruger på UNIX - lignende operativsystemer ikke at tage yderligere skridt for at vælge en bestemt oversættelse. Oversættelsen bestemmes af en systemvariabel LANG, som normalt allerede er indstillet til den påkrævede værdi.