{progz}

Symbian program magyarosítása: .loc fájlok és a 17-es nyelvkód

Az utóbbi hónapokban elég sok Series 60-as programot fordítottam magyarra, és közben rájöttem, hogy a munka nagy része a fejlesztőn múlik. Ha a szöveg rendesen ki van szervezve, a fordítás egy délután. Ha a feliratok szét vannak szórva a forráskódban, akkor hexaszerkesztős kínlódás lesz belőle. Ez a jegyzet a fejlesztői oldalt mutatja be: hogyan érdemes megírni egy Symbian C++ alkalmazást úgy, hogy több nyelven is működjön.

Hol vannak a szövegek egy Symbian programban?

Egy tipikus S60 alkalmazás felületét az erőforrásfájl (.rss) írja le: menük, szoftbillentyűk, párbeszédablakok. Ebből a fordító egy bináris .rsc fájlt készít, amit a program futás közben betölt. A jó gyakorlat az, hogy az .rss maga se tartalmazzon szöveget, csak makrókat. A makrók értéke a lokalizációs (.loc) fájlban van.

// progzdemo.rss
NAME PRGZ
CHARACTER_SET UTF8

#include <eikon.rh>
#include <avkon.rh>
#include <avkon.rsg>
#include "progzdemo.loc"

RESOURCE MENU_PANE r_progzdemo_menu
    {
    items =
        {
        MENU_ITEM { command = EProgzCmdStart; txt = qtn_menu_start; },
        MENU_ITEM { command = EAknCmdExit;    txt = qtn_menu_exit; }
        };
    }

A .loc fájl és a nyelvenkénti változatok

A progzdemo.loc csak egy elosztó, amely a fordításkor megadott nyelv szerint behúzza a megfelelő szövegfájlt:

// progzdemo.loc
#ifdef LANGUAGE_01
#include "progzdemo.l01"   // angol
#elif defined LANGUAGE_17
#include "progzdemo.l17"   // magyar
#endif
// progzdemo.l17
#define qtn_menu_start  "Indítás"
#define qtn_menu_exit   "Kilépés"
#define qtn_note_saved  "Mentve a memóriakártyára"

A számok a Symbian TLanguage felsorolásából jönnek. Az angol az 1, a magyar a 17 (ELangHungarian). Ezt nem kell fejben tartani, de a fájlneveknél és az MMP-ben ezt a két számjegyet kell használni.

MMP: melyik nyelvre forduljon?

TARGET        progzdemo.app
TARGETTYPE    app
UID           0x100039CE 0x10005B91
SOURCEPATH    ..\src
SOURCE        progzdemo.cpp progzdemoappui.cpp
RESOURCE      ..\data\progzdemo.rss
LANG          01 17

A LANG 01 17 miatt a build két erőforrást készít: progzdemo.r01 és progzdemo.r17. Mindkettő ugyanabból az .rss-ből lesz, csak más LANGUAGE_xx makróval.

A telepítő választ nyelvet

A .pkg fájlban fel kell sorolni a nyelveket, és meg kell adni, hogy melyik .rsc változat menjen fel a telefonra. A telepítő megkérdezi a felhasználót, és csak a választott nyelvű fájlt másolja fel:

&EN,HU
#{"Progz Demo","Progz Demo"},(0x10005B91),1,0,0

{
"\epoc32\data\z\system\apps\progzdemo\progzdemo.r01"
"\epoc32\data\z\system\apps\progzdemo\progzdemo.r17"
}-"!:\system\apps\progzdemo\progzdemo.rsc"

Ékezetek: miért lesz ő-ből õ?

Ez az a hiba, amelyet a legtöbb magyarosított programban látni. Az erőforrás-fordító alapból nyugat-európai kódlappal dolgozik, abban pedig nincs ő és ű. Ezek helyett az õ és û jelenik meg, ami pont úgy néz ki, mint egy rosszul beállított weboldalon. A megoldás az .rss elején lévő CHARACTER_SET UTF8 sor, és az, hogy a .l17 fájlt is UTF-8 kódolással mentjük. A Jegyzettömb ezt is tudja, csak a Mentés másként ablakban át kell állítani a kódolást.

Amit a kódban kell megoldani

Futás közben a szöveget mindig az erőforrásból olvassuk, például így: HBufC* text = StringLoader::LoadLC(R_PROGZDEMO_NOTE_SAVED);. Ha valahol mégis egy _LIT(KSaved, "Saved") maradt a kódban, az a magyar felületen angolul fog megjelenni. A _LIT makrót érdemes fájlnevekre és belső azonosítókra tartogatni.

Utolsó tapasztalat: a magyar szavak hosszabbak. A „Back” helyére kerülő „Vissza” még elfér, de a „Beállítások” már gyakran levágódik a jobb szoftbillentyűn. Ezt csak a valódi készüléken veszed észre, az emulátor betűtípusa máshogy fut ki.