Symbian program magyarosítása: .loc fájlok és a 17-es nyelvkód
Közzétéve:
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.