Felhasználói eszközök

Eszközök a webhelyen


oktatas:linux:gettext_rendszer

Különbségek

A kiválasztott változat és az aktuális verzió közötti különbségek a következők.

Összehasonlító nézet linkje

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.
oktatas/linux/gettext_rendszer.txt · Utolsó módosítás: 2019/08/16 21:21 szerkesztette: admin