Készítsünk HANGMAN játékot! - 3. rész

Többnyelvűsítsük a HANGMANünket! A 21. században illő, hogy egy program képes legyen több nyelven is megjelenni. Elég sokféle dolgot találhatnánk ki erre a feladatra, de linux berkekben a GNU gettext megoldás terjedt el, ami talán nem a legjobb, de mindenestere közismert, könnyen implementálható, ráadásul szinte az összes elterjedt programozási nyelvhez létezik modulja, osztálya, akármilye.



A Pythonnak is létezik gettext modulja, használatához természetesen be kell őt importálnunk, tehát az import sorok alá helyezzünk el egy import gettext sort.

A program azon üzeneteit, amelyeket több nyelven szeretnénk megjeleníteni, "gettextesítenünk" kell.

Hogy dolgozik a gettext?
A többnyelvű stringeket a programkódon belül a _() függvénybe kell helyezni. Egy erre a célra szolgáló segédeszközzel (pl. python-babel, lásd később) ki kell gyűjtenünk. Az eszköz egy úgyneveztt 'pot' fájlt készít, amiből a fordítók elkészíthetik a saját nyelvi 'po' fájljukat. A 'po' fájlokat egy szintén erre a célra készített eszközzel 'mo' fájllá alakítjuk. Mi a különbség a kettő között? Nos, a 'po' az emberek munkájához van igazítva, a 'mo' pedig a gettexthez, binárisan tartalmazza a stringeket. A gettext a programból meghívva megnézi, hogy a környezeti változókban (LANGUAGE vagy LANG) milyen lokál van beállítva, és az annak megfelelő, megadott helyen található nyelvi alkönyvtár (pl. hu_HU.utf8) LC_MESSAGES alkönyvtárában az úgynevezett 'domain'-nek megfelelő 'mo' fájlt keres. Ha talál, betölti, és futásidőben a megfelelő stringeket kicseréli a nyelvi párjára. Ha nem talál ilyen fájlt, akkor a _() függvény kimenete az eredeti string lesz. Egyszerű de nagyszerű :)

No akkor essünk neki!
Az első lépés, hogy az import gettext után tegyük be a következő sort:

gettext.install('hangman', './lang', unicode=1)

Ez a sor a megadott argumentumok szerint létrehozza és beállítja nekünk a _() függvényt, méghozzá úgy, hogy ha a LANGUAGE=hu, akkor a ./lang/hu/LC_MESSAGES/hangman.mo fájlt fogja betölteni hozzá.

Vegyük figyelembe, hogy az programozás emberi nyelve az angol, ezért először is tanuljunk angolul, másodszor szokjunk hozzá, hogy a változóinkat, a forrásbeli megjegyzéseinket és a stringeket angol nyelven írjuk meg, így ha nyílt forrásúként a projektünket a google code-ra vagy a sourceforge-ra feltesszük, egy teljesen más nyelvű lelkes fejlesztő is rész tud venni a munkában. A HANGMANünk forrását senki ne tegye fel :D mivel a magyar olvasóknak szánva érthető magyar neveket használtam mindenütt.

No, vissza a gettexthez... Írjunk át minden stringet angol nyelvre, és foglaljuk őket a _() függvénybe. Mellékelem a teljes forrást v1.2 verziószámon, úgyhogy nem muszáj most nekikezdeni mindenkinek :)

Példa:
print _("Welcome to the game!")

Ha megvan, következő lépés a stringek kigyűjtése. Erre a célra én a python-Babel csomagot ajánlom, ennek elég problémamentes a használata. Parancs:
pybabel extract -o hangman.pot ./

Az így kapott 'pot' fájlt másoljuk egy hangman.po fájlba, majd magyarítsuk le az angol szöveget a KDE Lokalize programjával, vagy a gtk-s POEdit-tel, de akár egy sima szövegszerkesztővel is megtehetjük.

Ha kész, mehet a 'mo' fájl előállítása az alábbi paranccsal:
pybabel compile -i hangman.po -o hangman.mo

Ezután be kell tennünk az elkészült 'mo'-t a helyére. Mivel egy linux rendszerben a magyar nyelvhez a lokál beállítás lehet 'hu' vagy 'hu_HU' esetleg 'hu_HU.utf8', ezeket a könyvtárakat létre kell hoznunk a lang könyvtáron belül, majd mindegyikben egy LC_MESSAGES alkönyvtárat. Ezekbe másoljuk be a 'hangman.mo' fájlunkat.

Készen is vagyunk!

Ha most magyar linuxunk van, a hangmant futtatva magyar stringeket kapunk, más nyelven az eredeti angol üzenetek jelennek meg.

Teszteljük! Egy terminálablakban állítsuk át a LANGUAGE környezeti változót angolra, és futtassuk a hangmant!
export LANGUAGE=en
python hangman.py

Angol szöveget fogunk látni! :D
v1.2 zip

1 megjegyzés:

  1. Az input -hoz hogy tudod használni ezt?
    pl:
    valtozo = input("Ide jön amit megjelenít: ")

    VálaszTörlés