开发多语言软件的问题?

bJiao 2002-08-27 02:07:24
我希望自己的软件可以显示为简体中文、繁体中文、英文三个版本,初步设想在程序开始运行时让用户选择语言,但不知在选择过后程序内部怎样才能实现三个版本语言的转换呢?
请高手帮帮忙!
...全文
27 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsclub 2002-08-27
  • 打赏
  • 举报
回复
基本语种和非基本语种 DLL
最灵活的本地化技术是,以潜在的最大市场的国家/地区的语言作为文本字符串和错误信息的缺省语言,并用它编译控件部件。将其它国家/地区语言的文本字符串和错误信息放到非基本语种 ActiveX DLL 中,每个国家/地区对应于一个非基本语种 ActiveX DLL。

这一设计使部件对于需要开发多语种版本程序的开发者特别具有吸引力,因为他们可以在一台开发机器上处理多种区域。

非基本语种 DLL 对于多语种国家/地区的用户也具有吸引力。这样的用户可能要求程序员为不同的语种编译程序;如果两个这样的程序都使用了您的控件部件,非基本语种 DLL 允许它们共存在同一个用户的计算机上。

重点 如果所需的非基本语种 DLL 未找到,控件不应该产生错误,因为这将引起整个应用程序的失败。在非基本语种 DLL 不可用的事件中,应该简单地使用控件部件被创建时的缺省区域。

命名非基本语种 DLLs
如果非基本语种 DLLs 使用尾部开放(open-ended)命名约定,以后就可以提供其它的 DLL 而不用重新编译程序。这种命名约定的一个例子是在 DLL 的名称中包含 LocaleID。使用这种约定,用于 Belgian、French、German 和 US English 国家/地区的非基本语种 DLL 可以分别命名为 MyControls20C.dll、MyControls407.dll 和 MyControls409.dll。

如果使用 Windows API 调用从非基本语种 DLLs 中加载和提取资源,把 LocaleID 转成字符串,并把它附加到基本名称后面,即可得到 DDL 的名称。(注意前面的例子使用了 LocaleID 的十六进制表示。)

除了使用 API 调用,还可将非基本语种的 DLLs 作为 Visual Basic ActiveX DLL 工程创建。要做到这一点,可以创建带有获取资源方法的类模块。类的名字可以类似于“Localizer”。在每个 DLL 工程添加此类模块。

将尾部开放命名约定用于 Project Name,使在 Windows 注册表中的每个 DLL 具有唯一的程序 ID,或 ProgID。每次编译新的非基本语种 DLL,将创建新的 Localizer 类,它的完整程序 ID 包含此 DLL 的 Project Name。

然后,在 ActiveX 控件工程中可以使用如下代码来创建适当 Localizer 类的实例:

Dim strProgID As String
Dim objLoc As Object
'为适当的非基本语种 DLL 生成 Localizer
'对象的 ProgID。
strProgID = "MyControls" & Hex$(AmbientProperties.LocaleID) _
& ".Localizer"
Set objLoc = CreateObject(strProgID)
If objLoc Is Nothing Then
'未找到非基本语种 DLL;使用缺省区域。
Else
'调用 Localizer 对象的方法来
'获取本地化的字符串和位图资源。
End If

以上代码使用了后期约束(即,变量 objLoc 被声明为 As Object)。通过 Visual Basic 的 Implements 功能,使用前期约束可以获得更好的性能。可以不生成 Localizer 类的资源提取方法成员,而是在名为 IResources 的抽象类中定义它们。

在 Localizer 类中,使用 Implements 语句将 IResources 作为第二接口实现。可以通过前期约束来调用此接口的方法,如下所示:

'IResources 接口的前期约束的变量。
Dim ires As IResources
'得到 Localizer 对象的 Iresources
' 接口,该对象由非基本语种 DLL 获得。
Set ires = objLoc
'调用 IResources 接口的方法,
'以提取本地化资源。
Set cmdOK.Caption = ires.GetString(ID_CMDOK)

正象对后期约束的 Localizer 对象那样,可以简单地在每个非基本语种 DLL 工程中添加 Localizer 类模块及其第二接口。这种可在几个不同的类中添加相同接口的能力叫做多态性。

MSDN 自己去看看
bJiao 2002-08-27
  • 打赏
  • 举报
回复
能说得详细点吗?
nik_Amis 2002-08-27
  • 打赏
  • 举报
回复
make 3 language pack dll

Then

LoadLibrary()...

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧