GNU gettext | |
---|---|
Típusú | szoftverhonosítás , könyvtár |
Szerző | Ulrich Drepper |
Fejlesztők | GNU projekt |
Beírva | Xi |
Operációs rendszer | Unix-szerű , Microsoft Windows |
Interfész nyelvek | orosz és további 37 nyelv |
Hardver platform | platformközi |
legújabb verzió |
|
Olvasható fájlformátumok | GNU Gettext gépobjektum (big endian) [d] és GNU Gettext gépobjektum (litte endian) [d] |
Generált fájlformátumok | GNU Gettext gépobjektum (big endian) [d] és GNU Gettext gépobjektum (litte endian) [d] |
Állapot | aktív |
Engedély | |
Weboldal | gnu.org/software/gettext/ |
Médiafájlok a Wikimedia Commons oldalon |
A gettext egy nemzetköziesítésre szolgáló GNU projektkönyvtár , amelyet széles körben használnak a szabad szoftverekben .
A fő különbség a többi hasonló eszközhöz képest az, hogy a gettext az angol eredetijüket használja a fordítható karakterláncok kijelölésére a programszövegben, nem pedig speciális azonosítókat. Így kiderül, hogy a programnak nincs szüksége fordítási fájlokra a felület angol nyelvű megjelenítéséhez. Ez általában kényelmes, mert a legtöbb kifejlesztett alkalmazás már angol nyelven készült.
A gettext többes szám támogatással rendelkezik . Ehhez egy speciális függvényt használnak a program forráskódjában, és két sort adnak meg - egyes számban és többes számban. Amikor egy fordítást egy másik nyelvre cserél le, a fordítási karakterlánc annyi formája kerül felhasználásra, amennyi az adott nyelvhez szükséges. Ehhez a fordítási fájl fejlécének tartalmaznia kell egy nyelvspecifikus kifejezést a fordítási karakterlánc számonkénti kiválasztásához.
A gettext könyvtár feltételezi, hogy a fordítások .mo ( Eng. Machine Object , a program által könnyen olvasható és a platformra jellemző bináris fájl) vagy .gmo (GNU .mo), .po ( Angol Portable Object , egy ember által olvasható fájlplatform-független fordítás) és .pot ( a PO-sablon egy könyvtár, egy .po fájl előkészítése új nyelvre történő fordításhoz). [2] Magukon a fordítási karakterláncokon kívül a .po fájlok fordítói megjegyzéseket és különféle szolgáltatási jeleket is tartalmazhatnak.
A fájlok generálásához és frissítéséhez, amikor a program megváltozik, a gettext könyvtárban található számos segédprogramot kell használnia.
Kezdetben a program forráskódjának sorait a program xgettextegy .pot fájlba (könyvtárba) gyűjti össze. Ezt a fájlt és a fordítási fájlokat a forráskódban megjelenő új és módosított karakterláncokkal frissíti a msgmerge. Ezzel egyidejűleg minden már lefordított karakterlánc mentésre kerül, a már nem használtakat elavultnak, a megváltozottakat pedig pontatlannak ( angolul fuzzy ) jelöli meg . Alapértelmezés szerint a program nem használja az elavult és pontatlan karakterláncokat. A fordító kényelme miatt van rájuk szükség: sokszor könnyebb egy meglévő, bár elavult fordításra alapozni, mint a teljes kifejezést újra lefordítani.
A program egy adott nyelvre történő fordításának megkezdéséhez a fordító létrehoz egy .po-file-t: a -fájlt a megfelelő helyre másolja .pot, és megváltoztatja benne a címet. Ehhez használhatja a programot msginit. A kész fordítási fájlt a segédprogram .mo fájlokká konvertálja msgfmt. [2] .
Vannak olyan segédprogramok is a fordítók számára, amelyek megkönnyítik a fordítás szerkesztését, például:
A szabványos C alap gettext megvalósításán kívül a C++ , Objective-C , sh / bash scripting , Python , Perl , PHP , GNU CLISP , Emacs Lisp , librep , GNU Smalltalk , Java , Scala számára is léteznek hasonló megközelítésű megvalósítások [3] , GNU awk , Pascal , wxWidgets (a wxLocale osztály használatával), YCP ( YaST2 nyelv ), Tcl , Pike és R , Mono platformnyelvek (Mono.Unix névtér) és a Qt keretrendszerhez . Ezen nyelvek némelyikét közvetlenül támogatják a fent említett segédprogramok. [2] .
A legtöbb nyelv használata hasonló a C nyelv használatához.
A program működése közben a felhasználó számára megjelenített és ennek megfelelően fordítást igénylő karakterláncok a program forráskódjábangettext angolul vannak beírva és függvényhívással ngettextvagy hasonlóval jelölve .
printf ( gettext ( "Szia! A nevem %s. \n " ), név );Általában a forráskód méretének csökkentése és az olvashatóság javítása érdekében egy rövid függvény szinonimát #define _ gettext(aláhúzást) deklarálnak és használnak. Tehát a hívás a következőre konvertálódik
printf ( _ ( "Szia! A nevem %s. \n " ), név );A fenti sorban egy ehhez hasonló bejegyzés jelenik meg a könyvtárban az xgettext és az msginit parancsok megfelelő feldolgozása után:
#: src/name.c:36 msgid "Hello! A nevem %s.\n" msgstr "" Többes számA többes szám lefordításához a függvényt használjuk ngettext, amely két angol karakterláncot (az egyes és többes számhoz) és egy egész számot vesz paraméterként. PHP - ben a hívás ngettextegy számot tartalmazó karakterlánc kimenetére így néz ki:
printf ( ngettext ( "%d nappal ezelőtt" , "%d nappal ezelőtt" , $daysAgo ), $daysAgo );Maga a függvény ngettextnem helyettesíti a numerikus értéket %d, ezért a programozónak függvényt printfvagy hasonlót kell meghívnia, hogy a kívánt karakterláncot számmal képezze.
Ezután lefordítja a fájl sorait, például egy orosz fordításhoz:
#: src/name.c:36 msgid "Hello! A nevem %s.\n" msgstr "Szia! A nevem %s.\n" Többes számA többes számok fordításához szükséges, hogy a fájl fejléce (ahol az adatok, például Project-Id-Versionés PO-Revision-Date) jelezze .poaz adott nyelv többes szám képzésének szabályát. Például az oroszban a többes szám három formája létezik:
E három forma egyikének kiválasztása a számtól függően a következő képlettel történik [4] :
" Többes számú alakok: 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"A kifejezés itt a C nyelv szintaxisával van írva, és csak a kimeneti számot jelölő pluralváltozóra támaszkodhat .n
Egy ilyen nyilatkozat után az űrlapok 0, 1 és 2 számokat vesznek fel, és a kifejezés fordítása a következő:
msgid " %d days ago" msgid_plural "%d nappal ezelőtt" msgstr [ 0 ] "%d nappal ezelőtt" msgstr[ 1 ] "%d nappal ezelőtt" msgstr[ 2 ] "%d nappal ezelőtt"A UNIX - szerű operációs rendszereket használó felhasználóknak általában nem kell további lépéseket tenniük egy adott fordítás kiválasztásához. A fordítást egy rendszerváltozó határozza meg LANG, amely általában már be van állítva a kívánt értékre.