本文介绍如何实现工程的多语言对应
(一般有中文、英文、日文三种语言)
先介绍下MFC工程的多语言实现
一般做法是把工程设置成Unicode工程,然后通过调用已经定义的多语言资源DLL来实现多语言。(主要是通过DLL中的String Table 来实现)
首先建立一个DLL类型的工程,打开工程,找到工程中的String Table。
Step 1、 先建立String Table的副本,工程默认只有一个String Table,我们可以通过在String Table上 右键——Insert Copy,在弹出的Insert Resource Copy 对话框中选择我们需要实现对应的语言种类(如下图)
点击OK即可生成一个该语言的String Table。
需要注意的是如果我们选择的语言类型与现有的String Table的语言类型有重复的话系统会提示我们。
Step2、建立好String Table后我们需要在里面定义我们需要使用的多语言文字(如下图)
其中ID是字符串的标识,Value值是我们将要在工程中使用的标识,需要唯一确定(为了保证各个语言定义的标识不重复我们可以使每种语言的标识符相差1000,如英文的标识以1开头即1100,中文的以2开头,即2100,依次类推),Caption是我们需要实现多语言的字符串内容(根据自己的需要定义即可)
然后建立一个MFC的Dialog工程,在主Cpp中定义变量 HINSTANCE g_hinst;
在 OnInitDialog 函数中通过下面的代码把该变量与DLL文件关联起来
g_hinst = LoadLibrary(_T("ReportManagerRc.dll"));//显式调用DLL
然后我们可以定义CString型的变量通过该变量的LoadString即加载不同语言。示例如下:
CString strTabSet;
英文的时候:
strTabSet.LoadString(g_hinst,1100);//1100是DLL文件中对应变量的Value值
中文的时候:
strTabSet.LoadString(g_hinst,2100);//1100是DLL文件中对应变量的Value值
以上是从DLL里调用对应的资源字符串,下面再说说具体的界面实现多语言的时候需要注意的问题。
一般的控件(如文本框,按钮等 从CWind类继承来的)我们可以简单的通过 SetWindowText()函数设置标题,但对于一些控件我们需要特殊的方法为其设置标题。比较特殊的控件有 Menu,Tab
对于Menu我们可以通过ModifyMenu函数来实现其标题文字的多语言,
AfxGetApp()->GetMainWnd()->GetMenu()->ModifyMenu(0,MF_BYPOSITION,strOpt);
AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(0)
->ModifyMenu(ID_LAN_JPN,MF_BYCOMMAND,ID_LAN_JPN,strJpn);
要想看到效果需要调用DrawMenuBar函数来重绘,调用的时候要注意该函数属于CWind类不属于CView类,不能在CView类中调用
Tab页的多语言实现(可参考MSDN)
// 本代码设置两个Tab页的标题,更多情况的时候请参考发挥
TCITEM tcItem0;
tcItem0.mask = TCIF_TEXT;
tcItem0.pszText = (LPTSTR)(LPCTSTR)strTabRun;
m_MainTab.SetItem(0,&tcItem0);
TCITEM tcItem;
tcItem.mask = TCIF_TEXT;
tcItem.pszText =(LPTSTR)(LPCTSTR)strTabSet;
m_MainTab.SetItem(1,&tcItem);
以上是在做项目的时候遇到的MFC多语言对应问题的解决方案,在网上查到一些方法由于时间关系未能一一尝试,应该会有比该方法更简单明了的方法。
最后介绍一下VB.net工程多语言实现需要注意的地方
与MFC工程比VB.net工程的多语言实现更加简单
1.通过菜单实现多语言首先在窗体中增加菜单,可以通过ToolBox中的Menu&ToolBars中的MenuStrip添加,添加后设置好需要的菜单项。
2.在需要实现多语言的窗体的上一层文件夹 右键——Add——NewItem,在其中选择Resources File,命名的时候一定要注意,有特定的命名规则需要遵守。如当前窗体是Form1.则对应的英文资源名为Form1.En.resx (不区分大小写)
中文资源名为Form1.zh-CHS.resx
日文资源名为Form1.Ja.resx
Imports System.Globalization
Imports System.Threading
Imports System.Runtime.InteropServices
Public Class MainForm
………………………
………………………
End Class
英文:
Thread.CurrentThread.CurrentUICulture = New CultureInfo("en",False)
Dim resources As System.Resources.ResourceManager
= New System.Resources.ResourceManager(GetType(MainForm))
Me.Text = resources.GetString("Title_ MainForm")
…………………………
中文:
Thread.CurrentThread.CurrentUICulture = New CultureInfo("zh-CHS",False)
Dim resources As System.Resources.ResourceManager
= New System.Resources.ResourceManager(GetType(MainForm))
Me.Text = resources.GetString("Title_MainForm")
…………………………
日文:
Thread.CurrentThread.CurrentUICulture = New CultureInfo("ja",False)
Dim resources As System.Resources.ResourceManager
= New System.Resources.ResourceManager(GetType(MainForm))
Me.Text = resources.GetString("Title_ MainForm")
…………………………
以上是VB.net中多语言的实现。