在win32 API应用程序中实现全球化/多语言功能

时间:2009-10-31 09:23:23

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

瞧,这是我能在Windows下进行多语种开发的最短内容。我相信你可以在网上找到很多关于资源或多语言开发的精心撰写的文章。

答案 1 :(得分:2)

您需要担心几个方面:

  1. 将您的应用程序编译为Unicode
  2. 本地化(翻译)应用程序,使其“说”另一种语言
  3. 使用区域设置感知行为,您必须对其进行排序或格式化日期/时间/数字 正如用户所预期的那样
  4. 对于本地化,最好的当前做法是在代码中不使用字符串,而是将它们存储在仅资源的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.aspxhttp://msdn.microsoft.com/en-us/goglobal/dd565826.aspx

    但当然没有答案就足够了,因为有关于这个主题的完整书籍。 所以,请从MS全球化门户网站(http://msdn.microsoft.com/en-us/goglobal/)开始,特别是“学习”标签,以及o。从那里开始。

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

答案 2 :(得分:1)

对所有字符串使用gettext。

答案 3 :(得分:0)

这个可能是一个大问题,或者是一个小问题,具体取决于你的程序。

要研究的事项:

  1. 字符串和字符编码。将字符串放入资源(或使用gettext)是一个开始,但您可能想要考虑如何在内部存储字符串;例如。如果你没有使用这样的编码,请查看像UTF-16这样的Unicode编码。

  2. 考虑如何处理和存储字符串数据,因为它也很重要:您是否需要排序或进行案例比较? ASCII顺序(例如比较'char'中的简单值)可能不正确。其中一些问题已列出here

  3. 日期和时间输出格式,货币输出格式以及其他依赖于文化的内容。

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