65.9K
CodeProject 正在变化。 阅读更多。
Home

应用程序的多语言支持

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (27投票s)

2005年5月26日

5分钟阅读

viewsIcon

218568

downloadIcon

4358

一种在10分钟内为应用程序添加多语言支持的简单解决方案。

为什么还要写一篇关于多语言应用程序的文章?

大约一年前,我需要我的应用程序支持多种语言。我以为很容易就能找到实现方法。有很多文章解释了如何做到这一点,但没有一篇符合我的需求。

我在这里能找到什么?

引言

我真正需要的是简单的 .h.cpp 文件,它们能够加载一个语言 DLL 并提取我需要的字符串。我找到的任何文章都没有提供这一点。这时,我决定编写自己的类来完成我想要的任务。我在一些论坛上比较活跃,我看到这个问题一直在出现:如何在一个应用程序中实现多语言。我看到的是,第一次理解它是如何工作的真的很难。所以我决定写一篇小文章,并将我的语言文件添加到CodeProject。

如何使用?

我尝试实现这些文件,让它们非常容易使用。让我们解释一下这个类是如何工作的。

使用字符串表

有些人仍然在代码中硬编码应用程序的字符串。这不是最好的解决方案。所以请使用字符串表,因为这是添加多语言支持所必需的。

将文件添加到项目

首先,您需要将文件 Language.cppLanguage.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

有几个简单的步骤需要执行

  1. 创建项目。

    首先,您需要为您的 DLL 创建一个项目。启动 Visual Studio,然后选择 文件 -> 新建...。然后选择 Win32 动态链接库。给您的项目起一个新名称,然后点击确定。您现在应该看到了一个向导,选择一个导出了一些符号的 DLL。现在已经创建了 DLL 的默认文件。

  2. 从原始项目复制字符串表。

    现在默认文件已创建,关闭当前的(语言 DLL)项目。现在在 IDE 中打开您的真实应用程序并打开字符串表。使用 CTRL + A 选择所有项,然后复制它们。再次关闭项目。

  3. 将字符串表添加到语言项目。

    再次打开您的语言项目。选择 文件 -> 新建... 并选择资源脚本。给资源脚本起一个名字,然后点击确定。现在您可以向您的项目添加资源了。右键单击资源文件并选择插入...,然后选择字符串表。现在将您的应用程序的字符串表复制到语言 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日
    • 首次发布。
© . All rights reserved.