< 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.