目前很多软件都要出口到多个国家,因此为软件提供多国语言支持就成为了一个基本条件。为软件提供多国语言的支持的具体实现方法有很多,但基本原理都差不多,就是实现代码和语言包的独立,代码根据设定的语言选择语言包。
1、新建工程
新建一个MFC应用程序,单文档类型,点击“完成”。工程名称为MultiLanguages,默认语言选择为“中文”。
2、新建项目
右键点击 解决方案,添加->新建项目->MFC DLL,项目名称为MultiLanguagesEN,其他为默认。
3、插入副本
在资源视图中,右键点击 插入副本->选择 英语,使用同样的方法,为其他资源添加英文副本,并将资源视图中英文界面中的所有文本翻译成英文。
4、添加外文版
资源视图->Menu->IDR_MAINFRAME 中的 帮助 菜单下添加 英文版选项,并添加事件处理程序OnEnglish()
添加的代码如下:
void CMainFrame::OnEnglish()
{
// TODO: 在此添加命令处理程序代码
int iRet;
if(TRUE == theApp.GetLang())
{
iRet = MessageBox(_T("确定切换到英文版本?"),_T("提示"),MB_OKCANCEL|MB_ICONINFORMATION);
}
else
{
return;
}
if(TRUE == IDCANCEL)
{
return;
}
theApp.SetLang(False);
theApp.g_bRestart = TRUE;
SendMessage(WM_CLOSE);
}
5、添加SetLang(),GetLang()
在MultiLanguages.cpp中添加函数SetLang(),GetLang()
添加的代码如下:
void CMulitiLanguagesApp::SetLang(BOOL bEnglish)
{
CString strPath;
AfxGetModuleFileName(AfxGetInstanceHandle(),strPath);
int iPathLen = strPath.ReverseFind(_T('\\'));
strPath = strPath.Left(iPathLen);
CString strTemp;
strTemp.Format(_T("%d"), bEnglish);
WritePrivateProfileString(_T("English"),_T("bEnglish"), strTemp, strPath + _T("\\set.lang"));
}
BOOL CMulitiLanguagesApp::GetLang(void)
{
CString strPath;
AfxGetModuleFileName(AfxGetInstanceHandle(),strPath);
int iPathLen = strPath.ReverseFind(_T('\\'));
strPath = strPath.Left(iPathLen);
BOOL bEnglish = GetPrivateProfileInt(_T("English"),_T("bEnglish"), 0, strPath + _T("\\set.lang"));
return bEnglish;
}
6、添加中文版
资源视图->Menu->IDR_MAINFRAME[英语] 中的 帮助 菜单下添加 Chinese Version 选项,并添加事件处理程序OnChinese() 。添加的代码如下:
void CMainFrame::OnChinese()
{
int iRet;
if(FALSE == theApp.GetLang())
{
iRet = MessageBoxEx(AfxGetApp()->GetMainWnd()->GetSafeHwnd(),_T("Really change to Chinese version?"),_T("Information"),MB_OKCANCEL | MB_ICONINFORMATION ,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
}
else
{
return;
}
if(iRet == IDCANCEL)
{
return;
}
theApp.SetLang(TRUE);
theApp.g_bRestart = TRUE;
SendMessage(WM_CLOSE);
}
7、在MulitiLanguages.cpp的InitStance()函数中添加如下代码
if(FALSE == GetLang())
{
m_hLangDLL = ::LoadLibrary(_T("MulitiLanguagesEN.dll"));
if( !m_hLangDLL )
{
AfxMessageBox(_T("Unable to load resourse MulitiLanguagesEN.dll!"));
return FALSE;
}
AfxSetResourceHandle(m_hLangDLL);
}
8、切换中英文时重启界面
在MulitiLanguages.cpp的ExitInstance()函数中添加如下代码:
int CMulitiLanguagesApp::ExitInstance()
{
AfxOleTerm(FALSE);
if(m_hLangDLL)
{
FreeLibrary(m_hLangDLL);
}
if(g_bRestart)
{
CString strFileName = _T("");
GetModuleFileName(NULL, strFileName.GetBuffer(MAX_PATH),MAX_PATH);
ShellExecute(NULL,_T(""),strFileName,NULL,NULL,SW_SHOWNORMAL);
strFileName.ReleaseBuffer();
}
g_bRestart = FALSE;
return CWinAppEx::ExitInstance();
9、最终的中英文界面
注意:
1、需要在Chinese Version选项属性界面修改ID号数字,不修改则会和 英文版 选项的 ID号重复
2、需要在ONCOMMAND(ID_English,&CMainFrame::On English)下手动添加ONCOMMAND(ID_Chinese,&CMainFrame::On Chinese)