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.
info gettext
man 3 gettext
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.
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_
Több .po fájl összefűzésére való
A .po fájlokból .mo fájlokat készít. A programok a .mo fájlokat értik meg.
msgcat msgcmp msgcomm msgconv msgen msgexec msgfilter msgfmt msggrep msginit msgmerge msgunfmt msguniq
Lásd: info gettext!
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.
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.
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")); }
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 ""
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"
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
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:
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.