MultiLanguage Conclusion

本文介绍如何实现工程的多语言对应

(一般有中文、英文、日文三种语言)

先介绍下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是我们需要实现多语言的字符串内容(根据自己的需要定义即可)

定义好之后我们将现有的工程编译生成DLL文件

然后建立一个MFCDialog工程,在主Cpp中定义变量 HINSTANCE g_hinst;

OnInitDialog 函数中通过下面的代码把该变量与DLL文件关联起来

g_hinst = LoadLibrary(_T("ReportManagerRc.dll"));//显式调用DLL

然后我们可以定义CString型的变量通过该变量的LoadString即加载不同语言。示例如下:

CString strTabSet;

英文的时候:

strTabSet.LoadString(g_hinst,1100);//1100DLL文件中对应变量的Value

中文的时候:

strTabSet.LoadString(g_hinst,2100);//1100DLL文件中对应变量的Value

以上是从DLL调用对应的资源字符串,下面再说说具体的界面实现多语言的时候需要注意的问题。

一般的控件(如文本框,按钮等 CWind类继承来的)我们可以简单的通过 SetwindowText()函数设置标题,但对于一些控件我们需要特殊的方法为其设置标题。比较特殊的控件有 MenuTab

对于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

3.在主窗体的最上方添加如下三行代码

Imports System.Globalization

Imports System.Threading

Imports System.Runtime.InteropServices

Public Class MainForm

………………………

………………………

End Class

4.然后为每个菜单添加对应的代码

英文:

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中多语言的实现。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...