应用程序的多语言支持






4.33/5 (27投票s)
2005年5月26日
5分钟阅读

218568

4358
一种在10分钟内为应用程序添加多语言支持的简单解决方案。
为什么还要写一篇关于多语言应用程序的文章?
大约一年前,我需要我的应用程序支持多种语言。我以为很容易就能找到实现方法。有很多文章解释了如何做到这一点,但没有一篇符合我的需求。
我在这里能找到什么?
引言
我真正需要的是简单的 .h 和 .cpp 文件,它们能够加载一个语言 DLL 并提取我需要的字符串。我找到的任何文章都没有提供这一点。这时,我决定编写自己的类来完成我想要的任务。我在一些论坛上比较活跃,我看到这个问题一直在出现:如何在一个应用程序中实现多语言。我看到的是,第一次理解它是如何工作的真的很难。所以我决定写一篇小文章,并将我的语言文件添加到CodeProject。
如何使用?
我尝试实现这些文件,让它们非常容易使用。让我们解释一下这个类是如何工作的。
使用字符串表
有些人仍然在代码中硬编码应用程序的字符串。这不是最好的解决方案。所以请使用字符串表,因为这是添加多语言支持所必需的。
将文件添加到项目
首先,您需要将文件 Language.cpp 和 Language.h 添加到您的项目中。现在,您几乎已经准备好为您的应用程序添加多语言支持了。我开发的类是一个所谓的单例类。这意味着您不必每次都创建类。您只需要在启动时加载和释放语言,然后在任何地方都可以使用该类。
如何加载语言
现在,您已经准备好加载您的第一种语言。通常,您会在应用程序启动时加载语言。下面是一些示例代码,它将尝试加载系统的默认语言
BOOL CMyApp::InitInstance() { .. some default code here // Init language object CLanguage * pLanguage = CLanguage::Instance(); // If you want, you can init the location of the dll's and the default language pLanguage->Init("lng", "dutch"); // Load system default language if (!pLanguage->LoadLanguage(GetSystemDefaultLangID())) { // Show error AfxMessageBox("Unable to load system language, " "default language is used"); } // Load dialog CMyDialog dlg; dlg.DoModal(); // Release language pLanguage->ReleaseLanguage(); .. rest of code }
加载语言很简单,不是吗?请记住,Init
函数并非真正必需。如果您不调用此函数,将使用默认的“lng”和“english”。但这还不是全部,您还必须加载字符串。
如何加载字符串
您已经加载了一种语言,但您还想加载字符串。例如,您有一个带有漂亮静态控件的对话框。以下是如何加载语言
BOOL CMyDialog::OnInitDialog() { // Call original function CDialog::OnInitDialog(); // Init language object CLanguage * pLanguage = CLanguage::Instance(); // Set text for static control m_lblMyStatic.SetWindowText(pLanguage->GetString(IDS_MYSTATICTEXT).c_str()); .. rest of code }
语言对象会检查用户是否加载了有效的 DLL。如果是,字符串将从 DLL 加载,如果不是,将使用默认的字符串表。仍然很简单,不是吗?这就是您在应用程序中所需要做的。
如何创建语言 DLL
有几个简单的步骤需要执行
- 创建项目。
首先,您需要为您的 DLL 创建一个项目。启动 Visual Studio,然后选择 文件 -> 新建...。然后选择 Win32 动态链接库。给您的项目起一个新名称,然后点击确定。您现在应该看到了一个向导,选择一个导出了一些符号的 DLL。现在已经创建了 DLL 的默认文件。
- 从原始项目复制字符串表。
现在默认文件已创建,关闭当前的(语言 DLL)项目。现在在 IDE 中打开您的真实应用程序并打开字符串表。使用 CTRL + A 选择所有项,然后复制它们。再次关闭项目。
- 将字符串表添加到语言项目。
再次打开您的语言项目。选择 文件 -> 新建... 并选择资源脚本。给资源脚本起一个名字,然后点击确定。现在您可以向您的项目添加资源了。右键单击资源文件并选择插入...,然后选择字符串表。现在将您的应用程序的字符串表复制到语言 DLL(只需使用 CTRL + V)。正如您所看到的,所有值现在都在语言 DLL 中。您现在可以开始翻译所有句子了。准备好后,您可以编译项目。DLL 现在可以使用了!
语言
language
类自动支持许多语言。当然,您可以在 Language.cpp 中自己编辑这些设置(请参阅 InitLanguages
函数)。下面列出了支持的语言列表以及预期的 DLL 名称
语言 DLL | ID | 代码 | 语言描述 |
---|---|---|---|
arabic.dll | 未知 | - | - |
chinese_simplified.dll | 未知 | - | - |
czech.dll | 0x0405 | CSY | Czech |
danish.dll | 0x0406 | DAN | Danish |
dutch.dll | 0x0413 0x0813 |
NLD NLB |
荷兰语(标准) 比利时(佛兰德语) |
finnish.dll | 0x040b | FIN | Finnish |
french.dll | 0x040c 0x080c 0x0c0c 0x100c |
FRA FRB FRC FRS |
法语(标准) 比利时 加拿大 瑞士 |
german.dll | 0x0407 0x0807 0x0c07 |
DEU DES DEA |
德语(标准) 瑞士 奥地利 |
greek.dll | 0x0408 | ELL | Greek |
hungarian.dll | 0x040e | HUN | Hungarian |
icelandic.dll | 0x040f | ISL | 冰岛语 |
italian.dll | 0x0410 0x0810 |
ITA ITS |
意大利语(标准) 瑞士 |
lithuanion.dll | 未知 | - | - |
norwegian.dll | 0x0414 0x0814 |
NOR NON |
挪威语(书面语) 挪威语(尼诺斯克语) |
polish.dll | 0x0415 | PLK | 波兰语 |
portugues_br.dll | 0x0416 | PTB | 葡萄牙语(巴西) |
russian.dll | 0x0419 | RUS | 俄语 |
slovak.dll | 0x041b | SKY | 斯洛伐克语 |
spanish.dll | 0x040a 0x080a 0x0c0a |
ESP ESM ESN |
西班牙语(标准/传统) 墨西哥 西班牙语(现代) |
swedish.dll | 0x041D | SVE | 瑞典语 |
turkish.dll | 0x041f | TRK | 土耳其语 |
历史
- 2005年6月3日
- 更新了源代码,常量可以在运行时更改;
- 更新了源代码,您不必再链接到库了;
- 移除了MFC版本,Win32版本可以在MFC应用程序中使用;
- 2005年6月1日
- 添加了示例应用程序;
- 添加了MFC和非MFC版本;
- 修复了包含多个文件时出现的错误;
- 2005年5月26日
- 首次发布。