S60 3rd Edition的模拟器都支持英文和中文。模拟器语言切换的方法是在[程序]的安装菜单中,有语言切换的功能。
切换模拟器语言是必须要做的事情。在开发过程中遇到了两种情况,下面分别说明:
一、界面上的资源显示中文,例如菜单项,左右软键等界面资源
方法如下:
1. 我是将定义资源用到的字符串都放到同一个.h文件中。有人说S60的管理是.loc文件,UIQ的管理是.rls文件,是一样的。
比如定义的资源是:#define qtn_menu_open "打开"
2. 用Notepad或者UltraEdit程序打开这个头文件,保存成UTF8编码的文件。
3. 大家知道,资源文件可以创建多个,我用的是.rssi文件(这些文件都需要转换成UTF8),最后都要包含在.rss文件中。这里就需要在.rss文件的第一行加上:
CHARACTER_SET UTF8
上面是最根本的方法,但是开始我一直失败,出现的错误是:"Undefine character ?",后来知道和我的操作系统有关。
我的是英文版的window,切换内码也没用。如果使用的是英文版的Windows,那么它会在文件的头部添加3个前导标示字符,你需要再用UltraEdit[非UTF-8自动辨认模式]来删除他们。
具体操作方法是:
1. 使用UltraEdit工具打开文件,在菜单[高级]——>[配置]——>[文件处理]——>[UTF8检测]——>取消[自动检测UTF8文件]
2. 菜单[文件]——>[转换]——>[ASCII转UTF8]。
3. 保存文件。
二、界面上的控件显示程序中的中文字符串变量,例如Label控件显示字符串。
在S60 3rd Edition中,字符串变量默认都是Unicode编码的,也就是宽字符,如果想在Label控件上显示中文字符串,共有三种方法,假设label控件是对话框的子控件:
1. 和上面的方法相同,在资源文件中定义字符串,对话框通过资源文件创建。
2. 将字符串全部定义在一个头文件中,然后使用工具UltraEdit将文件转换成UTF8编码。
定义字符串的方法:_LIT8(KLabelText, "中文"); 注意,这里使用_LIT8来定义字符串。
使用转码函数,将UTF8字符串转换成Unicode,然后再给Label控件显示。
转码方法如下:
TBuf<255> temp; // 注意,TDes类不能直接创建对象,因为构造函数是Protect的。但是TDes可以传参。
CnvUtfConverter::ConvertToUnicodeFromUtf8 (temp, KLabelText);
3. 将字符串全部定义在一个头文件中,文件默认的编码是GBK。定义字符串时依然采用_LIT8的形式,然后使用时进行GBK
到Unicode的转码。
转码函数如下:
void CUtility::ConvGbk2Uni(TDes16& aTarget, const TDesC8& aSource)
{
CCnvCharacterSetConverter *converter = CCnvCharacterSetConverter::NewLC();
if (converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,
CEikonEnv::Static()->FsSession())
!= CCnvCharacterSetConverter::EAvailable)
{
User::Leave(KErrNotSupported);
}
TInt state = CCnvCharacterSetConverter::KStateDefault;
converter->ConvertToUnicode(aTarget, aSource, state);
CleanupStack::PopAndDestroy();
}