另一篇文章,How to Support MUI (Multi User Interface) for both Vista and XP
http://hi.baidu.com/harbinzju/blog/item/e67c1018514026bc4aedbccd.html
1. 将现有.rc文件中的相应资源的Lauguage改为EN-US.
2. 编写mui.rcconfig并加入到Project中,此文件是XML格式,例如:
<?xml version="1.0" encoding="utf-8"?>
<localization>
<resources>
<win32Resources fileType="System">//msdn说次字段值始终是"Application"?但是这里应该是对的,没有找到出处。
<localizedResources>
<resourceType
typeNameId="#6"
/>
</localizedResources>
</win32Resources>
</resources>
</localization>
上面内容的涵义是将字符串资源做为语种相关的资源, 这种资源将生成在多个资源文件中.参见msdn
http://msdn.microsoft.com/library/dd319100(VS.85).aspx
The following are the standard resource types and their numeric identifiers:(会被本地化的资源类型?)
- CURSOR(1)
- BITMAP(2)
- ICON(3)
- MENU(4)
- DIALOG(5)
- STRING(6)
- FONTDIR(7)
- FONT(8)
- ACCELERATORS(9)
- RCDATA(10)
- MESSAGETABLE(11)
- GROUP_CURSOR(12)
- GROUP_ICON(14)
- VERSION(16)
- HTML(23)
2. 在Project的Properties中的Resources里的command line中的Additional options里加入
/r /fm "$(IntDir)"/HelloPlugin.muires /q mui.rcconfig, 如下所示HelloPlugin换成"%(Filename)"
这步将mui.rcconfig中的localizedResources节里对应的资源生成到一个muires文件中
3. 在Project Properties里的Post-Build Event中的Command Line填加如下内容:
rem **Extra steps to link the MUI files**
if not exist "$(TargetDir)" md "$(OutDir)"
if not exist "$(TargetDir)$(ProjectName)" md "$(TargetDir)$(ProjectName)"
if not exist "$(TargetDir)$(ProjectName)"/EN-US md "$(TargetDir)$(ProjectName)"/EN-US
link.exe /OUT:"$(TargetDir)$(ProjectName)/EN-US/$(TargetName).exe.mui" /DLL /NOENTRY /MACHINE:X86 "$(IntDir)/$(TargetName).muires"
注意,不同的工程文件上面的预定义宏可能要做相应的修改, 下面解释一下具体每句话的用意:
rem **Extra steps to link the MUI files**
注释语句
if not exist "$(TargetDir)" md "$(OutDir)"
如果$(TargetDir)不存在, 则创建它
if not exist "$(TargetDir)$(ProjectName)" md "$(TargetDir)$(ProjectName)"
如果$(TargetDir)$(ProjectName)不存在, 则创建它
if not exist "$(TargetDir)$(ProjectName)"/EN-US md "$(TargetDir)$(ProjectName)"/EN-US
如果"$(TargetDir)$(ProjectName)"/EN-US不存在, 则创建它
link.exe /OUT:"$(TargetDir)$(ProjectName)/EN-US/$(TargetName).exe.mui" /DLL /NOENTRY /MACHINE:X86 "$(IntDir)/$(TargetName).muires"
链接muires到目标文件中
4. rebuild project
B) 制作各语种的Project:
1. 创建一个static library工程,为方便起见, 工程名取为语种的名称
参考MSDN里的ms-help://MS.LHSMSSDK.1033/MS.LHSWinSDK.1033/intl/nls_238z.htm, Locale Identifier Constants and Strings中Locale name, Local name做为这个工程的名称.
比如说要制作法语(法国)的库, 名字起为FR-FR, 要制作日文(日本)的库, 名字起为JA-JP.
2. 新创建一个RC文件, 并将A)工程的相应资源, 以本文为例,就是将所有字符串资源加到RC中,注意资源ID要保持一致, 唯一不同的就是字符串的内容, 别忘记将Launguage选为相应的语言
3. 将A)中的mui.rcconfig加入到本工程中.
4. 在Project的Properties中的Resources里的command line中的Additional options里加入
/r /fm "$(IntDir)"/HelloPlugin.muires /q mui.rcconfig
5. 在Project properties中的Post-Build Event中的Command line里加入
rem **Extra steps to link the MUI files**
if not exist "$(TargetDir)" md "$(OutDir)"
if not exist "$(TargetDir)/HelloPlugin/$(ProjectName)" md "$(TargetDir)/HelloPlugin/$(ProjectName)"
if not exist "$(TargetDir)/HelloPlugin/$(ProjectName)" md "$(TargetDir)/HelloPlugin/$(ProjectName)"
link.exe /OUT:"$(TargetDir)/HelloPlugin/$(ProjectName)/HelloPlugin.exe.mui" /DLL /NOENTRY /MACHINE:X86 "$(IntDir)/$(TargetName).muires"
rem ** Copy Checksum from Language Neutral to MUI file **
echo "$(TargetDir)HelloPlugin.exe"
echo "$(TargetDir)/HelloPlugin/$(ProjectName)/HelloPlugin.exe.mui"
muirct -c "$(TargetDir)HelloPlugin.exe" -e "$(TargetDir)HelloPlugin/$(ProjectName)/HelloPlugin.exe.mui"
注意: 这里比A)中多了muirct项, 此项将会将此语种的mui资源检验和加到到HelloPlugin.exe中. 非常重要,否则取不到相应的资源
最终的Binary结果如下:
|_Debug
|_HelloPlugin.exe
|_EN-US
|_HelloPlugin.exe.mui
|_FR-FR
|_HelloPlugin.exe.mui
参考: http://code.msdn.microsoft.com/MUIIzer, 里面有几个文档详细介绍了制作的每一步, 本文就是参照它来完成的. 并且还可以用MUIIzer工具来自动生成相应的MUI工程, 不过可能需要安装.NET framework 3.5, 我试了一下生成过一次,后来就总是出错,说一个COM对象创建不出来,估计是我没安装.NET framework 3.5的原因.