[[oktatas:linux|< Linux]] ===== Gettext Rendszer ===== A gettext rendszer a programok nemzetközivé tételét valósítják meg. A programozónak a programot egy nyelven kell megírnia, a gettext rendszer segítségével, pedig bármilyen nyelven megszólal. Például angol nyelven megírom a programot, majd lefordítom magyarra. Az Interneten közzé teszem. A program képernyőre írt angol szövegét kigyűjtve kapja meg egy harmadik nyelven beszélő ember. Lefordítja saját nyelvére. Így a program már három nyelvű lesz. ===== Fogalmak ===== * POT – Portable Object Template. Ez fájl tartalmazza azokat a karaktersorozatokat -- sztringeket --, amelyeket egy alkalmazásból kapunk. Ezt adjuk át a fordítónak. * PO – Portable Object. Ezt a fájlt adj nekünk a fordító. Ez egy szöveges fájl, amelyben benne van az eredeti (például angol) és az adott nyelvere lefordított szöveg. * MO – Machine Object. A mo fájl tartalma megegyezik a pofájl tartalmával. A különbség csak a formátum. A pofájl az szöveges fájl, amelyet egy ember kényelmesen el tud olvasni, a mofájl viszont bináris fájl, a számítógépek részére készült. Az alkalmazásunk ebből a fájlból veszi a fordításokat. ===== Segítség ===== info gettext man 3 gettext ===== Működés ===== A programozás során szöveget jelenítünk meg a képernyőn (pl. C nyelvben): printf("alma"); A gettext rendszerhasználatához importálom a libintl.h fejállományokat. A szöveg kiiratását ez után a gettext függvénnyel hívom: #include main() { printf(gettext("alma")); } Ez után készítenem kell egy .pot kiterjesztésű fájlt, amely tartalmazza a lefordítandó szöveget. Ennek szabványos formátuma van. msgid "" msgstr "" "Project-Id-Version: tesztprojekt\n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Sallai András \n" "Language-Team: fercsapat \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-Country: HUNGARY\n" "X-Poedit-SourceCharset: utf-8\n" Elkészítéséhez érdemes segédprogramot használni. A fordítók (azok az emberek akik saját nyelvükre akarják megtanítani a programot) a pot fájt lemásolják .po kiterjesztéssel. Kitöltik a fejlécet, lefordítják a kifejezéseket a .po fájlban. Ez után egy .mo kiterjesztésű fájlt kell készíteni az msgfmt paranccsal. A programozó által megadott könyvtárban elhelyezzük a .mo fájlt és a program tud saját nyelvünkön. ===== Eszközök ===== xgettext A programozó forrás állományaiból kiszedi a fordítandó szöveget. xgettext -f fajlok.txt -p po -o main.pot -L C -k_ * -f fajlok.txt * fajlok.txt állomány tartalmazza a forrásállományok neveit. * -p po * Megadhatjuk a pot fájl milyen könyvtárban jöjjön létre * -o main.pot * A kimeneti .pot fájl neve * -L C * A forrás állományok C nyelven írodtak * -k_ * A C programban ha egy szöveget le akarok fordítani, a gettext() függvénnyel kell közrefogni. Ezt szokás egy ilyen makróval helyetesíteni: _(). Ennek a makrónak a használata esetén meg kell adni a ezt a kulcsot ily módon. ==== msgcat ==== Több .po fájl összefűzésére való ==== msgfmt ==== A .po fájlokból .mo fájlokat készít. A programok a .mo fájlokat értik meg. ==== Egyéb ==== msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq Lásd: info gettext! ===== Munka Grafikus felületen ===== Telepítsük a poedit nevű programot: apt-get install poedit Van win32 verziója is ha valaki ott szeretné használni. http://www.poedit.net A poedit nevű grafikus program lehetővé teszi a po fájlok gyors frissítési lehetőségét .pot fájlokból, gyors és hatékony fordítást tesz lehetővé, a mentés során a .mo kiterjesztésű állományt is elkészíti. ===== Példa ===== Egy példa program amely két szót ír a képernyőre alapesetben angolul: Input Output Azt szeretnénk, ha magyarul írná ki a Bemenet és Kimenet szavakat. ==== Forrás állomány elkészítése ==== main.c állomány #include #include #include #include main() { setlocale(LC_ALL, ""); bindtextdomain("main", "locale"); textdomain("main"); printf(gettext("Input\n")); printf(gettext("Output\n")); } ==== Pot fájl elkészítése ==== xgettext -o main.pot -L C main.c main.pot # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-10 20:10+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: main.c:7 #, c-format msgid "Input\n" msgstr "" #: main.c:8 #, c-format msgid "OUtput\n" msgstr "" ==== Po fájl elkészítése ==== cp main.pot main.po Lefordítjuk a main.po angol szövegét magyarra. main.po msgid "" msgstr "" "Project-Id-Version: programom\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-06-10 20:10+0200\n" "PO-Revision-Date: \n" "Last-Translator: Sallai András \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-Country: HUNGARY\n" "X-Poedit-SourceCharset: utf-8\n" #: main.c:7 #, c-format msgid "Input\n" msgstr "Bemenet\n" #: main.c:8 #, c-format msgid "OUtput\n" msgstr "Kimenet\n" ==== Mo fájl elkészítése ==== Lefordítjuk a po fájlt: msgfmt main.po -o main.mo A .mo fájlt a helyére tesszük: mkdir -p locale/hu/LC_MESSAGES mo main.mo locale/hu/LCMESSAGES/main.mo ===== Egyszerűsítés ===== A gettext rövidítve szoktuk írni. Ehhez egy makrót kell definiálni. #define _(string) (char *) gettext(string) Ezen makró definiálása után nem kell kiírnunk a függvény teljes nevét, elég ha egy alulvonással hivatkozunk rá. Ezek után a main.c állomány így nézhet ki: main.c állomány #include #include #include #include #define _(string) (char *) gettext(string) main() { setlocale(LC_ALL, ""); bindtextdomain("main", "locale"); textdomain("main"); printf(_("Input\n")); printf(_("Output\n")); } Ekkor a xgettext parancsnak még egy kapcsolót meg kell adnunk amely megmondja milyen helyettesítő karaktert vagy karaktersorozatot használunk: * -k_ A kapcsoló kis k betű ami után rögtön írhatjuk az alulvonás jelet. A teljes parancs így nézhet ki ekkor: xgettext -o main.pot -L C -k_ main.c A továbbiakban ugyanúgy járunk el mint fentebb.