我们最终本地化我们的应用程序并需要为字符串表创建附属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一个?
答案 0 :(得分:3)
您可以拥有多个.rc文件。来自MS的唯一一个似乎不允许的构建环境是WDK(Windows驱动程序工具包),但您可以使用#include
语句解决它。
实际上,您组合或分离语言的方式完全取决于您。资源有一个语言标识符(您以LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
的形式提供该标识符,但可能必须包含winnt.rh
,winres.h
或afxres.h
的符号名称语言),因此可以在一个DLL中携带多种语言。您还可以在.exe中定义一组核心语言,并将其他语言分别分成一个.dll文件。
但是,过去在选择语言方面存在问题(如果用户没有明确说明),这就是MS在Vista中引入MUI支持的原因。
在我的部署中,到目前为止最好的选择始终是每个DLL一种语言和.exe中的一种“核心语言”。
我也更喜欢每种语言使用单独的.rc文件,但毫无疑问,使用#ifdef
可以实现相同的...
注意:没有看到你的链接更新,现在略过它们......
您的第一个链接“创建仅限资源的DLL”,提示我添加另一个小事实。由于这样的DLL没有入口点而没有代码,因此可以在x64进程中使用为x86编译的DLL。带LoadLibraryEx
的{{1}}也允许使用包含代码的文件。
好的,进入.rc文件的是什么?通常.rc文件看起来像这样:
LOAD_LIBRARY_AS_DATAFILE
那么,答案取决于哪里。如果你没有需要翻译的菜单和对话框,你可以简单地将特定于语言的字符串表放在每个.rc文件中并从中构建.dll(如果你使用// ...
#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
就可以了) 。但是,如果你有其他项目而不是需要翻译的裸字符串,你也必须包括那些(通常对话框和菜单是更常见的)。在这种情况下,您可以调整每种语言的控件大小和位置。但要注意,维护成本可能相当高。可以有更好的解决方案,例如,wxWidgets使用所谓的bag-sizer来容纳长字符串。