【问题标题】:How do I create language satellite DLLs for a C++ (MSVC 2008) solution?如何为 C++ (MSVC 2008) 解决方案创建语言附属 DLL?
【发布时间】:2011-07-16 17:04:11
【问题描述】:

我们终于本地化了我们的应用程序,需要为字符串表创建附属 DLL(从源代码中取出硬编码字符串的过程长达一个月)。

我一直在查看 MSDN 和其他帮助,但我对实际构建语言 DLL 的机制感到很困惑。

我们在 EXE 本身中有英文资源。据我了解,我们现在需要创建名为 MyAPPXXX.dll 的 DLL 项目。

我不确定我们应该怎么做。是只有一个资源/rc 文件和文件中的不同部分,还是为每种语言复制了 rc 文件并替换了翻译?

我在尝试按照在其他地方看到的有关如何执行此操作的说明时迷失了方向。

每种语言都需要一个 DLL,还是我们有具有多种配置的同一个项目 - 如果是后者,如何完成?

以下是我读过的有关此内容的页面列表 - 但相互矛盾的信息和我的无知让我感到困惑:

http://msdn.microsoft.com/en-us/library/24b2tcy0%28vs.71%29.aspx

http://msdn.microsoft.com/en-us/library/8fkteez0%28vs.71%29.aspx

http://www.codeproject.com/KB/locale/multilingual.aspx

http://www.codeproject.com/KB/cpp/mult_lang_support.aspx

http://www.codeproject.com/KB/locale/MultiLangSupportMFCExtDLL.aspx

http://support.microsoft.com/kb/198846

http://www.codeguru.com/cpp/w-p/dll/mixeddlls/article.php/c12069

http://www.codejock.com/support/articles/mfc/general/g_multilang.asp

http://msdn.microsoft.com/en-us/library/aa645513%28v=vs.71%29.aspx

http://support.microsoft.com/kb/188659

http://msdn.microsoft.com/en-us/library/x6h91d9w.aspx

编辑:

我可以只为不同语言创建一个 rc 文件的不同部分,还是我必须制作 rc 文件的副本 - 每种语言 dll 一个?

【问题讨论】:

  • 使用附属 DLL 自动本地化应用程序是 .NET 的一项功能。您可以模拟它,但您可以调用 LoadLibrary 并将正确的实例句柄传递给 LoadString()。

标签: c++ visual-studio-2008 resources localization


【解决方案1】:

您可以拥有多个 .rc 文件。 MS 中唯一不允许这样做的构建环境是 WDK(Windows 驱动程序工具包),但您可以使用 #include 语句解决它。

实际上,组合或分离语言的方式完全取决于您。资源带有一个语言标识符(您以LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN 的形式提供它,尽管winnt.rhwinres.hafxres.h 可能必须包含在语言的符号名称中),因此可以使用多种语言在一个 DLL 中进行。您还可以在 .exe 中定义一组核心语言,并将其他语言分别放入一个 .dll 文件中。

但是,过去在选择语言的方式上存在问题(如果用户没有明确这样做的话),这就是 MS 在 Vista 中引入MUI 支持的原因。

到目前为止,在我的部署中,最佳选择始终是每个 DLL 使用一种语言并在 .exe 中使用一种“核心语言”。

我也更喜欢每种语言单独的 .rc 文件,但毫无疑问,使用 #ifdef 可以达到同样的效果...

注意:没有看到您的更新链接,现在略过它们......


您的第一个链接“Creating a Resource-Only DLL”提示我添加另一个小事实。由于这样的 DLL 没有入口点,也没有代码,因此可以在 x64 进程中使用为 x86 编译的 DLL。 LoadLibraryExLOAD_LIBRARY_AS_DATAFILE 也将允许它用于包含代码的文件。


好的,.rc 文件中有什么内容?通常 .rc 文件看起来像这样:

// ...
#include "afxres.h"
// ...
LANGUAGE LANG_*, SUBLANG_*

IDR_MAINFRAME MENU
// ... language-specific menu entries

IDD_ABOUTBOX DIALOGEX 0, 0, ...
// ... language specific pre-filled dialogs, control sizes adjusted and all

STRINGTABLE
// ... language-specific *strings*
END

所以,答案取决于哪里。如果您没有需要翻译的菜单和对话框,您只需在每个 .rc 文件中放置一个特定于语言的字符串表并从中构建 .dll 即可(如果您使用 /noentry 就可以了)。但是,如果您有其他需要翻译的项目而不是裸字符串,则您也必须包括这些项目(通常对话框和菜单是更常见的项目)。在这种情况下,您可以调整每种语言的控件大小和位置。但请注意,这方面的维护成本可能相当可观。可以有更好的解决方案,例如 wxWidgets 使用所谓的 bag-sizers 来适应长字符串。

【讨论】:

  • 谢谢 - 但这项工作的机制仍然是一个谜 - 特别是 dll 的 rc 文件中有什么?我们在 exe 中使用英语,我可以按照您的建议为每个 DLL 设置一个语言。我们在 exe 中有多个需要本地化的 rc 文件。
  • @Tim:看看这是否有帮助。否则,我想你将不得不给出更多提示,你被困在哪里。也许有简约的例子。
  • 感谢您对其中内容的最后一次编辑。维护问题是正确的 - 如果对话框被复制了一遍!我想我对语言和子语言位感兴趣。再次,谢谢。一个问题 - 我是否需要为每种语言 dll 制作新的 rc 文件,或者我可以将一个 rc 中的所有字符串划分为它们自己的语言部分吗?
  • @Tim:您可以将它们放在一个 RC 文件中。前面的LANGUAGE 将定义它的去向。但是,如果要分离生成的 DLL,则需要添加 #ifdef 以从每个相应的 DLL 中排除除所需语言之外的所有语言。否则每个 DLL 将包含 所有 语言 :)
猜你喜欢
  • 2017-12-30
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多