Többnyelvű webalkalmazások 1

Ha szeretnénk webes alkalmazásainkat a nagyvilág számára is használhatóvá tenni, akkor előbb-utóbb biztosan belefutunk abba a problémába, hogy valahogy többnyelvűsíteni kellene az alkalmazást. Elvileg nem egy nagy feladat, csak a szövegeket kell kicserélni a másik nyelvbeli megfelelőjére. De hogyan is?

A többnyelvűség problematikája

Adott egy jól működő webes alkalmazás, ami lehet akár egy teljes különálló alkalmazás, vagy akár egy egyszerű (vagy éppen összetett) plugin valami máshoz. Ha nem csak egy nyelven akarjuk elérhetővé tenni – ami mostanában azért már elég jellemző igény – akkor valahogyan gondoskodnunk kell arról, hogy nemzetközivé váljon. A nemzetköziségnek két szintje van az egyik az internationalization (i18n) a másik a localization (l10n). Mondjuk úgy, hogy az i18n azt jelenti, hogy az alkalmazás beszél angolul és magyarul is, a l10n pedig azt, hogy beállítható, hogy mondjuk az angol dátumformák közül (dd/mm/yy vagy mm/dd/yy) melyiket használja.

Persze nem csak a szövegek nyelvezetéről van szó, hanem például arról, hogy tizedes pontok vagy vesszők vannak és más hasonló helyi ábrázolásbeli eltérések.

Megoldások

A i18n problémakörre többféle megoldást is használhatunk webes alkalmazásainkban. Ezek közül a két legelterjedtebbet futjuk át.

Nyelvi tömbök

Az egyik megközelítés szerint minden kiírandó szöveget a szerver oldalon egy tömbben tárolunk, és egy-egy tömb egy-egy nyelvet képvisel. Ebben az esetben a tömbelemek vagy sima szövegek, vagy egymás után lévő konstans képző utasítások. Persze a szövegek jöhetnek szövegfileokból, adatbázisból, xml-ből vagy amiből csak akarjuk.

<?php
if(LANG == 'hu'){
   $text['login'] = 'Bejelentkezés';
   $text['logout'] = 'Kijelentkezés';
   }
elseif(LANG == 'en'){
   $text['login'] = 'Log in';
   $text['logout'] = 'Log out';
   }
//használatkor pedig ezt tesszük:
print $text['login'];
?>
<?php
if(LANG == 'hu'){
   define('LOGIN', 'Bejelentkezés');
   define('LOGOUT', 'Kijelentkezés');
   }
elseif(LANG == 'en'){
   define('LOGIN', 'Log in');
   define('LOGOUT', 'Log out');
   }

//használatkor pedig ezt tesszük:
print LOGIN;
?>

Ez a módszer bőven elegendő kisebb projektek i18n kezelésére. Mivel a különböző nyelveken a kifejezések nincsenek közvetlenül összepárosítva egy-egy bővítés vagy egy új nyelv támogatásának megvalósítása nehézkes lehet.

Gettext

A másik az előbbinél talán kicsit bonyolultabb, de jóval rugalmasabb módszer a gettext használata. Ebben az esetben a háttérben valami hasonló történik mint a nyelvi tömbök esetében, vagyis a különböző nyelvek egymásnak megfelelő szövegei eltárolásra kerülnek. Itt nyelvenként egy speciális szövegfile-t használunk, amelyet nem tudunk kézzel szerkeszteni, csak valami speciális szerkesztőprogram segítségével. Ez az a pont ahol első körben mindenki elretten attól, hogy használja a gettextet, pedig ha az ember túljut ezen akkor sokszorosan megtérül a befektetett energia.

Első lépésben amikor megalkotjuk a php scripteket, akkor ha használni akarunk majd valamit a nyelvi fileunkból akkor a _() függvény meghívásával tesszük meg. A _() függvény visszaadja a beállított nyelven a kért szöveget. Tehát a php filejaink valahogy így fognak kinézni.

print _('Chant Goranga and be happy!');

Ezzel felkészítettük a php filejainkat a nyelvi fileok elkészítésére. Ehhez szükségünk lesz a fent említett speciális szerkesztőre. Sok sok ilyen szerkesztő program érhető el, amelyk közül a poedit egy jó választás, mivel elérhető Ablax, Mac és Linux oprendszerre is. Ha ezt feltelepítettük és beállítottuk akkor szépen végignézi a php filejainkat és keresgéli bennük a _() függvényhívásokat. Ebből összerak egy listát és már pötyörézhetjük is bele a nyelvi megfelelőket – mondjuk magyarul.

Alapból a rendszer egy .pot file-t hoz létre, ez a szövegek gyűjteménye amelyeket a program a fenti függvényhívásokban talált. Ebből a .pot fileból a poedittel generálhatunk különböző nyelvű .po és .mo fileokat. A .po fileok szövegfileok és tartalmazzák az adott nyelven lévő fordítást, míg a .mo egy optimalizált bináris file a gép számára. Ennek segítségével a kiszolgáló gép sokkal gyorsabban fogja megtalálni a szövegeket.

A következő részben a fejtágítás után megnézzük, hogy mit is és hogyan is.

5 thoughts on “Többnyelvű webalkalmazások 1

  1. Van esetleg mód arra is, ennél az utóbbi megoldásnál ha az eredeti nyelvezet magyar, és az tartalmaz ékezetes betűket, akkor is működjön ez a módszer?
    Például a következő kifejezést is tudná kezelni, vagy át kell szövegeznem ékezet mentesre?:

    print _(‘Árvíztűrő tükörfúrógép’);

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.