定制wince平台支持多语言的系统,需在PB的local里添加对应的区域和语言编号。
如果只需在应用程序中实现多种语言和时区的切换,我们通常需要如下信息
定义如下结构体:
(封装每一种语言的属性)
struct
{
int Index; //语言索引号
const TCHAR *name; //语言名称 如:中文简体CHS 中文繁体CHT
const TCHAR *alias; //别名 (一般情况下可忽略)
TCHAR LangName[12]; //UNICODE编码方式标记 如:中文 0x4e2d, 0x6587
UINT CodePage; //代码页 如936,950,437 此标记应用于字符编码转换
int Charset; //用于字体显示,如:GB2312_CHARSET CHINESEBIG5_CHARSET
TCHAR *TimeZoneKey; //时区
} OEM_LANGUAGE[] =
{
//中文简体
{0, 936, GB2312_CHARSET, _T("CHS"), NULL, {0x4e2d, 0x6587, 0},_T("China Standard Time") },
//中文繁体
{1, 950, CHINESEBIG5_CHARSET, _T("CHT"), NULL,{0x4e2d, 0x6587,0x7e41, 0x4f53, 0},_T("Taipei Standard Time")},
........ ,
........,
}
选定某种语言后,保存name,Charset,CodePage信息到注册表,方便所有应用程序调用。
添加字体:
支持多语言的应用程序,需要有对应的字体文件,但字体文件过于庞大时,可以放在NAND FLASH或者外部存储卡上。当程序启动时,添加所有需要的字体文件,调用API函数:
如: AddFontResource(L"Storage Card//simsun.ttc");
创建字体:
根据语言类型和添加的字体信息得到 Charset值和FontFaceName字体名称
如:Charset = GB2312_CHARSET,FontFaceName = L"Simsun";
CreateFont创建简体中文字体
切换语言:
1.得到所有语言种类的个数: num= sizeof(OEM_LANGUAGE) / sizeof(OEM_LANGUAGE[0])
2.根据当前语言name或CodePage信息计算索引号Index,可以在num范围内向前或向后遍历。
3.选定语言后,保存name,Charset,CodePage信息
4.发送广播消息通知所有应用程序包括自己
::PostMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
应用程序收到WM_FONTCHANGE后,创建新的字体
5.设定系统时区(如果需要)
设定系统时区:
struct REGTIMEZONEINFORMATION
{
LONG Bias;
SYSTEMTIME StandardDate;
LONG StandardBias;
SYSTEMTIME DaylightDate;
LONG DaylightBias;
}rTZI;
TIME_ZONE_INFORMATION timezone;
读取注册表HKEY_LOCAL_MACHINE//Time Zones//+OEM_LANGUAGE.TimeZoneKey路径 "TZI"项信息到rTZI中。
timezone.Bias = rTZI.Bias;
timezone.StandardBias = rTZI.StandardBias;
timezone.DaylightBias = rTZI.DaylightBias;
timezone.StandardDate = rTZI.StandardDate;
timezone.DaylightDate = rTZI.DaylightDate;
保存timezone.StandardName值到 注册表项"Std"
保存timezone.DaylightName 值到 注册表项"Dlt"
调用API函数 SetTimeZoneInformation(&timezone);
结束。。