Windows程序多语言场景及其原理
- 因个人项目接触面的问题,目前仅在Windows桌面应用开发中,使用MFC框架结合GDI+中使用过多语言。
- 其本质其实是根据系统语言,拿到对应语言的参数,设置读取不同的配置文件中的字符串。
多语言文件
多语言文件就是一个ini文件(配置文件)。例如:
- 中文简体
语言文件例如是”SimplifiedChinese.ini“,那么其中就是这样的:
IDS_LANGUAGE_TEXT1 = 中文字符串1
IDS_LANGUAGE_TEXT2 = 中文字符串2
IDS_LANGUAGE_TEXT3 = 中文字符串3
- 英文
语言文件为"English.ini":
IDS_LANGUAGE_TEXT1 = English String 1
IDS_LANGUAGE_TEXT2 = English String 2
IDS_LANGUAGE_TEXT3 = English String 3
- 日文
......日本电影看的少,没有学习日语环境,就不赘述了。
使用流程
- 获取当前系统语言
主要使用GetUserDefaultUILanguage()
这个API,用法是这样的:
CString GetSysCurLangLanguage()
{// 系统语言ID与相应字串映射
WORD lcid_tmp = GetUserDefaultUILanguage();
CString tmp(L"SimplifiedChinese");
switch (lcid_tmp)
{
case 0x804:
tmp = L"SimplifiedChinese"; //SimplifiedChinese
break;
case 0x411:
tmp = L"Japanese"; //Japanese
break;
case 0x40C:
tmp = L"French"; //French
break;
case 0x407:
tmp = L"German"; //"German" ;
break;
case 0x410:
tmp = L"Italian"; //"Italian" ;
break;
case 0x419:
tmp = L"Russian"; //Russian
break;
case 0xC0A:
tmp = L"Spanish"; //Spanish
break;
case 0x409:
tmp = L"English"; //English
break;
case 0x7C04:
tmp = L"TraditionalChinese"; //Traditional Chinese
break;
default:
tmp = L"English"; //English
break;
}
return tmp;
}
- 查找相应的语言文件
根据上一步的tmp
找到相应的语言文件tmp + _T(".ini")
void GetLangFileName()
{//获取当前系统的语言对应的配置文件
CString strLangFileName;
strLangFileName = GetSysCurLangLanguage();
g_strLangPath = _T("Language\\") + strLangFileName + _T(".ini");
g_bInitialized = TRUE;
}
- 加载文件
找到了文件那么就简单了,只需要从文件种将想要的字符串用GetPrivateProfileString
引入就可以了
CString ExGetResString(CString strSection, CString strID)
{
if (g_bInitialized == FALSE)
{ // 如果没有初始化语言,那么先获取系统语言
GetLangFileName();
}
CString strFileName = GetCurrentPath() + g_strLangPath;
if (_waccess_s(strFileName, 0) == -1)
{ // 判断文件是否可以读写
return _T("");
}
//判断语言文件是否从在,如果不存在使用默认英语,如果英语配置文件还是不从在,再显示Unknow
if (PathFileExists(strFileName) == FALSE)
{
CString strLangFileName = _T("English");
g_strLangPath = _T("Language\\") + strLangFileName + _T(".ini");
strFileName = GetCurrentPath() + g_strLangPath;
}
CString szValue;
DWORD dwSize = 1000;
GetPrivateProfileString(strSection, strID, _T("Unknown"), szValue.GetBuffer(dwSize), dwSize, strFileName);
szValue.ReleaseBuffer();
szValue.Replace(_T("\\n"), _T("\n")); //替换回换行符号
szValue.Replace(_T("\\t"), _T("\t"));
return szValue;
}
只需将待要引入的字符串所在的单元和ID填充给ExGetResString
即可,参考GetPrivateProfileString
函数。
网友评论