基于Symbian OS的本地化技術(shù)研究
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一、引言
Symbian OS是一種開放、非常健壯的嵌入式操作系統(tǒng),它由Symbian公司開發(fā)。Symbian OS是針對(duì)未來無線互聯(lián)手持設(shè)備的新一代移動(dòng)系統(tǒng)平臺(tái),其目標(biāo)是把Symbian OS開發(fā)成為未來手機(jī)的產(chǎn)業(yè)標(biāo)準(zhǔn)。所以它對(duì)應(yīng)用程序的本地化提供了便利的條件和強(qiáng)有力的支持。Symbian OS內(nèi)置了Unicode編碼,應(yīng)用程序的開發(fā)架構(gòu)也將源文件與資源文件相分離。因此對(duì)于拉丁字符集,使用不同的語言文本改編應(yīng)用程序應(yīng)該只需改變資源文件,因?yàn)橛脩艨梢曃谋静粫?huì)嵌入到源文件當(dāng)中。但對(duì)于非拉丁語言,比如生產(chǎn)使用漢語、日語、朝鮮語等的應(yīng)用程序,文本的本地化要復(fù)雜一些,需要做一些額外的工作。下面以Symbian OS的應(yīng)用開發(fā)平臺(tái)Series 60為例,在重點(diǎn)講述Symbian OS對(duì)本地化支持的基礎(chǔ)上,對(duì)應(yīng)用程序的漢化加以解決。
二、 Symbian OS應(yīng)用開發(fā)平臺(tái)Series 60介紹
由于各廠商之間在用戶接口、硬件設(shè)計(jì)及互通性上存在的差別及其自身的革新,Symbian OS給移動(dòng)設(shè)備制造商提供很大的靈活性。這種靈活性可以使用同一個(gè)內(nèi)核的操作系統(tǒng)設(shè)計(jì)出不同的產(chǎn)品,而且給設(shè)備制造商提供了更新空間,從而使得其在移動(dòng)市場上支持更多的設(shè)備。Series 60平臺(tái)正是基于Symbian OS的這種靈活性,在其之上進(jìn)行構(gòu)建。如圖1所示。
Series60平臺(tái)的內(nèi)核是Symbian OS GT(Generic Technology,通用技術(shù))層。提供了擴(kuò)展的Avkon UI層、基于Avkon和Uikon庫的完整應(yīng)用程序套件以及第三方GUI應(yīng)用程序所使用的用戶接口和框架API。
三、 Series 60開發(fā)平臺(tái)下應(yīng)用程序架構(gòu)對(duì)本地化的支持
3.1 應(yīng)用程序的文件架構(gòu)
在開發(fā)應(yīng)用程序之前必須了解Series60平臺(tái)的應(yīng)用程序文件架構(gòu)。Carbide C++是當(dāng)前諾基亞公司為自己的S60系列智能手機(jī)應(yīng)用程序開發(fā)提供的新一款I(lǐng)DE工具。在利用Carbide C++創(chuàng)建一項(xiàng)工程后(例如工程名為HelloWorld,程序架構(gòu)為單視圖),我們能看到如下的應(yīng)用程序文件架構(gòu):
(1)data文件夾中的.rss文件與src中的.cpp源文件相分離,為實(shí)現(xiàn)應(yīng)用程序本地化提供了便利的條件。后面的內(nèi)容將詳細(xì)剖析它的具體實(shí)現(xiàn)機(jī)制。
(2)Aif文件夾中包含可選的應(yīng)用程序信息文件(.aif文件),用于指定應(yīng)用程序的本地化圖標(biāo)、標(biāo)題及系統(tǒng)特性(如可嵌入性)。
(3)inc文件夾中包含的是定義程序骨架類的.h頭文件,和實(shí)現(xiàn)本地化所定義的.loc和.lXX文件。
(4)src文件夾中包含的是.cpp源文件,實(shí)現(xiàn).h中定義的類。聯(lián)編時(shí)各文件之間具體的關(guān)系如圖2所示
3.2 應(yīng)用程序框架類的關(guān)系
與編寫普通的VC MFC程序一樣,必須熟悉程序中各個(gè)類之間的關(guān)系。每一個(gè)應(yīng)用程序必須定義4個(gè)對(duì)象:
l Application類定義了應(yīng)用程序的屬性如UID、標(biāo)題并創(chuàng)建一個(gè)新的文檔。是應(yīng)用程序的主入口,它也將應(yīng)用程序相關(guān)信息傳遞回框架。應(yīng)用程序類并不涉及應(yīng)用程序的數(shù)據(jù)和算法。
l Document類描述應(yīng)用程序的數(shù)據(jù)模型。對(duì)一個(gè)基于文件的應(yīng)用程序,它存儲(chǔ)和刷新應(yīng)用程序的數(shù)據(jù),響應(yīng)AppUI類產(chǎn)生對(duì)一個(gè)文檔編輯的請(qǐng)求。
l AppUI是主要的用戶接口類,它是大量框架所發(fā)出通知的接受者,例如用戶的按鍵或者重要的系統(tǒng)事件。AppUI將處理事件本身,或者在適當(dāng)?shù)厍闆r下,將這些事件傳遞給它所擁有的視圖,達(dá)到處理的目的。
l View類用于在屏幕上顯示應(yīng)用程序數(shù)據(jù)并允許用戶與之交互。對(duì)一個(gè)復(fù)雜的程序可能有多種方法顯示其數(shù)據(jù),因此包含多個(gè)視圖類。它們之間的關(guān)系如圖3所示。
可以簡單地歸納為:Application類創(chuàng)建一個(gè)文檔,文檔類創(chuàng)建AppUI,AppUI類創(chuàng)建視圖。從圖3我們可以看到應(yīng)用程序還包括一個(gè)model類,model類用于封裝應(yīng)用程序數(shù)據(jù)和它的算法,給程序的其他部分提供良好的API。
3.3 實(shí)現(xiàn)應(yīng)用程序的本地化機(jī)制
為詳細(xì)說明實(shí)現(xiàn)應(yīng)用程序本地化的內(nèi)部機(jī)制,我們以上面的HelloWorldLoc工程為例,只針對(duì)為實(shí)現(xiàn)這種機(jī)制的.rss文件,.rsg文件,.loc文件,.lXX文件進(jìn)行分析。在圖2當(dāng)中,我們看到.l01、.l02、.l03和.loc這類文件。.lXX文件中定義了不同的語言,比如HelloWorldLoc.l01中把要顯示的文本定義成英文,HelloWorldLoc.l02中定義成了法語,而HelloWorldLoc.l03中定義成了德語。通過編譯發(fā)布,可以很方便實(shí)現(xiàn)應(yīng)用程序和資源的本地化,在真機(jī)顯示相對(duì)應(yīng)的語言。例如在HelloWorldLoc.l01文件中可以定義英文文本:
#define ELanguage ELangEnglish // Caption language
#define qtn_app_caption_string "HelloWorldLoc"
#define qtn_app_short_caption_string "HelloWL"
#define LABEL_TEXT "Hello World!"
而在HelloWorldLoc.l02中定義法語文本:
#define ELanguage ELangFrench // Caption language
#define qtn_app_caption_string "BonjourLoc"
#define qtn_app_short_caption_string "BonjourL"
#define LABEL_TEXT "Bonjour Monde!"
同樣道理,在HelloWorldLoc.l03中可以定義德語文本。
在HelloWorldLoc.loc文件中根據(jù)本地化需求包含相應(yīng)的.lXX文件,例如包含定義英文字符串的HelloWorldLoc.l01文件。
#include "HelloWorldLoc.l01"
在.rss文件中包含HelloWorldLoc.loc文件,可以引用.lXX中的本地化資源。
#include “HelloWorldLoc.loc”
RESOURCE TBUF r_label_text{ buf = LABEL_TEXT;}
假如這里引用的LABEL_TEXT是HelloWorldLoc.l01中定義的英文文本:
#define LABEL_TEXT "Hello World!"
那么在Carbide C++集成開發(fā)環(huán)境下,資源編譯器rcomp.exe對(duì)包含本地化資源的HelloWorldLoc.rss文件編譯后,輸出一個(gè)二進(jìn)制資源文件HelloWorldLoc.rsc和一個(gè)HelloWorldLoc.rsg頭文件。HelloWorldLoc.rsg頭文件中利用#define定義符號(hào)名R_LABEL_TEXT來引用本地化資源。如下定義:
#define R_LABEL_TEXT 0x2aa81006
在顯示數(shù)據(jù)的View類的.cpp源文件中,包含HelloWorldLoc.rsg頭文件,通過引用R_LABEL_TEXT就可以顯示它所標(biāo)識(shí)的"Hello World!"字符串。
3.4 實(shí)現(xiàn)應(yīng)用程序的漢化技術(shù)
對(duì)于英語、法語、德語這些拉丁字符集均是通過Unicode標(biāo)準(zhǔn)進(jìn)行編碼,Symbian OS內(nèi)置了Unicode編碼,所以通過改變.loc文件中所包含的.lXX文件,可以很方便的生成不同語言文本的應(yīng)用程序。在Symbian OS的epoc32Includee32std.h頭文件中我們可以看到定義了這些語言標(biāo)識(shí)碼,每種支持的語言都具有兩位數(shù)字的標(biāo)識(shí)碼。例如英語是01,法語是02,德語是03:
enum TLanguage
{ELangEnglish = 1, /** UK English. */
ELangFrench = 2, /** French. */
……
ELangHongKongChinese = 30, /** Hong Kong Chinese. */
ELangPrcChinese = 31, /** Peoples Republic of Chinas Chinese. */
……
}
在上面定義的標(biāo)識(shí)代碼中,我們可以看到對(duì)漢語的標(biāo)識(shí)代碼也有所定義,分別是30和31。但我們并不能簡單地在.lXX文件中定義中文文本。中文文本屬于非拉丁語系,對(duì)于非拉丁語言,文本的本地化要復(fù)雜一些。對(duì)于生產(chǎn)使用漢語、日語、朝鮮語等的應(yīng)用程序,Symbian OS和Series60 SDK確實(shí)提供了一些支持,但我們需要做一些額外的工作。要解決漢字問題,必須轉(zhuǎn)換我們的漢字編碼。下面是實(shí)現(xiàn)中文本地化的具體實(shí)現(xiàn)方法,稱之為靜態(tài)方法。
首先,在.lXX文件中定義: #define LABEL_TEXT “字符串_中文”
然后將這個(gè).lXX文件用WORD或記事本轉(zhuǎn)換成UTF8編碼。這里要注意,有時(shí)在轉(zhuǎn)換時(shí),會(huì)在轉(zhuǎn)換生成后的文件頭部添加上一個(gè)文本編輯器無法看到的標(biāo)志字符,需要用edit編輯器將其打開,刪除標(biāo)志字符,否則編譯將會(huì)出錯(cuò)。在.loc文件中包含.lXX文件:#include ".lXX"。在.RSS文件中定義字符串:RESOURCE TBUF r_label_text{buf=LABEL_TEXT;}
同時(shí)在.RSS文件頭添加一行代碼:CHARACTER_SET UTF8。在.cpp文件中,包含.rsg頭文件,通過引用R_LABEL_TEXT就可以顯示它所標(biāo)識(shí)的"字符串_中文"字符串。
四、 Symbian OS在我國的發(fā)展前景
隨著Symbian OS對(duì)本地化的進(jìn)一步支持,基于Symbain OS的我國國產(chǎn)智能手機(jī)軟件必將有所大力普及。作為一種面向未來無線通信的操作系統(tǒng),一方面由于它所具有的強(qiáng)大功能,另一方面有世界各大移動(dòng)設(shè)備商(包括其股東)的支持,還有像Intel、TI、IBM等各大公司都陸續(xù)宣布和Symbian公司合作開發(fā)無線通信設(shè)備軟件應(yīng)用程序,Symbian OS在我國國內(nèi)將具有良好的發(fā)展前景。