与多语言回退机制)
开发工具构建工具【免费下载链接】wix3WiX Toolset v3.x项目地址https://gitcode.com/gh_mirrors/wi/wix3点击查看免费下载导读本文面向使用 WiX Toolset v3.x当前仓库即 WiX Toolset v3.x 源码仓库构建多语言 Windows Installer 安装包的开发者系统讲解如何在命令行light.exe与 Visual Studio 项目属性Cultures to build中精确指定要构建的区域性culture并利用区域性组实现多.wxl本地化文件之间的回退fallback查找。读完本文你将掌握单一区域性构建、中性invariant区域性构建、区域性组回退配置以及这些行为在 light.cs、WixAssignCulture.cs 与 wix.targets 中的底层实现原理。什么是构建区域性Culture在 WiX 中本地化字符串通过.wxlWiX Localization文件提供。一个.wxl文件的根元素WixLocalization通过Culture属性声明其所属区域性例如WixLocalization Cultureen-us xmlnshttp://schemas.microsoft.com/wix/2006/localization仓库测试数据中可找到大量此类示例例如 test/data/Tools/Light/Localization/LocalizationTests/ValidIdentifier/en-US.wxl 中的Cultureen-us CodepageWindows-1255以及 test/data/Tools/Light/Localization/LocalizationTests/he-il/he-il.wxl 中的Culturehe-il。从源码看区域性的匹配是大小写不敏感的Localization.cs 在解析Culture属性时会统一转为小写存储this.culture String.IsNullOrEmpty(culture) ? String.Empty : culture.ToLower(CultureInfo.InvariantCulture);见 Localization.cs。因此en-US、en-us、EN-US在构建时会被视为同一个区域性。构建区域性决定了两件事light.exe链接器从哪些.wxl文件与 WiX 扩展库如 WixUIExtension中取本地化变量MSBuild 构建系统把输出 MSI 放到哪个子目录区域性名作为输出子文件夹。命令行方式light.exe的-cultures开关基本用法构建单一区域性在命令行上用-cultures开关告诉light.exe构建指定区域性的安装包light.exe myinstaller.wixobj -cultures:en-us -ext WixUIExtension -out myinstaller-en-us.msi该命令让light使用 WixUIExtension 中内嵌的en-us资源构建一个 en-US 安装包。也就是说即使你没有提供任何.wxl文件只要所引用的扩展如 WixUIExtension带有对应区域性的本地化库就能完成本地化构建。与-loc一起使用指定本地化文件指定区域性时仍然可以同时提供本地化文件light.exe myinstaller.wixobj -cultures:en-us -loc mystrings_en-US.wxl -loc mystrings_fr-FR.wxl -out myinstaller-en-us.msi此时light使用指定的mystrings_en-US.wxl中的 en-US 资源构建 en-US 安装包。注意一旦指定了-cultures所有通过-loc传入但与目标区域性不匹配的.wxl文件都会被忽略——本例中mystrings_fr-FR.wxl会被跳过不会报错也不会被采用。这一过滤逻辑在 light.cs 中有清晰实现当cultures非空时链接器按cultures数组的顺序遍历对每个区域性在已加载的本地化列表中做大小写不敏感的匹配culture.Equals(localization.Culture, StringComparison.OrdinalIgnoreCase)只把匹配的本地化加入Localizer。而不指定-cultures时见 light.cs若存在中性neutral.wxl则只使用中性文件否则才把全部.wxl都纳入。用neutral指定中性固定区域性中性invariant区域性使用关键字neutral指定light.exe myinstaller.wixobj -cultures:neutral -loc mystrings_en-US.wxl -loc mystrings_fr-FR.wxl -loc mystrings.wxl -out myinstaller.msi该命令构建一个中性安装包本地化资源来自中性文件mystrings.wxl注意未声明Culture属性或 Culture 为空的.wxl即被视为中性文件。mystrings_en-US.wxl、mystrings_fr-FR.wxl因为与neutral不匹配会被忽略。从 light.cs 的命令行解析源码可以看到-cultures:后面的字符串按;与,切分其中neutral不区分大小写会被转换为空字符串作为不变区域性的标识符。代码注释特别强调Neutral is different from null. For neutral we still want to do WXL filtering.——即neutral与null语义不同前者仍参与.wxl过滤。另外若传入字面量null则按未指定区域性处理这是为兼容 MSBuild 2.0 不支持空项empty item的批处理场景而设计的。区域性组多文件回退fallback-cultures可以同时接受多个区域性用于指定回退顺序light.exe myinstaller.wixobj -cultures:en-us;en -loc mystrings_en-US.wxl -loc mystrings_en.wxl -ext WixUIExtension -out myinstaller-en-us.msi该命令构建一个 en-US 安装包本地化变量的查找顺序为首先使用 en-US 本地化文件mystrings_en-US.wxl若某变量缺失回退到 en 本地化文件mystrings_en.wxl若仍缺失最后回退到 WixUIExtension 扩展中的资源。这一按数组顺序依次加入 Localizer、后加入者作为回退的机制正是文化回退的核心。在 light.cs 中cultures数组中靠前的区域性先AddLocalization因此优先被命中而扩展库的本地化则通过Library.GetLocalizations按同样的顺序补充见 Library.cs其按cultures数组顺序把匹配的本地化加入 Localizer。此外当未指定任何区域性时若扩展声明了默认区域性wixExtension.DefaultCulturelight 会使用该默认区域性加载扩展本地化见 light.cs。Visual Studio / MSBuild 方式Cultures to build在属性页中配置在 Visual Studio 中开发安装项目时你可能希望临时关闭部分语言的构建以加快编译速度。操作路径为项目Project项目名 属性Properties 选择生成Build选项卡在Cultures to build要生成的区域性字段中输入用分号分隔的区域性列表或区域性组列表。仓库文档 specifying_cultures_to_build.html.md 所配套的界面截图位于 src/chm/files/content/build_a_localized_version_votive_culture_fallback.jpg图中正是 Visual Studio 中 WiX 项目属性页的 Build 选项卡从截图可以看到该字段左侧是Build选项卡右侧解决方案资源管理器中同时存在Package1.wxs与多个本地化文件setupStrings_en-gb.wxl、setupStrings_en-us.wxl字段值en-GB,en;en-US,en即两个区域性组、共享 en 回退的典型配置。没有对应.wxl文件时的行为Cultures to build也可以在目标区域性没有提供.wxl文件时指定要构建的区域性。例如只有 ru-RU 的.wxl文件却想同时构建 en-US 与 ru-RU 两个安装包就填写en-US;ru-RU其行为是ru-RU 安装包的 WiX 本地化变量首先来自提供的 ru-RU.wxl文件然后来自所引用的 WiX 扩展如 WixUIExtensionen-US 安装包的本地化变量则只能来自所引用的扩展因为没有 en-US 的.wxl。也就是说Cultures to build中的区域性即使没有对应.wxl也会被构建只是字符串来源退化为扩展库。中性区域性与命令行一致中性invariant区域性同样使用关键字neutral。要同时构建英语美国、法语法国和中性三个安装包填写en-US;fr-FR;neutral区域性组与多输出Cultures to build还可用于指定如何用多个.wxl文件构建单个安装包。每个区域性或区域性组都会构建出一个独立的 MSI区域性组culture group由逗号分隔的一组区域性用于定义回退查找顺序多个区域性组由分号分隔用于构建多个输出。primary1,fallback1;primary2,fallback2即构建两个输出第一个输出以primary1为主区域性、fallback1为回退第二个输出以primary2为主、fallback2为回退。下面的示例展示如何用三个.wxl文件构建两个安装包同时构建 en-US 与 en-GB 两个安装包使用三个本地化文件setupStrings_en-US.wxl、setupStrings_en-GB.wxl与setupStrings_en.wxl。该示例用两个区域性组共享中性英语翻译en-GB,en;en-US,en两个区域性组都回退到en使完全本地化的两个安装包共用一份中性英语字符串避免重复维护。MSBuild 底层WixAssignCulture 任务与 AssignCultures 目标Visual Studio 属性页中的 Cultures to build 最终会写入.wixproj的Cultures属性并经由 MSBuild 任务链驱动light.exe。整个链路在仓库中清晰可见属性传递MSBuild 任务 Light.cs 暴露Cultures属性见 Light.cs并在执行时通过commandLineBuilder.AppendSwitchIfNotNull(-cultures:, this.Cultures);见 Light.cs把它转换成light.exe的-cultures:参数。区域性组解析任务 WixAssignCulture.cs 负责把Cultures字符串解析为区域性组。其注释明确规定了语法primary culture,first fallback culture, second fallback culture;...即分号分隔区域性组、逗号分隔组内回退见 WixAssignCulture.cs。解析实现见 WixAssignCulture.cs若指定了Cultures按;切分成多个CultureGroup每组再按,切分为回退序列若未指定Cultures则扫描(EmbeddedResource)中的.wxl文件读取其WixLocalization元素的Culture属性无该属性视为中性自动为每个区域性建立区域性组若既未指定Cultures也没有任何.wxl则创建一个空区域性组构建未本地化的默认输出。输出目录规则每个区域性组的OutputFolder元数据取组内第一个主区域性作为输出子目录中性组输出到默认目录见 WixAssignCulture.cs。唯一的例外是当只指定一个区域性组且没有任何.wxl文件时为保持旧行为输出直接到默认目录见 WixAssignCulture.cs。构建目标AssignCultures目标仅对OutputType为Package、PatchCreation或Module的项目生效调用WixAssignCulture任务并根据%(CultureGroup.OutputFolder)生成TargetPath、TargetPdbPath及签名目标项见 wix.targets。目标注释中给出的示例正是Culturesen-US,en;en-GB,en/Cultures即构建两个目标分别输出到en-US与en-GB子文件夹light 先在第一个区域性en-US 或 en-GB中查找字符串再回退到第二个区域性en。另外注意 WixAssignCulture.cs 的说明该任务刻意不校验字符串是否为合法区域性以便支持 pseudo-loc伪本地化等特殊场景。这也是neutral、null等关键字存在的另一个原因——MSBuild 2.0 无法处理空字符串项因此用关键字代替。实战要点与注意事项大小写不敏感-cultures:en-US与-cultures:en-us等价.wxl的Culture属性在加载时统一转为小写。指定区域性后未匹配的.wxl会被忽略这是过滤而非报错多语言项目可放心把所有语言的.wxl一并传入-loc。回退顺序即列表顺序-cultures:en-us;en表示 en-us 优先、en 兜底区域性组内用逗号、组间用分号。neutral与null不同neutral是真正构建中性安装包并参与.wxl过滤null等价于未指定区域性light 会按未指定时的规则自动选择本地化文件。输出目录MSBuild 构建时除单区域性组且无.wxl的兼容场景外每个区域性组的输出 MSI 会落入以主区域性命名的子目录如bin\Debug\en-US\MyInstaller.msi。没有.wxl也能构建只要所引用扩展如 WixUIExtension带有对应区域性的本地化库Cultures to build中的区域性就能直接构建。如需进一步深入可继续阅读本仓库中的相关实现light.cs-cultures解析与本地化加载、WixAssignCulture.cs区域性组任务、wix.targetsAssignCultures目标、Library.cs扩展库本地化加载以及 Localization.cs.wxl区域性规范化并结合 test/data/Tools/Light/Localization/LocalizationTests 目录下的多区域性测试数据进行验证。赞分享开发工具构建工具【免费下载链接】wix3WiX Toolset v3.x项目地址https://gitcode.com/gh_mirrors/wi/wix3点击查看免费下载相关推荐使用 WiX Toolset 构建本地化安装包命令行与 Visual Studio 完整实战指南使用 WiX Toolset 构建本地化安装包命令行与 Visual Studio 完整实战指南 构建一个面向多语言市场的 Windows Installer开发工具构建工具7 平台 5 步跑通MediaCrawler 自媒体数据爬虫新手完整上手指南7 平台 5 步跑通MediaCrawler 自媒体数据爬虫新手完整上手指南 MediaCrawler 是一款多平台自媒体数据爬虫覆盖小红书、抖音、快手、B网页爬虫数据工程i18next回退语言策略构建无缝多语言体验的终极指南i18next回退语言策略构建无缝多语言体验的终极指南 i18next是一个功能强大的国际化框架专为JavaScript环境设计提供全面的多语言支持。在全国际化前端上一篇MediaPipe TouchDesigner完整指南三步实现GPU加速的实时AI视觉特效下一篇FerretDB 快速上手指南以 DocumentDB 为引擎的开源 MongoDB 替代方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考