如何用 tiny11builder 制作多语言国际版 Tiny11:语言包与区域设置完整指南
【免费下载链接】tiny11builderWinUI app for building smaller, customized Windows 11 images.项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder
读完本文,你能用 tiny11builder 打包出一款带指定语言包与区域设置的国际版 Windows 11 精简镜像:先识别镜像当前的语言环境,再批量注入 .cab 语言包,然后把区域与默认语言一次性写死,最后输出一张可在目标国家直接部署的 tiny11.iso,解决「tiny11 多语言镜像怎么做」这类问题。
一、动手前的准备工作
在改任何脚本之前,先把五样东西备齐,缺一样后面都会卡住:
- 一台 Windows 11 主机,以管理员身份运行 PowerShell 5.1;
- 原版 Windows 11 ISO并挂载到本地(得到镜像盘符,例如
E:); - 一块空闲磁盘作为临时工作盘(脚本的
-SCRATCH参数),建议至少 30GB 可用空间; - tiny11builder 源码,在目标目录执行:
git clone https://gitcode.com/GitHub_Trending/ti/tiny11builder- 与镜像同版本的 .cab 语言包,放在脚本目录下新建的
LanguagePacks文件夹中。语言包必须和你手里的 Windows 11 构建版本严格对应,跨大版本(比如 22H2 的包装进 23H2 的镜像)必然失败。
脚本入口是 tiny11maker.ps1,它的运行参数只有两个盘符:
.\tiny11maker.ps1 -ISO E -SCRATCH D注意:如果你打算做「装完还能继续加语言、打补丁」的镜像,务必用
tiny11maker.ps1而不是tiny11Coremaker.ps1——后者为了极致精简裁掉了系统组件存储,镜像生成后无法再添加语言包,这一点在 README.md 中有明确说明。
二、识别镜像当前的语言环境
改配置之前,先搞清楚镜像「现在是什么语言」。脚本挂载install.wim到scratchdir之后,就是读取语言信息的时间点。对应的核心命令只有一条:
dism /English /Get-Intl /Image:D:\scratchdir输出里有一行Default system UI language : xx-XX,比如en-US。tiny11maker.ps1 第 167–175 行就是用正则匹配这一行拿到语言代码,再打印到控制台;如果匹配不到,会输出Default system UI language code not found.,通常意味着镜像挂载不完整,先别往下走。
记下这个语言代码有两个用途:确认你注入语言包之前镜像的基线语言,以及判断autounattend.xml里该写哪个UILanguage。如果基线语言和目标语言一致,你甚至可以只补区域格式,不注入额外语言包。
三、批量注入语言包的命令
DISM(Deployment Image Servicing and Management)是 Windows 自带的离线映像管理工具,语言包的「装进去」和「拆出来」都靠它对离线镜像执行/Add-Package,不需要进系统装。所以注入语言包的正确时机是:镜像已挂载、清理组件(/Cleanup-Image)执行之前。
把代码插到 tiny11maker.ps1 中Mounting complete! Performing removal of applications...这条日志(约第 196 行)之后的位置,遍历LanguagePacks目录逐个安装:
Get-ChildItem "$PSScriptRoot\LanguagePacks\*.cab" | ForEach-Object { dism /English /Image:D:\scratchdir /Add-Package /PackagePath:$_.FullName }三点提醒:
D:换成你实际的-SCRATCH盘符,或者直接用脚本里的变量$ScratchDisk;- 建议把每个包的输出重定向追加到
LanguagePackInstall.log,方便定位是哪个包失败; - 注入顺序无所谓,但全部成功后再继续走后面的注册表和清理流程,任何一个包报错就先处理,不要带伤打包。
四、一次性写入区域与默认语言
语言决定「界面显示什么文字」,区域决定「日期、数字、货币长什么样」。这两件事要改两个地方,合在一起一次改完,避免顾此失彼。
第一处:autounattend.xml 的 windowsPE 阶段。仓库里现有的 autounattend.xml 目前只有oobeSystem(隐藏微软账号界面)和windowsPE(压缩安装)两节。在<settings pass="windowsPE">节点内补上国际区域组件:
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> <SetupUILanguage><UILanguage>zh-CN</UILanguage></SetupUILanguage> <InputLocale>0804:00000804</InputLocale> <SystemLocale>zh-CN</SystemLocale> <UILanguage>zh-CN</UILanguage> <UserLocale>zh-CN</UserLocale> </component>脚本在两个阶段会自动拷贝这个文件(约第 324 行拷进镜像的Sysprep目录,约第 440 行拷到 ISO 根目录),所以你只需要改仓库根目录这一份,不用动脚本。UILanguage写的是 OOBE 首屏语言,UserLocale/SystemLocale控制区域格式,InputLocale是键盘布局——三者要对齐到同一目标区域,例如做中文(中国)镜像时统一为zh-CN系列值。
第二处:离线注册表,把默认语言写进系统配置。脚本会把镜像的SYSTEM、SOFTWARE等注册表单元以HKLM\zSYSTEM、HKLM\zSOFTWARE等名称加载进来。在 tiny11maker.ps1 的reg load完成之后(约第 287 行起,和现有的Set-RegistryValue调用放在一起),追加:
Set-RegistryValue 'HKLM\zSYSTEM\ControlSet001\Control\International' 'LocaleName' 'REG_SZ' 'zh-CN' Set-RegistryValue 'HKLM\zSYSTEM\ControlSet001\Control\MUI\Settings' 'PreferredUILanguages' 'REG_MULTI_SZ' 'zh-CN'这两行分别锁定系统区域和首选 UI 语言。位置很关键:必须夹在reg load和reg unload之间,写早了没挂上单元、写晚了单元已卸载。autounattend 负责「装机过程中」的语言,注册表负责「装完开机后」的语言,两处一致,才不会出现安装界面中文、进系统又跳回英文的分裂现象。
五、打包镜像并做有效性验证
后面的流程脚本全自动:清理组件存储 → 卸载镜像 → 重新导出install.wim→ 调用 oscdimg 生成tiny11.iso。产出物就在脚本所在目录,名为tiny11.iso。
打包完先做一次离线验证,不用急着装系统。对成品install.wim查包和语言信息:
dism /English /Get-Packages /ImageFile:D:\tiny11\sources\install.wim | Select-String LanguagePack dism /English /Get-Intl /ImageFile:D:\tiny11\sources\install.wimLanguagePack条目里应能看到你注入的所有语言,Get-Intl的默认 UI 语言应指向预期值。
再做一次装机验证:在虚拟机里用 ISO 启动,走到 OOBE 观察首屏语言是否为autounattend.xml里写的UILanguage;进入桌面后打开「设置 → 时间和语言」,核对已安装语言列表、区域格式、日期与货币显示。两边都对了,这张国际版镜像才算交付完成。
六、踩坑排查清单
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
语言包安装报0x800f0820或提示版本不匹配 | .cab 语言包与镜像的 Windows 11 版本不一致 | 更换与镜像构建版本完全对应的语言包,不要跨大版本混用 |
| 注入时报磁盘空间不足 | 临时盘剩余空间不够,语言包展开后体积不小 | 给-SCRATCH换一块空间更大的盘,清掉旧的tiny11/scratchdir残留 |
| 装完 OOBE 首屏语言不对 | autounattend.xml的区域组件没放进windowsPE节,或UILanguage写了镜像不支持的值 | 对照第四节的 XML 结构检查组件位置;UILanguage必须是镜像里已存在的语言代码 |
| 进入系统后区域格式仍是默认值 | 注册表写入时机错误(在reg load之前或reg unload之后执行) | 把Set-RegistryValue两行挪到第 287 行reg load HKLM\zSYSTEM之后、第 384 行reg unload之前 |
脚本提示Default system UI language code not found. | install.wim挂载失败或选错了镜像索引 | 重新运行脚本,确认输入的镜像索引(SKU)与install.wim中的条目一致 |
| 最终 ISO 无法启动或脚本中途退出 | oscdimg.exe 缺失或路径不对 | 安装 Windows ADK,或让脚本自动下载捆绑版 oscdimg.exe 后再跑 |
| 区域配置不生效但日志全绿 | 两处配置互相矛盾(XML 与注册表语言代码不一致) | 统一autounattend.xml与注册表中所有语言/区域代码到同一个值后重新打包 |
从识别语言环境到打包验证,整条链路就是「读基线 → 注语言包 → 锁区域 → 验成品」四步。走完这张清单,你的 tiny11.iso 就是一张语言与区域都锁死的国际版镜像,写入 U 盘即可部署。
【免费下载链接】tiny11builderWinUI app for building smaller, customized Windows 11 images.项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考