对于支持多语言版本的程序来说,可能需要根据操作系统的语言版本来加载不同的dll或rc,以实现多国语的目的。
至于如何加载dll或rc,请参考下面链接
http://blog.csdn.net/xiaofeizai1116/article/details/52317583
言归正传,系统提供了获取多个获取语言的API函数:
- GetSystemDefaultLangID
- GetUserDefaultLangID
- GetSystemDefaultUILanguage
- GetUserDefaultUILanguage
几个API的区别:
GetSystemDefaultLangID :该函数获取的语言是控制面板 > 区域与语言选项 > 高级tab页中设置的支持的非Unicode语言
GetUserDefaultLangID: 该函数获取的语言是控制面板 > 区域与语言选项 > 区域选项tab页中设置的标准和格式语言
GetSystemDefaultUILanguage: 该函数获取原始系统安装的语言
GetUserDefaultUILanguage: 暂未知,应该和GetSystemDefaultUILanguage差不太多
几个API的共同点:
返回值类型LANGID: 各语言对应的ID
各语言对应的ID详情,请参考下面链接
https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).aspx
如果用GetSystemDefaultUILanguage、GetUserDefaultUILanguage,则如果用户变更系统语言,软件显示的语言不会跟着变更
如果用GetSystemDefaultLangID ,则不支持Unicode语言
故最好的是用GetUserDefaultLangID
LANGID COMGetUserDefaultLangID()
{
LANGID lLangId;
BYTE byteHigh = 0x00;
LANGID lUserLangID = GetUserDefaultLangID();
// LOBYTE()是取得16进制数最低(最右边)那个字节的内容
switch (LOBYTE(lUserLangID)) {
case 0x11:
lLangId = 0x0411;
break;
case 0x04:
// HIBYTE()是取得16进制数最高(最左边)那个字节的内容
byteHigh = HIBYTE(lUserLangID);
switch (byteHigh) {
case 0x08:
lLangId = 0x0804;
break;
case 0x04:
default:
lLangId = 0x0404;
break;
}
break;
case 0x12:
lLangId = 0x0412;
break;
}
return (lLangId);
}