【问题标题】:Implementing Globalization / Multilingual feature in win32 API application在 win32 API 应用程序中实现全球化/多语言功能
【发布时间】:2009-10-31 09:23:22
【问题描述】:

我用 Visual C++ 开发了一个窗口应用程序(Win32 API)。我必须在这个应用程序中添加多语言功能。任何人都可以指导我如何完成这项任务。

【问题讨论】:

    标签: c++ winapi visual-c++ internationalization


    【解决方案1】:

    Windows 上多语言应用程序的基础是“资源”的使用。资源是附加在可执行文件末尾的块,它只包含数据,并且以非常特定的方式格式化,以便 Windows 能够解释这些数据。

    在您的资源中,您可以找到对话框、字符串表,还可以找到版本信息(显示在资源管理器中文件的属性对话框中的信息)。您可以通过在 Visual C++ 中打开 exe 或 dll 来查看任何 dll 或 exe 的资源。开发应用程序时,您可以创建资源(文件/新建),将其添加到项目中(与添加文件时相同)并编辑资源(使用资源编辑器,通常是文件视图旁边的选项卡在项目资源管理器中)。

    每个资源(对话框、对话框、模板、版本信息、字符串表……)都包含一个您可以更改的语言标识符。您可以使用不同的语言标识符多次创建相同的资源。一旦编译完成,当应用程序被 Windows 加载时,它会尝试打开更接近 Windows UI 语言的资源。

    在 Windows SDK 中定义了一组函数以充分利用这些资源:LoadString、LoadCursor、LoadBitmap 以及 resources chapter 中的所有内容。

    现在,每次在代码中使用字符串时,将其放入字符串表资源并使用 LoadString 函数检索它。只要您在资源中设置了正确的语言标识符,窗口和对话框通常会以正确的语言加载,而不需要任何特定的函数调用。

    瞧,这是我能做的关于 Windows 下多语言开发的最短介绍。我相信你可以在网上找到很多关于Windows下资源或多语言开发的好文章。

    【讨论】:

    • 感谢您用多语言编写如此详尽的文字
    【解决方案2】:

    您需要担心几个方面:

    1. 将您的应用程序编译为 Unicode
    2. 本地化(翻译)应用程序,使其“说”另一种语言
    3. 使用区域设置感知行为,您必须在其中进行排序或格式化日期/时间/数字 正如用户所期望的那样

    对于本地化,当前最佳做法是在代码中不使用字符串,而是将它们存储在纯资源 DLL(或“卫星 DLL”)中 可能最好从这里开始:http://msdn.microsoft.com/en-us/goglobal/bb978454.aspx,尤其是右边的教程和演示文稿。

    要详细了解本地化工作,您可以查看:http://mihai-nita.net/2007/05/03/how-to-localize-an-rc-file/

    对于区域感知行为,您必须使用特殊的 API,例如 GetNumberFormat 或 GetDateFormat。 你大概可以从这里http://msdn.microsoft.com/en-us/library/dd319078%28VS.85%29.aspx或者这里http://msdn.microsoft.com/en-us/goglobal/dd565826.aspx开始

    当然,这里没有任何答案就足够了,因为有关于该主题的完整书籍。 因此,只需从 MS 全球化门户 (http://msdn.microsoft.com/en-us/goglobal/) 开始,尤其是“学习”选项卡,然后从那里开始。

    当您遇到一些麻烦时(您很可能会遇到),请访问 microsoft.public.win32.programmer.international 新闻组(我知道,让某人离开 stackoverflow 可能不是“好的形式”,但是一个专门的地方,所以你可能会得到更好的答案)。

    【讨论】:

      【解决方案3】:

      对所有字符串使用 gettext。

      【讨论】:

      • OP 说 Windows:Windows 有更多的本地工具来执行此操作,而不是从仅翻译字符串的 Un*x 移植的库......
      • gettext 比 Windows 的 String 资源少得多。就像管理原始翻译发生变化的情况一样。 gettext 将说明这一点,以便所有翻译人员都需要更新他们的翻译,并且翻译人员将获得以前翻译的良好提示。
      【解决方案4】:

      这个可能是个大问题,也可能是个小问题,这取决于你的程序做什么。

      要调查的事情:

      1. 字符串和字符编码。将字符串放入资源(或使用 gettext)是一个开始,但您可能需要考虑如何在内部存储字符串;例如。如果您尚未使用此类编码,请查看 UTF-16 之类的 Unicode 编码。

      2. 考虑如何处理和存储字符串数据,这也很重要:您需要排序还是进行大小写比较? ASCII 顺序(例如比较'char' 中的简单值)可能不正确。 here 概述了其中一些问题。

      3. 日期和时间输出格式、货币输出格式和其他内容也取决于文化。

      4. 最后,您可能需要重新布局 UI 元素,具体取决于您使用的界面技术。不同系统字体的不同语言中的字符串越来越短。在极端情况下,您可能需要考虑从右到左的读者的布局。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        相关资源
        最近更新 更多