来源:https://www.cnblogs.com/qijicxl/p/3840157.html
如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结。
我们使用vc6.0的版本来试验
1. 切换到资源视图,右键Dialog->Insert Copy
2. ok后,会出来一个语言的选项,这里可以根据需要选择语言
3. 点击ok后,出现一份copy,不过里面是英文的。这时,如果你源对话框中带中文的话在英文界面中就会显示乱码了。需要手动改为英文的。
注意:如果资源中有Neural语言,则不管启动时指定哪种语言,都只会显示Neural资源
①源对话框
② copy的对话框,手动修改成英文的就ok了。
4. 如何让程序显示正确的语言呢?
我这边是通过写到ini文件里面去,比对是哪种语言,然后显示为哪种语言的。
在InitInstance()函数里面添加判断。用到的函数有SetThreadUILanguage和SetThreadLocale,但SetThreadLocale不支持win7及以上版本,所以须做判断,是否为win7及以上版本,再决定用什么函数来设置相应的语言。
CString strValue,strCpyFile,strtemp,strLanguage;
char itemVal[256];
int len;
GetModuleFileName(NULL,strValue.GetBuffer(MAX_PATH),MAX_PATH);
strValue.ReleaseBuffer();
len=strValue.ReverseFind('\\');
strValue=strValue.Left(len);
strtemp=strValue;
strtemp += "\\TestDll\\copyfiles.ini";
// 找到我写入的配置文件,copyfile.ini文件。
::GetPrivateProfileString("TestSequence","Language","",itemVal,256,strtemp);
strtemp = itemVal;
strLanguage = strtemp;
// 这里区分了两种语言,我写入ini文件的是ENGLISH 和 CHINESE
if("ENGLISH" == strLanguage)
{
//SetThreadUILanguage();
if (IsWin7())
{
SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK));
}else
{
SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), SORT_DEFAULT));//若IDE为vc6,貌似此语句无效
}
}else
{
if (IsWin7())
{
SetThreadUILanguage(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK));
}else
{
SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK), SORT_DEFAULT));//若IDE为vc6,貌似此语句无效
}
}
这里贴下IsWin7()函数的判断,其实是判断了win7及以上的版本。
bool IsWin7()
{
OSVERSIONINFOEX osvi;
BOOL bOsVersionInfoEx;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);
// win7的系统版本为NT6.1
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 6 && osvi.dwMinorVersion >= 0)
{
return true;
}
else
{
return false;
}
}
这里又有一个问题,SetThreadUILanguage该函数在vc6.0中不认识,在vs2008中是可以认识这个函数的,(vc6.0差不多是该被替换啦- -!)我们就采取动态获取的方式来操作。
typedef LANGID (WINAPI *FP_SetThreadUILanguage)(LANGID LangId);
LANGID SetThreadUILanguage(LANGID lcid)
{
HMODULE hKernel32 = GetModuleHandle(_T("Kernel32.dll"));
FARPROC pFn = GetProcAddress(hKernel32, "SetThreadUILanguage");
FP_SetThreadUILanguage pSetThreadUILanguage = (FP_SetThreadUILanguage)pFn;
if (pSetThreadUILanguage)
{
return pSetThreadUILanguage(lcid);
}
return 0;
}
5. 在设置切换语言的时候,可以设置一个combobox,点击哪个语言就进行语言切换,设置一个全局变量,然后PostMessage,关闭,在WM_ONCLOSE函数中再做一次打开操作。
大致就是这个过程。大家也可以自己发挥。
附:
在程序中的字符串修改为多语言的方法:
1、在StringTable中添加字符串对应的语言资源:字符串ID=IDS_TEST,Value="测试"
2、在使用的地方引用字符串资源:
CString str;
str.LoadStringW(IDS_STRING145);
AfxMessageBox(str);
3、右键StringTable -> 插入副本 -> 选择对应的国际化语言。
对该StringTable的所有项进行翻译后替代中文。