目标仅仅是生成简体中文安装包,结果过程中发生了很多预料之外的事情。
总之,走了很多弯路。
感觉思路也有点问题,没转过弯来。
虽然做了很多无用功,但还是把它记录下来。
UI中的汉字问题
Error 6 A string was provided with characters that are not available in the specified database code page '1252'. Either change these characters to ones that exist in the database's code page, or update the database's code page by modifying one of the following attributes: Product/@Codepage, Module/@Codepage, Patch/@Codepage, PatchCreation/@Codepage, or WixLocalization/@Codepage.
<Product Codepage="1252"
在相应语言/地区的UI设置好Codepage就行。
<WixLocalization Culture="zh-cn" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="936">
<String Id="DownloadDirDlg_Title" Localizable="yes" Overridable="yes">[ProductName] 下载设置</String>
<String Id="DownloadDirDlg_BannerTitle" Localizable="yes" Overridable="yes">{\WixUI_Font_Title}自定义下载路径</String>
<String Id="DownloadDirDlg_Description" Localizable="yes" Overridable="yes">请设置预期下载的保存位置</String>
<String Id="DownloadDirDlg_Label" Localizable="yes" Overridable="yes">&下载路径:</String>
</WixLocalization>
提示未知的本地化变量
error LGHT0102 : The localization variable !(loc.DownloadDirDlg_BannerTitle) is unknown. Please ensure the variable is defined.
本地测试的时候没有问题,因为本地的环境属于zh-CN
,但是Github Actions的环境默认是en-US
,我们没有为en-US
补充本地化文件。
解决方案有两个,将本地化文件补上,或者将环境设置为zh-CN
。
提示重复的本地化变量
light.exe : error LGHT0100 : The localization identifier 'ShortcutPromptDlg_Title' has been duplicated in multiple locations. Please resolve the conflict.
有zh-CN
、en-US
本地化文件冲突,参考String Element,设置属性Localizable
和Overridable
打包的始终是en-US
解决的过程有点扭曲,做了很多无用功。
但是既然的花费了这么多代价,那便把过程写下来。
尝试1:通过PowerShell将系统环境更改,无效
- name: Perform a Pester test from the Tests.ps1 file
shell: pwsh
run: |
Set-WinSystemLocale zh-CN
Set-Culture zh-CN
Set-WinUILanguageOverride -Language zh-CN
#Set-WinUserLanguageList zh-CN -Force
尝试2:打包en-US
、zh-CN
最开始,是覆盖本地化配置MsiInstallerStrings_en.wxl
、MsiInstallerStrings_zh_CN.wxl
。无果。
查看log,发现
light.exe ... -loc xxx ... -cultures:en-us
查看JDK源码
for (var wxl : primaryWxlFiles) {
wixPipeline.addLightOptions("-loc", wxl.toAbsolutePath().normalize().toString());
}
List<String> cultures = new ArrayList<>();
for (var wxl : customWxlFiles) {
wixPipeline.addLightOptions("-loc", wxl.toAbsolutePath().normalize().toString());
cultures.add(getCultureFromWxlFile(wxl));
}
// Append a primary culture bases on runtime locale.
final Path primaryWxlFile = CONFIG_ROOT.fetchFrom(params).resolve(
I18N.getString("resource.wxl-file-name"));
cultures.add(getCultureFromWxlFile(primaryWxlFile));
// Build ordered list of unique cultures.
Set<String> uniqueCultures = new LinkedHashSet<>();
uniqueCultures.addAll(cultures);
wixPipeline.addLightOptions(uniqueCultures.stream().collect(
Collectors.joining(";", "-cultures:", "")));
wixPipeline.buildMsi(msiOut.toAbsolutePath());
jpackage会从customWxlFiles
读取-cultures
的参数,最后再附带本地环境的culture配置。
而customWxlFiles
怎么来的呢?就是resource-dir
里面的所有*.wxl
文件,它的文件名不能是MsiInstallerStrings_zh_CN.wxl
、MsiInstallerStrings_ja.wxl
、MsiInstallerStrings_en.wxl
、MsiInstallerStrings_de.wxl
,否则会从customWxlFiles
里面排除。
于是变扭的起了个名字MsiInstallerStrings_zh.wxl
,又因为默认环境的en-US
去不掉,干脆又补上了一个MsiInstallerStrings_en-US.wxl
。
中间又犯了未知/重复本地变量的问题,又是一顿操作。
终于安装包出来了,一运行,是英文的。 WTF!!
经测试发现,参数-cultures:en-us;zh-cn
结果就是这样,所以要确保顺序为-cultures:zh-cn;en-us
。
好吧,那么干脆文件MsiInstallerStrings_en-US.wxl
不要了,内容全部补到MsiInstallerStrings_en.wxl
里。
这下终于OK了,就是太拧巴了。
只打包zh-CN
查看源码最终查到Locales.getDefault()
,再溯源到System.getProperty("user.language")
和System.getProperty("user.region")
。
尚不清楚JVM初始化怎么获取系统关于这两个变量的相关配置的值的。
总之,前面尝试过更改系统本身的配置,但没有效果。这条路可能走得通,但不想再折腾了。
现在的想法是直接修改JVM设置。
怎么修呢?
尝试像java -Duser.region=CN -Duser.language=zh
一样通过命令行传参,但对于jpackage来说并不行。
行吧,最终还是设置环境变量解决了问题。
set JAVA_TOOL_OPTIONS=-Duser.region=CN -Duser.language=zh
jpackage ...