VC++中实现多国语言的切换有什么方法40

VC++中实现多国语言的切换有什么方法40,第1张

方法1:

如果要切换,可以把资源都放到dll里,做一个简体的,比如XX0804.dll,繁体的XXX0404.dll,切换的时候用AfxSetResourceHandle选择不同的资源dll即可。实现多语言有很多种办法, 例如陵坦御楼上讲的将资源装入_DLL.你研究_MS_就会发现他也是这么做的.

如何实现多语言版本程序

实现多语言版本程序的一般方法是把要显示的文本以资源形式存在单独的动态链接库(DLL)中。在这些动态链接库里,相同的文本其资源ID也相同。这样,在运行时只要加载相应的 DLL 即可,然后用LoadString API函数获取文本资源,例如:

LPSTR szLang// 此变量表示要使用的语言

char szWindowTitle[256]

wsprintf(szDll, "%s.dll", szLang)

HMODULE hDll = LoadLibrary(szDll)

LoadString(hDll, IDS_WINDOW_TITLE, szWindowTitle, sizof(szWindowTitle))

通常会有多个DLLs文件,如:en.dll,cn.dll,jp.dll,fr.dll,it.dll等等尺岩,每一个语言拥有这样一个DLL支持文件。

如何去创建一个资源的实例Instance(我想问题的关键应该在这儿)

然后用Load。。()去导入

方法2:

还有另外一种方法, 就是采用文本语言包.现在很多软件都是采用这种方式.

由于在不同的语言环境下, 字体环境是不一样的, 也许你在简体中文环境下对话框看起来顺顺当当的,但切换到e文环境下,你会发现惨不忍睹.根据_MSDN的忠告, 对话信冲框等资源的字体采用_MS_SCAN_SERIF, 9pt比较好.

我说说文本语言包的实现.

1.一个语言就是一个文本文件.其中最原始的是英语文本文件, 可以用这样的格式: Englisht.txt

[lang]

Infomation_=_English

&File=

&Edit=

....

而中文语言包文件可以这样写

Chinese.txt [lang] Infomation_=_Chinese

&File=文件(&F) ...

&Edit=编辑(&E)

对于要翻译的文件, 左边是原始文字,右边是翻译后的文字.

2.程序启动时, 根据用户的选择定位到具体的语言包文件.

以后每次需要显示文本时, 就从这个文件中读, 用读取_ini_文件的那个函数:

GetPrivateProfileString获取字串.

当然每次都这么调用, 比较麻烦, 你可以写一个类,将_SetWindowText, MessageBox等_重载一下. 这个类还可以做很多其他事情, 例如根据用户当前的语言设定特定的语言包, 例如可以随时更换语言而不必重启程序等等.当然你也可以不用类.

3.要翻译的时候, 将这个文本文件直接发给翻译者就行了.

这种实现文式的缺点:

1.前期你要写一个简单但实用的类或API来封装一下.

2.对于所有的文本, 采用的都是动态翻译,因此每个对话框都要调用_SetWindowText_重设文本, 增加程序开销.

这种实现方式的优点:

1.分发语言包比较方便 2.翻译者翻译比较方便, 给他一个文本文件就行了.

3.做多国语言包不必重新编译程序. 4.一劳永逸.

方法3:动态加载资源文件

使用资源文件封装不同语言资源信息,包含字符串、图标等等,在应用程序运行时,载入资源就行。

Delphi的多语言是这么用的,但是添加多语言后编译连接速度很慢,有时候10来分钟。

可以把你的Delphi的窗体文件分给翻译来翻译,如果是Delphi7,需要先用Conver.exe来转换为文本格式。

1、Project-New Application 创建你的中文版软件。

2、Project-Language-Add 添加你的语言,比如美国英语(ENU)。或者File-New-Others-Dll Wizard

3、保存后生成多个文件夹。

4、Project-Build All

5、程序目录下生成和工程文件同名的语言文件:MyExe.ENUMyExe.CHN,软件发布需要带这些文件。

6、把软件里面所有字符串定闷档义为资源字符串。

resourcestring

C_AppTitle = '肢悔xx管理系统'

C_Error = '错误'

C_Warning = '警告'

7、在软件中用如下代码切换语言:

const

//定义你的多语言:

ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH

CHINESE = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE

uses

ReInit

...

if LoadNewResourceModule(ENGLISH) <>0 then

begin

ReInitializeForms()

end

更多请参考Delphi帮助,里面写得更清楚。

其实感觉最好还是用INI文件

把所有语言条目提取出来记录,并且将INI翻译成多份(多种语言),程序启动时从INI文件中加载语言。

CSDN上有介绍用TLMPack的,你也可以尝试一下:

1。在Delphi(或BCB)中安装TLMPack标准版,关于如何安装帮助文件中有比较详细的说明了,这里不在累述了。(当然安装标准版的前提是你使用标准的AnsiVCL控件来开发的程序,如果你使用TntUnicode控件来开发程序,那么相对应,必须使用Unicode版的TLMPack)。

2。打开你需要升级成多国语言的工程,在每一个Form(以及QReport,Module等)上放置一个TtlmController控件,这个控件的作用是自动改变其所在Form上所有控件的显示文字,一般情况下只需要将该控件放置在Form上就可以了,不需要作任何设置。

3。Form上的控件现在已经可以自己根据语言设置的变换而自动更新了,那么像MessageBox()这样的函数中显示的文字怎么办呢,答案是使用TtlmController的Translate()函数,这个函数可以自动到当前使用的语言文件中取得文字资源然后作为返回值返回出来历罩正,假设已有一段函数是这样的:

代码:

procedure TForm1.Button1Click(Sender:TObject)

begin

MessageBox(Handle, PChar('Say hello to the user!'), 'Message', MB_ICONINFORMATION)

end

那么你需要将文字的部分使用Translate函数包装起来,包装后就像这样:

代码:

procedure TForm1.Button1Click(Sender:TObject)

begin

MessageBox(Handle, PChar(tlmController1.Translate('SayHello', 'Say hello to the user!')), 'Message', MB_ICONINFORMATION)

end

前面的‘SayHello’是对文字的标识,通过这个标识程序才能从语言文件中找到正确的资源,后面的文字作用是当语言文件中不存在需要寻找的资源(或者语言文件不存在时),该函数默认所返回的内容。

另外,Translate函数还支持同Format()函数一样的参数显示,如这样:

代码:

procedure TForm1.Button1Click(Sender:TObject)

begin

MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION)

end

4。以上的MessageBox()函数是出现在Form中的,并且该Form中已经有TtlmController控件了,所以才可以使用TtlmController的Translate()函数进行文字的转换,那么如果你的工程中有一个直接从TObject继承而来的功能类,它也需要显示Message,或者需要记载Log文字等,这时候该怎么办呢,最简单的方法是让这个功能类去调用某个Form中的TtlmController的Translate()函数,但是这样的缺点是程序可能需要为此做较大的改动,另外语言文件中的文字也将变得混乱不堪。那么这个时候最好的解决方案就是使用TtlmObject类,该类同TtlmController类一样,也有Translate函数可以使用,但是区别是它不会侦测所在Form的所有控件,不会对它们进行自动转换。

以下这个类是个小型的功能类。

代码:

interface

uses

....

type

TFunctionClass = class(TObject)

public

procedure ShowMessage()

end

impenmentation

procedure TFunctionClass.ShowMessage()

begin

ShowMessage(nil, 'Say hello to the user!', 'Message‘, MB_ICONINFORMATION)

end

end.

使用TtlmObject类后,该类被改造为:

代码:

interface

uses

...., TLMObject

type

TFunctionClass = class(TObject)

private

FtlmObject:TtlmObject

public

constructor Create()

destructor Destroy()override

procedure ShowMessage()

end

impenmentation

constructor TFunctionClass.Create()

begin

inherited Create()

FtlmObject:=TtlmObject.Create(self)

end

destructor TFunctionClass.Destroy()

begin

FtlmObject.Free

inherited Destroy()

end

procedure TFunctionClass.ShowMessage()

begin

MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION)

end

end.

这样每当使用该功能类中需要文字显示的函数时,真正使用的文字就是语言文件中记载的内容了。

5。TLMPack是从外部语言文件来加载语言文字的,由于完全手工写一个语言文件是一件比较枯燥的事,所以你可以使用向导控件来由程序,如果你打算自己手工来撰写一个语言文件,那么可以忽略该小节。

所谓的向导控件是指:TtlmIniGenerator和TtlmXmlGenerator这两个控件,它们会在程序运行时,将所有原本需要TtlmController和TtlmObject读取的文字,反向输出到语言文件中,你所要做的就是在程序的主窗体上放置一个TtlmIniGenerator(这里假设你要输出的是Ini格式的语言文件):

现在比较流樱猛行的软件都会有中文版、英文版、繁体版等等多个版本,并可以根据系统的语言自动显示相适应的版本,那么这个功能在 VB 是如何实现得呢的:

1、 首先通过 API 函数GetSystemDefaultLCID 判断系统的语言

Option Explicit

Dim lang As String

Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Private Sub Form_Load()

Dim LocaleID As Long

LocaleID = GetSystemDefaultLCID

Select Case LocaleID

Case &H404

MsgBox "当前系统为:中文繁体", , "语言"

Case &H804

MsgBox "当前系统为:中文简体", , "语言"

lang = "1"

Case &H409

MsgBox "当前系统为:英文", , "语言"

lang = "2"

End Select

End Sub

2、然后程序就可以加载保存在资源文件(这里我们就是使用的这种方法)、注册表、INI 文件、文本文件或其他文件中的各类字符串,以达到达到实现多种语言的目的。

⑴启动 VB6.0,在“外接程序脊碰桥→外接程序管理器”中加载“Visual Basic 6 资源编辑器”

⑵在 VB 资源编辑器窗口中,点击“编辑字符串表格> 标识号 中文(中国)

101 例子

102 中文

103 英文

201 Ensample

202 Chinese

203 English

⑶保存资源文件,写如下代码:(自定义装载字符的函数 LoadString)

Sub LoadString()

Me.Caption = LoadResString(Int(lang &"01"))

Command1(0).Caption = LoadResString(Int(lang &"02"))

Command1(1).Caption = LoadResString(Int(lang &"03"))

End Sub

⑷怎么样一个简单的中英双版本的程序就做出吵好来了,如果把 lang 的值设置为 1,则显示中文,如果把 lang 的值设置为 2,则显示英文。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12373290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存