A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
— |
oktatas:linux:gettext_rendszer [2019/08/16 21:21] (aktuális) admin létrehozva |
||
---|---|---|---|
Sor 1: | Sor 1: | ||
+ | [[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 <libintl.h> | ||
+ | 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 <valaki@valaholazinterneten.hu>\n" | ||
+ | "Language-Team: fercsapat <fercsapat@valahol2.hu>\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 <stdio.h> | ||
+ | #include <libintl.h> | ||
+ | #include <locale.h> | ||
+ | #include <stdio.h> | ||
+ | | ||
+ | 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n" | ||
+ | "Language-Team: LANGUAGE <LL@li.org>\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 <valaki@valaholazinternete.hu>\n" | ||
+ | "Language-Team: <fordito@valahol2.hu>\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 <stdio.h> | ||
+ | #include <libintl.h> | ||
+ | #include <locale.h> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | #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. |