Platform: S60 3RD.
LANG SC
LANG 01 31
因为程序支持两种语言,所以应该有两个本地化资源文件,在这里假定分别为:LangFile_01.rls及LangFile_31.rls。其中,LangFile_01.rls包含了所有英文字符串,LangFile_31.rls包含了用到的所有中文字符串。
然后,在rss文件中添加如下语句:
#ifdef LANGUAGE_01 #include “LangFile_01.rls” #endif #ifdef LANGUAGE_31 #include “LangFile_31.rls” #endif
多语种编译机制:LANG语句支持几种语言,资源编译器就会编译出几种本地化资源,方式就是重复编译.rss文件。第一次编译过程中,语句:#ifdef LANGUAGE_01生效,rss文件将LangFile_01.rls文件包含进来,随后生成英文资源文件.r01;第二次编译过程中,语句:#ifdef LANGUAGE_01生效,rss文件将LangFile_31.rls文件包含进来,随后生成英文资源文件.r31。
必须重载这个函数,因为在应用程序初始化过程中,Framework会先于CreateDocumentL()函数来调用ResourceFileName(),目的是返回应用程序资源文件的名字。如果不在程序中重载这个函数,那么Framework自动调用 ResourceFileName()函数,结果将默认的资源文件加载到控制环境中,这样我们就不能在运行时对这个资源文件进行切换了,因为此时的资源文件已经完全交由系统管理,开发人员已经不能干预。如果程序支持多语种,ResourceFileName()函数便会借助BaflUtils::NearestLanguageFile()将适合当前设备语言的本地化资源文件加载到控制环境中,这样也会导致同样的问题。总之,不重载ResourceFileName()函数,系统就会自动加载并管理资源文件。
(重载函数的定义参照第9部分函数定义)
必须将EnonStandardResourceFile传给BaseConstructL()函数,否则application会自动调用ReadAppInfoResourceL()函数,试图将standard resource导入到application。但是,我们已经重载了ResourceFileName()函数,此时的资源名称是个空字符串,所以实际上程序没有加上任何资源,一旦执行就会导致panic。
同时,因为在第三版App支持缩放机制,所以必须将EAknEnableSkin也传递给BaseConstructL()函数。
BaseConstructL( ENonStandardResourceFile|EAknEnableSkin );
如果当前语言设置为英文,则调用:
_LIT(KReourse01,"//resource//apps//filename.r01"); iRscOffset = AddResourceFileL(KReourse01);
如果当前语言设置为中文则调用:
_LIT(KReourse31,"//resource//apps// filename.r31"); iRscOffset = AddResourceFileL(KReourse31);
状态面板由signal、title、context、navigation、battery、indicator留部分组成,分布如下图:
其中,只有Title、Context、Indicator及Navigation四个子面板可以由程序控制,Signal及Battery面板则不能由程序控制,只能随整个status panel显示或隐藏。但是因为已经将EnonStandardResourceFile传给BaseConstructL()函数,所以framework不会自动加载signal及battery两个面板,必须由程序显式调用,这里调用以下的函数:
DisplayPane();//负责显示状态面板,具体定义参考后面的函数定义部分
例如,用户从英文切换到中文设置时,调用:
DeleteResourceFile(iRscOffset);// iRscOffset指示了前一个资源的offset值 iRscOffset = AddResourceFileL(KReourse31); //iRscOffset总是记录当前资源offset值。
另外,在程序的析构函数中,应该调用:
if(iRscOffset) DeleteResourceFile(iRscOffset);
void CProjectAppUi::ConstructL() { BaseConstructL( ENonStandardResourceFile|CAknAppUi::EAknEnableSkin ); DisplayPane(); //load the resourse file if(iLanguage == EChinese) { iPreLanguage = 0; iRscOffset = AddResourceFileL(KReourse31); } else if(iLanguage == EEnglish) { iPreLanguage = 1; iRscOffset = AddResourceFileL(KReourse01); } 其他部分,正常添加 }
TFileName CSmsInfoApplication::ResourceFileName() const { return TFileName(); }
void CProjectAppUi::DisplayPane() { //Gets a pointer to the status pane CEikStatusPane* statusPane = StatusPane(); statusPane->MakeVisible(ETrue); }
TInt CProjectAppUi::AddResourceFileL(const TDesC &aRscFileName) { TFileName dname; dname = CEikonEnv::Static()->EikAppUi()->Application()->AppFullName(); TParse parse; parse.Set(dname, NULL, NULL); TFileName rscName(parse.Drive()); //rscName.Append(_L("//resource//apps//XXX.rsc")) rscName.Append(aRscFileName); return CEikonEnv::Static()->AddResourceFileL(rscName); }
void CProjectAppUi::DeleteResourceFile(TInt &aRscOffset) { CEikonEnv::Static()->DeleteResourceFile(aRscOffset); aRscOffset = 0; }