【发布时间】:2009-10-31 09:23:22
【问题描述】:
我用 Visual C++ 开发了一个窗口应用程序(Win32 API)。我必须在这个应用程序中添加多语言功能。任何人都可以指导我如何完成这项任务。
【问题讨论】:
标签: c++ winapi visual-c++ internationalization
我用 Visual C++ 开发了一个窗口应用程序(Win32 API)。我必须在这个应用程序中添加多语言功能。任何人都可以指导我如何完成这项任务。
【问题讨论】:
标签: c++ winapi visual-c++ internationalization
Windows 上多语言应用程序的基础是“资源”的使用。资源是附加在可执行文件末尾的块,它只包含数据,并且以非常特定的方式格式化,以便 Windows 能够解释这些数据。
在您的资源中,您可以找到对话框、字符串表,还可以找到版本信息(显示在资源管理器中文件的属性对话框中的信息)。您可以通过在 Visual C++ 中打开 exe 或 dll 来查看任何 dll 或 exe 的资源。开发应用程序时,您可以创建资源(文件/新建),将其添加到项目中(与添加文件时相同)并编辑资源(使用资源编辑器,通常是文件视图旁边的选项卡在项目资源管理器中)。
每个资源(对话框、对话框、模板、版本信息、字符串表……)都包含一个您可以更改的语言标识符。您可以使用不同的语言标识符多次创建相同的资源。一旦编译完成,当应用程序被 Windows 加载时,它会尝试打开更接近 Windows UI 语言的资源。
在 Windows SDK 中定义了一组函数以充分利用这些资源:LoadString、LoadCursor、LoadBitmap 以及 resources chapter 中的所有内容。
现在,每次在代码中使用字符串时,将其放入字符串表资源并使用 LoadString 函数检索它。只要您在资源中设置了正确的语言标识符,窗口和对话框通常会以正确的语言加载,而不需要任何特定的函数调用。
瞧,这是我能做的关于 Windows 下多语言开发的最短介绍。我相信你可以在网上找到很多关于Windows下资源或多语言开发的好文章。
【讨论】:
您需要担心几个方面:
对于本地化,当前最佳做法是在代码中不使用字符串,而是将它们存储在纯资源 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 可能不是“好的形式”,但是一个专门的地方,所以你可能会得到更好的答案)。
【讨论】:
对所有字符串使用 gettext。
【讨论】:
这个可能是个大问题,也可能是个小问题,这取决于你的程序做什么。
要调查的事情:
字符串和字符编码。将字符串放入资源(或使用 gettext)是一个开始,但您可能需要考虑如何在内部存储字符串;例如。如果您尚未使用此类编码,请查看 UTF-16 之类的 Unicode 编码。
考虑如何处理和存储字符串数据,这也很重要:您需要排序还是进行大小写比较? ASCII 顺序(例如比较'char' 中的简单值)可能不正确。 here 概述了其中一些问题。
日期和时间输出格式、货币输出格式和其他内容也取决于文化。
最后,您可能需要重新布局 UI 元素,具体取决于您使用的界面技术。不同系统字体的不同语言中的字符串越来越短。在极端情况下,您可能需要考虑从右到左的读者的布局。
【讨论】: