翻译自UIQ3官方开发文档;
本文档英文名称:LocalizingApplications-part3_v1.1.pdf Version 1.1
翻译者:yzhv@IOICN
欢迎转载,请注明出处作者.
在开发过程中本地化UIQ3程序
1 、简介
Symbian OS v9 的发布是一个显著的分水岭,系统引入了增强的安全架构。 安全模型也导致了程序结构的变化,因此程序资源文件的结构和位置也产生了一些变化。安全平台的详细介绍和软件的移植方法,参看 “Symbian OS Platform Security” by Craig Heath (Wiley 2006).
本文主要介绍与本地化过程相关的一些变化,幸运的是这些变化非常小,UIQ2上的一些基本原则仍然有效。
2 、软件的本地化
首先,看一下 (UIQ) .MMP 文件:
SOURCEPATH .
SOURCE HelloWorld_Main.cpp
SOURCE HelloWorld_Application.cpp
SOURCE HelloWorld_Document.cpp
SOURCE HelloWorld_AppUi.cpp
SOURCE HelloWorld_AppView.cpp
USERINCLUDE .
SYSTEMINCLUDE /epoc32/include
START RESOURCE HelloWorld.rss
HEADER
TARGETPATH /resource/apps
LANG 01 02
END
START RESOURCE HelloWorld_reg.rss
#ifdef WINSCW
TARGETPATH /private/10003a3f/apps
#else
TARGETPATH /private/10003a3f/import/apps
#endif
END
START RESOURCE HelloWorld_loc.rss
TARGETPATH /resource/apps
LANG 01 02
END
LIBRARY euser.lib, apparc.lib, cone.lib, eikcore.lib
LIBRARY qikctl.lib eikctl.lib qikcore.lib qikutils.lib qikdlg.lib
symbian v9 中 .MMP文件的变化主要与 RESOURCE 语法有关,例如
HEADER 关键字可选,该关键字导致在 系统包含目录 …/epoc32/include中产生一个资源头文件(.RSG) 。
TARGETPATH 定义资源文件编译后的(.RSC)存储位置。在 Symbian OS v9中, data caging (平台安全架构的一部分)要求资源必须放入正确的路径,要么是 公共只读目录/resource,要么是存储程序私有资源的 /private/<secure_ID>目录,<secure_ID> 是程序的UID3.
LANG 的意义与UIQ2.XX一致,因此在上面的例子中,资源编译将执行两次,每种语言一次。
3 、本地化程序的资源
看一下.RSS文件的内容 ,对于 UIQ 用户界面:
RESOURCE EIK_APP_INFO
{
hotkeys=r_example_hotkeys;
menubar=r_example_menubar;
}
RESOURCE HOTKEYS r_example_hotkeys
{
control=
{
HOTKEY { command=EEikCmdExit; key='e'; }
};
}
RESOURCE MENU_BAR r_example_menubar
{
titles=
{
MENU_TITLE { menu_pane=r_example_first_menu; txt=STRING_r_example_first_menu; }
};
}
RESOURCE MENU_PANE r_example_first_menu
{
items=
{
MENU_ITEM { command=EExampleItem0; txt=STRING_r_example_item0; },
MENU_ITEM { command=EExampleItem1; txt=STRING_r_example_item1; },
MENU_ITEM { command=EExampleItem2; txt=STRING_r_example_item2; },
MENU_ITEM { command=EEikCmdExit; txt=STRING_r_example_close; }
};
}
RESOURCE TBUF r_example_text_Hello { buf=STRING_r_example_text_hello; }
RESOURCE TBUF r_example_text_Item0 { buf=STRING_r_example_item0; }
RESOURCE TBUF r_example_text_Item1 { buf=STRING_r_example_item1; }
RESOURCE TBUF r_example_text_Item2 { buf=STRING_r_example_item2; }
与 v9以前的版本像同 ,使用条件包含,来引用 .RLS :
3.1 本地化资源字符串
包含本地化字符串的文件,其文件名与程序名字一样,后缀采用 _lXX扩展名,XX是语言编号.这些文件被 .RSS文件使用如下语句加载:
4、程序注册文件
v9 的另一个主要改变是程序注册文件 。 GUI程序现在是 .EXE文件 (v9以前是.APP文件),程序注册文件用于告诉应用程序架构,该 .exe是一个 GUI程序。再看一下MMP文件的如下结构:
程序注册文件名与程序名字相同,添加 _reg后缀,替代了UIQ2.x上支持的AIF文件。这些注册文件必须放进私有的 data caged 目录,由应用程序架构服务器拥有,该服务器负责软件的启动加载过程。将 _reg文件放入私有目录可以避免恶意用户伪造、替换程序的 _reg 文件。程序注册文件的内容如下:
APP_REGISTRATION_INFO 结构使用app_file声明 提供了二进制文件的文件名 (不含扩展名) 。如果提供了本地化 图标/标题 ,需要提供完整的文件路径(象上例一样),除了盘符和扩展名。这个文件定义了程序的标题和图标文件。通常文件名与程序名一样,不过使用 _loc 后缀。
HelloWorld_loc.rss 文件是个标准的 Symbian本地化资源文件,通过在程序的.MMP 文件中包含,由资源编译器编译:
5 、本地化程序的安装
本地化过程的最后一步就是创建安装包 (.SIS)文件。安装包可以在安装的时候根据电话设备的语言类型 安装相应的文件。Hello World 程序的PKG文件如下:
"/Symbian/UIQ3SDK/EPOC32/RELEASE/ARMV5/UREL/HelloWorld_UIQ.exe" -"!:/sys/bin/HelloWorld_UIQ.exe"
"/Symbian/UIQ3SDK/EPOC32/data/Z/private/10003a3f/apps/HelloWorld_reg.RSC" - "!:/private/10003a3f/import/apps/HelloWorld_reg.RSC"
{"/Symbian/UIQ3SDK/EPOC32/data/Z/resource/apps/HelloWorld.R01"
"/Symbian/UIQ3SDK/EPOC32/data/Z/resource/apps/HelloWorld.R02"
} -"!:/resource/apps/HelloWorld.RSC"
{"/Symbian/UIQ3SDK/EPOC32/data/Z/resource/apps/HelloWorld_loc.R01"
"/Symbian/UIQ3SDK/EPOC32/data/Z/resource/apps/HelloWorld_loc.R02"
} -"!:/resource/apps/HelloWorld_loc.RSC"
QUOTE:
// HelloWorld.mmp
TARGET HelloWorld.exe
TARGETTYPE exe
UID 0x100039CE 0xE0000003
QUOTE:
START RESOURCE HelloWorld.rss
HEADER
TARGETPATH /resource/apps
LANG 01 02
END
每个 .RSS 文件定义了一个 RESOURCE block 块,以 START 开始, END结束。
QUOTE:
NAME HEWO
#include <eikon.rh>
#include <eikcore.rsg>
#include <appinfo.rh>
#include "helloworld.hrh"
#ifdef LANGUAGE_01
#include "helloworld.l01"
#elif defined LANGUAGE_02
#include "helloworld.l02"
#endif
RESOURCE RSS_SIGNATURE { }
RESOURCE TBUF r_default_document_name
{
buf="HEWO";
}
QUOTE:
#ifdef LANGUAGE_01
#include "01-strings.rls"
#else if defined LANGUAGE_02
#include "02-strings.rls"
#endif
QUOTE:
#ifdef LANGUAGE_01
#include "helloworld.l01"
#elif defined LANGUAGE_02
#include "helloworld.l02"
#endif
helloworld.l02的内容如下,里面包含了语言 02 (France)的字符串资源.
QUOTE:
// Strings localised for France
rls_string STRING_r_example_first_menu "Bonjour"
rls_string STRING_r_example_item0 "Élément 0"
rls_string STRING_r_example_item1 "Élément 1"
rls_string STRING_r_example_item2 "Élément 2"
rls_string STRING_r_example_close "Fin"
rls_string STRING_r_example_text_hello "Bonjour Monde!"
rls_string STRING_r_example_short_caption "B M"
rls_string STRING_r_example_caption "Bonjour tout le monde"
QUOTE:
START RESOURCE HelloWorld_reg.rss
TARGETPATH /private/10003a3f/apps
END
QUOTE:
#include <appinfo.rh>
UID2 KUidAppRegistrationResourceFile
UID3 0xE0000003 // application UID
RESOURCE APP_REGISTRATION_INFO
{
app_file = "HelloWorld";
localisable_resource_file = //resource//apps//HelloWorld_loc;
}
QUOTE:
#include <AppInfo.rh>
#ifdef LANGUAGE_01
#include "helloworld.l01"
#elif defined LANGUAGE_02
#include "helloworld.l02"
#endif
RESOURCE LOCALISABLE_APP_INFO
{
short_caption = STRING_r_example_short_caption;
caption_and_icon =
{
CAPTION_AND_ICON_INFO
{
caption = STRING_r_example_caption;
number_of_icons = 1;
icon_file = //resource//apps//helloworld.mbm;
}
};
}
QUOTE:
START RESOURCE HelloWorld_loc.rss
TARGETPATH /resource/apps
LANG 01 02
END
QUOTE:
&01,02
#{"HelloWorld_v9_UIQ_EN","HelloWorld_v9_UIQ_FR"},(0xE0000003),1,0,1, TYPE=SA, NC
:"Symbian Software Ltd"
%{"Symbian Software","Symbian Logiciel."}
PKG文件具体细节不写了,请教modifier@IOICN吧 ,
<完>