Localization Checker 手册(上):各项检查和结果
本页目录
本手册说明扫描范围、翻译来源、各项检查、Play 巡检和结果解读。首次使用请先阅读快速入门。对工程状态的影响、各项检查的适用前提及漏报、误报限制,见 Manual-Safety.zh-Hans.md。
扫描怎么做
对每种分辨率、每种所选语言:
将范围内的 Canvas 复制到隐藏预览场景
(移除用户脚本,字体和材质使用内存副本)
同时为文字应用该语言的译文
重建布局,交由文字引擎排版
├─ 对比文字与容器边界:爆框
├─ 检查控制尺寸的布局:布局
├─ 对比文字排版范围:文字重叠
└─ 检查自动断行位置:换行禁则
无需排版的检查另外执行:
├─ 沿字体链检查字符:缺字
└─ 遍历翻译表各 key:占位符、标签、译文
总览将结果归入五列:爆框 包含爆框、布局、文字重叠和换行禁则;缺字 包含字符覆盖和字体配置问题;其余为 占位符、标签、漏翻译。漏翻译 同时汇总表值、文字方向、编码和未接入本地化的文字问题。
扫描读什么
在 扫描之前 清单的 范围 行选择扫描对象:
| 范围 | 检查对象 |
|---|---|
| 打开的场景 | Hierarchy 中已加载的所有场景;每个场景都必须至少保存过一次。 |
| 选中的物体 | 已打开且保存过的场景中,当前选中的物体。 |
| Prefab | 单个 Prefab 或 Prefab 变体,以磁盘中保存的文件为准。 |
| 文件夹里的 Prefab | 指定文件夹及子文件夹中的全部 Prefab。默认路径为 Assets,即整个工程的资产目录;此操作不打开场景。 |
- 插件不会为扫描打开未加载的场景。打开场景可能执行
[ExecuteAlways]脚本并影响资产;需要检查时,请先自行打开,再选择 打开的场景。 - 标记为 EditorOnly 的物体在场景扫描中排除,因为构建会移除它们;Prefab 文件扫描仍包含这些物体。
- 范围下拉框下方会说明当前实际检查对象。Play 模式中不能启动扫描。
文字。 扫描获取 TextMeshPro UGUI 和旧版 UI Text 的内容、字体、边界与布局。Unity 6 还支持 UI Toolkit 文档中的文字,具体范围见下文。
要查的语言。 可选择翻译来源中识别出的语言。添加语言 还能加入表中尚不存在的语言,用于提前检查字体覆盖;可从 16 种常用语言中选择,或点击 输入代码…。语言代码不区分大小写。伪本地化 则加入插件生成的测试语言。
源语言。 指最初编写内容的语言,供译文比较和未本地化文字检查使用。如果组件中填写的是正文而非 key,也会按源语言内容查找条目。源语言不在所选检查语言中时,插件仍会按需排版源文,作为比较基准。
分辨率。 每种分辨率独立测量,爆框结果会注明对应尺寸。
UI Toolkit(Unity 6)
Unity 6 中,扫描也包括范围内的 UIDocument。插件在内存中构建 UXML 副本,检查 Label、Button、控件标签及嵌套模板。支持未本地化文字、缺字、爆框、文字重叠、布局,以及 Unity 6000.3 起的换行禁则检查。副本渲染到插件的贴图,不显示在 Game 视图中。Unity 2022.3 和团结引擎不支持此项。
- 结果中的元素路径采用“物体 › 元素路径”,例如
Menu/Document › panel/title。 - UXML 中针对元素
text设置的 Unity Localization LocalizedString 绑定可自动关联 key,可信度为 High。无法识别脚本SetBinding绑定、代码设置的文字或运行时新增元素。 - 对于
display: none元素,插件会在副本中分组显示后测量,结果注明 文档里隐藏。 - Unity 6000.5 起,未显式指定字体的元素可能使用主题默认字体,引擎不公开该字体。这些元素跳过缺字检查,摘要会列出数量。
- 排版需要编辑器运行若干帧。使用命令行扫描时,请勿添加
-quit。
译文从哪来
Unity Localization
安装 Unity Localization 1.5.2 及以上、2.0 以下版本后,插件可自动识别:
- 所有 String Table Collection。
- 启用的 LocalizeStringEvent:更新监听必须启用,并以动态字符串参数设置文本组件内容。
- GameObjectLocalizer:通过 String Table 跟踪文本内容时,插件可识别对应绑定。逐语言字体,以及继承
LocalizedAssetEvent的自定义换字体组件,也参与缺字检查。资产表中的字体通过工程内 GUID 查找,不经 Addressables 加载。 - GameObjectLocalizer 的逐语言字号、尺寸、位置、启用状态和字体,会在测量该语言前应用到副本。
翻译文件
在 翻译文件(CSV、Excel、JSON、XLIFF、PO) 中添加文件,也可以从 Project 窗口拖入。选择文件后,插件根据扩展名自动设置 格式。
| 格式 | 文件结构 |
|---|---|
| CSV(逗号或分号)、TSV | UTF-8 编码,包含表头、一列 key 和每种语言各一列。TSV 按 Google Sheets 下载的无引号格式解析。 |
| Excel(.xlsx、.xlsm) | 每个工作表作为一张表,第一行非空行为表头,列结构与 CSV 相同。在 工作表 中选择;需要另一张工作表时,再添加一次该工作簿。 |
| JSON | 支持每种语言一个文件({"key": "text"})、按 key 分组({"key": {"fr": "text"}})或按语言分组({"fr": {"key": "text"}})。嵌套路径以点连接为 key,如 menu.start。 |
| i18next 风格 JSON | 每种语言一个文件;_one、_few、_many 等后缀代表同一 key 的复数形式,{{name}} 作为占位符。 |
| XLIFF 1.2 或 2.0 | 每种语言一个文件,支持 Unity Localization 和翻译平台导出的对应格式。 |
| gettext PO | 每种语言一个文件,以 msgid 为 key。若 msgid 是源文,在 msgid 的语言 中填写其语言;文件头有 X-Source-Language 时自动填写。若 msgid 仅为标识,且所有语言均有独立文件,此项留空。 |
- 列映射。 第一列默认作为 key。插件会将
en、English、Deutsch、日本語等语言表头映射到语言代码,其余列需手动指定;ID、No不作为语言。点击 改对照… 调整映射。 - 文件错误。 语法错误、重复 key 或找不到已映射表头时,文件不参与检查;文件下方会说明原因及行号,Excel 使用工作表行号。
- i18next 复数。 每种语言都需要
item_other,以及整数复数规则会使用的形式。例如德语需要item_one,俄语和波兰语需要item_one、item_few、item_many。缺失形式报 缺译文。 - XLIFF 限制。 含内联代码(
<g>、<x/>、<ph>等),或将一个翻译单元拆为多段的文件,不参与检查。 - Excel 值。 读取磁盘中最后保存的单元格值;公式使用已保存的计算结果,不重新计算。富文本各段合并为纯文字,不保留格式。数字和日期不应用单元格显示格式:15 位以内的整数按整数输出(
100001.0变为100001),其余数字保留文件中的写法,日期通常是序列数。需要保持原样的翻译文字应存为文本。未保存的工作簿修改不可见;.xls和密码保护的文件不支持,请另存为无密码的.xlsx。 - PO 条目。 有上下文时 key 为
上下文|msgid,如menu|Open。空 msgstr 和 fuzzy 条目均报 缺译文,与 gettext 回退显示 msgid 的行为一致。 - PO 复数。 每个复数形式生成独立 key,如
item[0]、item[1]。形式数量取自Plural-Forms,未指定时为 2;空msgstr[n]报 缺译文,该语言不使用的形式不报。填写 msgid 的语言 后,各形式与msgid_plural比较占位符:若某形式在 0 到 1000 中适用的整数少于 5 个,例如英语单数只适用于 1,可省略数字占位符,但不能添加;其余形式必须完整。文件必须为 UTF-8;若Plural-Forms无法解析,或在 0 到 1000 中算出不存在的形式,整个文件不参与检查。这些规则与 msgfmt 的检查方式一致。
I2 Localization
I2 Localization 2.8.9 及以上可自动识别。扫描不调用 I2 API:
- 翻译表:读取 Resources 中的
I2Languages,以及扫描文件中的 LanguageSource 组件。仅 Text 类型的 term 作为 key。 - 绑定:启用的 Localize 组件将同物体上的文字绑定到 term,可信度为 High;没有 term 时记为未绑定。
- 显示选项:测量前应用 Localize 的大小写、前缀和后缀。
- Play 巡检:可通过 I2 切换语言,见巡检部分。
文字怎么绑到 key
Key 绑定 列说明关联方式及可信度:
| 关联方式 | 可信度 |
|---|---|
| 由 LocalizeStringEvent、GameObjectLocalizer 或 I2 Localize 驱动 | High |
| 声明的 key 字段 中指定的自定义组件字符串字段 | High |
| 文字内容是 key,且翻译表启用了 文本框里写的是这张表的 key | High |
| 文字内容与某条源语言内容相同 | Medium |
| 多个组件同时驱动同一文字 | Medium |
| 通过 指定 key… 手动关联 | Low |
同一个 key 出现在多张表中时,High 会降为 Medium。没有任何信息指明 key 时记为 未绑定;指定的表或 key 不在已读取来源中时记为 绑定失效。如果文字看起来是某张表的 key,但尚未启用相应选项,扫描会给出提示;点击 打开并重新扫描 可启用选项并再次扫描。
无法读取的文件、表及重复 key 等问题归为 来源。总览计数下方会显示 翻译表本身的问题(读不了的表、重复的 key):,点击数量可查看详情。
各项检查
爆框
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 文字撑爆 | 严重 | 排版后的文字超出自身容器。 |
| 文字被截断 | 警告 | Ellipsis 或 Truncate 模式截去了部分内容。 |
| 文字临界 | 提示 | 可以容纳文字,但检查方向上的剩余空间不足 5%。 |
| 自动字号过小 | 警告 | Auto Size 或 Best Fit 将字号缩至最大字号的四分之三以下。 |
| 文字没测 | 提示 | 无法完成测量,原因见 详情。 |
- 始终检查高度;仅在不换行时检查宽度。由 Content Size Fitter 或父级 Layout Group 控制尺寸的方向交给布局检查。
- 某语言中存在该 key 的译文时,才测量这条文字。无法测量的情况包括:UI 文字不在 Canvas 下、自定义文字类或布局代码、由控件改写的输入框标签或下拉框标题、Canvas 无法复制、未导入 TMP 必备资源,以及译文通过标签指定了字体、样式、材质或精灵资产。
- 3D TextMeshPro 使用 Mesh Renderer。位于 Canvas 下时随该 Canvas 测量;否则复制文字及其 RectTransform 祖先链,在自身边界内测量。后一种情况不受分辨率影响,不检查布局或文字重叠,也不提供并排预览。
- Screen Space - Camera Canvas 按相机视口计算尺寸。自动隐藏滚动条的 Scroll View 仅在内容超出时为滚动条留出空间。
详情 可能包含以下注记:
- 场景里隐藏:文字或祖先物体未激活;测量时会显示该 Canvas 中所有隐藏物体。
- 测量时去掉了这些脚本:副本移除了所列脚本,因此未包含它们在运行时对尺寸、字体或内容的修改。
- 原文也是,这种语言没长大:仅供参考:该分辨率下源文已有同类问题,译文没有扩大问题程度,因此不计数。如果译文加重问题,例如 原文也是,这种语言多出 20,仍会计数。
- 修复建议:仅针对撑爆和截断。插件在副本上尝试降低字号(最低至原字号的四分之三)、启用 Auto Size 或 Best Fit、允许换行,并给出结果,例如 字号降到 30 放得下(现在 36)、允许换行放不下。这些尝试不会修改源物体设置。
布局
对于由布局控制尺寸的文字,扫描会沿祖先链检查到布局根节点。
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 布局伸出屏幕 | 严重 | 布局根节点超出屏幕范围。 |
| 布局伸出父物体 | 警告 | 布局根节点超出其容器。 |
| 子物体伸出布局组 | 警告 | 子物体超出 Horizontal 或 Vertical Layout Group。 |
| 子物体被布局组挤小 | 提示 | 布局组给非文字子物体分配的空间小于其期望尺寸。 |
| 布局没测 | 提示 | 无法完成检查,原因见 详情。 |
详情按 Canvas 单位说明超出距离,例如 伸出父物体:左 12、右 12。如果源文已有同类问题且译文没有加重,该结果仅供参考。
文字重叠
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 文字重叠 | 警告 | 两条原本不重叠的文字,在译文排版后相互覆盖。 |
- 仅比较同一 Canvas 中能够同时显示的文字;隐藏对话框中的文字在该隐藏组内部比较。
- 使用包围排版文字的矩形范围。两个方向都重叠至少 1 个单位才报告;场景中原本已重叠的文字对不报告。
- 已在该语言中报告撑爆的文字不再参与重叠比较。
- 详情说明另一条文字及重叠深度,例如 压到了 Canvas/Options/Value 的字上,叠了 12 个单位。
换行禁则
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 换行犯了禁则 | 警告 | 日文或中文断行不符合禁则;泰文断行拆开音节;或 UI Toolkit 将韩文单词拆为两行。 |
| 韩文在词中间断行 | 警告 | 所选语言包含韩文且扫描包含 TMP 文字,但 TMP Settings 的 Use Modern Hangul Line Breaking Rules 未启用。每种韩文语言在 TMP Settings 上报告一次。 |
| 可能在词中间断行 | 提示 | 泰文在两个字母之间自动断行,断点没有空格或零宽空格标记,需要人工核对。 |
- 只检查引擎自动换行,不检查译文本身插入的换行。典型规则包括:句号、逗号、闭括号不能位于行首,开括号不能位于行尾,……、—— 等成对字符不能拆开。
- 泰文检查以音节为基础:เ แ โ ใ ไ 等前置元音不能留在行尾,后置元音、声调和符号不能位于行首。插件没有泰文分词词典,因此两个泰文字母之间没有空格或零宽空格(U+200B)的其他断点也会列为 可能在词中间断行,其中可能包含正确词界。例如 第 2 行在 มก 之间断开,那里没标词界。在译文词界插入零宽空格后,TextMeshPro 和 UI Toolkit 可据此断行,该位置不再列出;旧版 Text 不识别该标记。
- 详情逐处说明问题,例如 第 1 行以 ( 结尾 · 第 3 行以 。 开头。悬停问题种类可查看调整方法。
- TextMeshPro 使用 TMP Settings 中 Line Breaking for Asian languages 的两份规则文件;文件缺失或为空会影响断行。Unity 6 的 TMP 仍可能将开括号、开引号留在行尾。旧版 Text 不遵守禁则。UI Toolkit 通常遵守大部分规则;Unity 6000.3 起可检查其元素,但含富文本标签或转义序列的文字会跳过,摘要注明数量。
- 现代韩文按词在空格处换行。启用 Use Modern Hangul Line Breaking Rules 可改变 TMP 的断行位置。旧版 Text 已按词换行。UI Toolkit 没有该开关,可能在任意音节间断行;Unity 6000.3 起,扫描会将非空格处的韩文词内断行记为 换行犯了禁则,例如 니다 处的词在第 2 行末尾被拆开。
伪本地化
扫描可由插件生成 qps-ploc 测试译文:将字母替换为带重音形式,并将长度增加约 40%,例如 Settings 变为 ŚéţţîñĝśŚéţţ。占位符和标签保持原样,无需已有译文,适合在翻译前检查界面余量。
此模式只检查爆框(包括文字重叠)和布局,可信度标为 Static Estimate(伪译文估计)。它不代表真实语言的长度或排版,也不同于 Play 巡检所需的、由游戏本地化系统提供的伪语言。
变量样本
在 变量样本 中,为占位符填写游戏可能使用的最长值。所有语言的爆框和布局测量都使用替换后的内容。占位符需保持原写法,如 {playerName}、{0}、%s、%1$s,名称区分大小写。缺少样本的占位符按原文排版,详情会注明。
Play 巡检中的 用变量样本 让游戏显示这些值。与占位符同名的 Unity Localization 全局字符串变量可自动应用;自定义代码可在 巡检时的变量样本(项目自己的代码) 中声明 static void Method(IReadOnlyDictionary<string, string> samples),需要还原时该方法接收 null。
缺字
扫描根据文字系统的字体链检查字符,不使用本机安装字体替代资产检查:
- TextMeshPro:依次检查字体资产、该资产的 fallback、TMP Settings fallback、TMP Settings 默认字体。动态字体还检查源字体文件;粗体和斜体先检查字重表中的对应字体。
- 旧版 Text:检查当前字体及其导入设置引用的字体。
- UI Toolkit:检查解析出的字体、其 fallback 和所属面板的文字设置。共用字体的不同面板仍分别使用各自的回退设置。
标签和占位符不作为可见字符检查;大小写样式会先应用,例如 é 大写后按 É 检查。
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 缺字 | 严重;旧版动态字体为警告 | 字体链未找到所列字符,可能显示缺字符号。 |
| 依赖设备字体 | 警告 | 字符依赖设备字体,例如 Dynamic OS 资产或没有字体数据的字体。 |
| 由 fallback 字体给出 | 提示 | 字符由回退字体提供,建议核对外观一致性;仅供参考。 |
| 字体不含这种语言 | 见下文 | 字体的语言字符集覆盖不足。 |
| 动态字体只有一张图集 | 警告 | 未启用 Multi Atlas Textures,图集填满后可能缺字。 |
| 源字体文件读不了 | 警告 | 动态字体无法在运行时添加字形。 |
| 中日共用字体 | 提示 | 同一汉字在中文和日文中可能需要不同字形。 |
| 从右往左的文字 | 警告 | 阿拉伯文、希伯来文等需在游戏中核对方向和连写。 |
| 疑似编码问题 | 警告 | 检出零宽字符、字节顺序标记、拆分重音、私用区字符或 U+FFFD。泰文中的零宽空格作为断行标记,不在此列。 |
语言覆盖。 即使尚无译文,也可检查字体对随包语言字符集及标点的覆盖。字符集面向 Steam 完整支持的语言,包含中、日、韩、泰、阿拉伯、希腊、俄、乌克兰、保加利亚语及各拉丁字母语言的字母。总览 语言覆盖 将字体标为 不含、部分(含百分比)、完整 或 依赖设备字体。
字体不含这种语言 的等级取决于覆盖情况:完全没有该语言字符为严重,依赖设备字体时为警告;部分字符依赖设备字体也为警告;仅缺部分字符或标点为提示。UI Toolkit 的覆盖统计只使用字体自身回退链,不加入面板全局 fallback,因此具体元素仍可能由所属面板补齐字形。
按语言换的字体。 若工程会逐语言切换字体,而插件无法识别该行为,可配置 按语言换的字体,供该语言的缺字和爆框测量使用。启用 也查 Assets 里所有 TMP 字体资产的语言覆盖,可额外查看工程内所有 TMP 字体资产的覆盖提示。
扫描的缺字(按字体) 汇总各字体缺失字符;点击 复制为 Font Asset Creator 字符串 可复制为 Font Asset Creator 的 Custom Characters 格式。
占位符
支持 {0}、{name}、Smart String(如 {count:plural:item|items})、%s、%d、%1$s、{[NAME]} 和 i18next {{name}}。译文可以调整占位符顺序。
| 差异 | 严重程度 |
|---|---|
| 缺少或多出占位符 | 严重 |
名称改变,如 {name} → {nombre} | 严重 |
名称被翻译,如 {玩家名} | 严重 |
| 出现次数不同 | 警告 |
富文本标签
按文字所属引擎解析标签,并与源文对照。源文已有的特殊写法不会仅因译文保留它而报告;增加或删除完整的一对标签也不作为问题。
| 差异 | 示例或含义 |
|---|---|
| 未闭合 | 源文闭合的标签在译文中未闭合。 |
| 疑似机翻损坏 | 标签中出现空格、全角括号,或写成 </br> 等形式。 |
| 交叉嵌套 | <b><i></b></i>。 |
| 属性变化 | <color=#FF0000> → <color=#00FF00>。 |
同一 key、同一语言的所有标签差异合并为一条结果。仅属性变化时为警告,其他情况为严重;标签值被翻译为文字,如 <color=红色>,也为严重。
标签点名的资产不在工程里 为严重:TMP 的 <font="…">、<sprite="…">、<sprite name="…"> 或 <style="…"> 引用的名称在整个工程中不存在,可能导致整个标签作为文字显示。每张表、每个名称报告一次,归于 (不分语言)。
译文
以下检查需要源语言,遍历每张表的全部 key,包括本次界面扫描未使用的条目。
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 缺译文 | 严重 | 表中有该语言,但没有该 key。 |
| 译文为空 | 警告 | 值为空或只有空白。 |
| 和源文相同 | 警告 | 与源文一致;人名、OK 等可能合理,需人工判断。 |
| 占位标记 | 严重 | 仍含 TODO、###、[NEEDS TRANSLATION] 等标记。 |
| 表缺这种语言 | 严重 | 所选语言没有对应列或文件。 |
| 表缺源语言 | 警告 | 没有源语言列或文件。 |
| 疑似乱码 | 严重 | 发现编码误读特征,如 é、å¼€、锟斤拷、Привет;每张表报告一次。 |
| 疑似转义泄漏 | 警告 | \n、\"、& 比源文出现更多。 |
| 结尾标点不一致 | 警告 | 源文以句号、问号、冒号等结尾,译文改为另一类标点或省略。 |
| 多出的空白 | 警告 | 比源文多出首尾空白或连续空格。 |
| 括号或引号不成对 | 警告 | 源文成对的符号在译文中不成对。 |
| 数字不一致 | 警告 | 数字缺失、改变或增加。若仅缺少 1 到 12 的数字则不报告,因为译文可能将其写为文字。 |
| 译文可能过长 | 提示 | 仅检查未绑定到扫描文字的 key,按字符单位估计是否超过相近源文长度的通常译文范围,并非界面实测。 |
| 同源异译 | 提示 | 同表内长度不少于 16 个单位的相同源文,出现多种译法。 |
没接入本地化的文字:
| 问题 | 严重程度 | 是否计入总览 |
|---|---|---|
| 硬编码 | 警告 | 是 |
| 绑定失效 | 警告 | 是 |
| 未绑定 | 提示 | 否,仅列出 |
| 可能由脚本填写 | 提示 | 否,仅列出 |
仅凭内容匹配到 key 的文字仍视为硬编码,因为没有识别到运行时替换机制。可能由脚本填写 表示脚本字段引用了该文字或其 UIDocument。空文字、New Text 和不含字母的内容不报告。
忽略清单。 key 规则用于排除对应 key 的表值检查,不适用于界面爆框、缺字或整张表的问题。物体路径和文字正则规则用于排除 硬编码、未绑定、可能由脚本填写,以及巡检中的 拼接的文字、运行时写死的文字;不包含 绑定失效。点击问题清单中的 忽略 可添加适用规则。
Play 里的巡检
巡检通过游戏的本地化系统依次切换语言,检查运行中实际显示和排版的文字。插件不直接将译文写入文本组件,也不分析翻译表,因此不做占位符、标签、表值或布局检查。
检查对象。 已加载场景和 DontDestroyOnLoad 中可见的 TextMeshPro、旧版 UI Text:组件及物体、Canvas 必须启用,未被 Canvas Group 完全透明化,也未被 RectMask2D 完全裁去。Unity 6 还包括激活 UIDocument 中显示的元素。
3D TextMeshPro 无论是否位于 Canvas 下,只要渲染器启用,且处于某台已启用、不输出到 Render Texture、可见其所在层的游戏相机视野内,即参与检查。问题框投影到对应相机位置,但不做文字重叠比较。不在 Canvas 下的 UI 文字仍不检查。
语言切换器。 在巡检栏的 切换器 中选择:
- Unity Localization:在 Play 中通过 Localization Settings 切换,并等待显示中的 LocalizeStringEvent 完成字符串加载。
- 自研的系统:在 巡检时切换语言(自研的本地化系统) 中声明两个静态方法。切换方法返回后,插件再按设定帧数等待;方法返回不保证异步界面已更新。
- I2 Localization:安装 I2 后可选。切换时要求 I2 不保存该语言偏好。
巡检结果:
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 文字撑爆 | 严重 | 游戏实际排版结果超出容器。 |
| 文字被截断 | 警告 | 内容被截去一部分。 |
| 文字临界 | 提示 | 检查方向上的剩余空间不足 5%。 |
| 自动字号过小 | 警告 | 判定同扫描。 |
| 文字重叠 | 警告 | 同一根 Canvas 或同一 UI Toolkit 文档中的文字重叠,而本页源语言中未重叠。 |
| 换行犯了禁则 | 警告 | 日文、中文或泰文自动断行违反规则,判定同扫描。 |
| 可能在词中间断行 | 提示 | 泰文字母之间出现未标记的断点,判定同扫描。 |
| 缺字 | 严重 | TMP 使用了缺字符号,或 UI Toolkit 解析出的字体缺少该字符。 |
| 依赖设备字体 | 警告 | 所列字符由 Dynamic OS 字体资产提供。 |
| 由 fallback 字体给出 | 提示 | 字符由其他字体资产提供;仅列出,不画框。 |
这些结果的可信度为 Play Verified(巡检实测),表示读取了当时的游戏排版,并不代表所有设备或页面均已验证。只有 要查的语言 包含源语言时,巡检才会读取本页源文,用于文字重叠和“原文也是”的比较。
检查本页。 点击 检查本页所有语言(F8) 会先启动巡检(如果尚未启动),再逐语言切换、等待 检查本页:每次切换后等待的帧数(默认 120),并在使用 Unity Localization 时继续等待字符串加载。随后检查文字并截图,全部完成后恢复原语言。
使用 F8 前,请先点击插件窗口获得焦点;在 Game 视图中按 F8 无效。检查过程中保持当前页面不变。如果开始时显示的根 Canvas 或 UI Toolkit 文档有一个消失,当前页会被丢弃,巡检结束并显示原因;新增弹窗不视为换页。
结果保留。 已完成页保留至清空结果或关闭编辑器,停止巡检、退出 Play 和脚本域重载不会清除它们。若检查中途停止或退出 Play,仅丢弃尚未完成的当前页,之前完成的结果仍在。
页名。 默认使用最上层根 Canvas 的“场景: Canvas”;若 Canvas 在 DontDestroyOnLoad 中,采用当前场景名。仅有 UI Toolkit 文档时使用第一个文档。建议名称重名时自动加编号,如 Title: MainCanvas (2)。手动输入已保存页名会替换该页,巡检栏会提前提示。
结果入口。 总览按页显示语言矩阵和 打开截图;短横表示未检查,不等于零。问题清单中,同等级巡检问题排在扫描问题后,页 列显示名称。巡检结果不支持 指定 key… 或 Scene 临时预览;忽略 仅适用于两种伪语言问题。
截图。 每种语言保存一张检查帧的 Game 视图;启用 画框 时包含问题框。文件位于 Temp/LocalizationChecker/Patrol,可通过 导出 › 导出截图… 复制到外部目录,每种语言一个文件夹。
伪语言
巡检伪语言必须由游戏的本地化系统提供,使每段本地化文字带有一对括号,例如 [Šţáŕţ]。插件只检查这些标记,不为游戏生成或写入伪译文。拼接两段本地化文字通常会出现两组括号;未经过本地化的文字可能出现在括号外。
检查本页所有语言 会最后切换到伪语言,只检查以下两项:
| 问题 | 严重程度 | 含义 |
|---|---|---|
| 拼接的文字 | 警告 | 同一文本中有两段以上带括号的片段。不同语言语序可能不同,建议改为完整条目,并用占位符替换可变部分。 |
| 运行时写死的文字 | 警告 | 括号外含字母,或整条不带括号且含字母,可能未经过本地化。 |
- 检查前移除标签。括号外仅有数字、标点、空白时不报告,例如比分和时间;占位符值通常位于括号内。
- Unity Localization 使用工程中的第一个 Pseudo-Locale。最后一步必须为加括号的 Encapsulator。如果之前的填充含括号字符,填充之后还需有 Accenter 将其替换,否则插件会跳过伪语言并说明原因。
- I2 和自研系统 需在 ⚙ 设置 › 巡检 › 伪语言 中指定可切换到的伪语言代码及括号,默认
[、]。该代码会从普通语言检查中移除,留到最后检查,请勿使用真实语言代码。 - 总览中显示 伪语言 行,仅在 漏翻译 列计数。不检查该语言的爆框、缺字或重叠,也不收集其 TMP 缺字警告。
- 玩家名、语言自称等有意保持原样的内容也可能报告。可点击 忽略,按物体路径排除;现有巡检页立即应用规则,扫描结果需重新扫描。文字规则匹配的是伪语言下的显示内容。
以巡检为准
同一物体、同一语言有匹配的巡检结果时,部分扫描问题会标为 以巡检为准(巡检的页“…”,… 检查):仅供参考。这些扫描问题仍可查看,但不再计数;应结合对应巡检页判断实际表现。
- 爆框:巡检时 Game 视图尺寸必须与该扫描分辨率完全相同,且显示字符串与扫描测量内容一致。
- 缺字、依赖设备字体、由 fallback 字体给出:仅适用于未截断的 TextMeshPro 文字,且显示内容包含该问题列出的所有字符。
- 不适用的结果:布局、编码、字体配置、翻译表、未本地化文字、旧版 Text 缺字,以及显示字符串与扫描内容不同的爆框结果。单独扫描的 Prefab 文件也不适用,因为游戏中的实例是另一个物体。
如果文字更新晚于采集,页中可能记录上一种语言。请增加等待帧数后重查。点击 清空巡检结果 会移除匹配依据,相关扫描问题恢复计数。
巡检中 TMP 报的缺字
巡检中 TMP 报的缺字(按字体) 收集巡检期间 TMP 在 Console 发出的缺字警告,范围包含所有运行时文字,不限于已检查页,因此也可覆盖玩家名、聊天和服务器文字。TMP Settings 启用 Disable warnings 时无法收集。该清单保留至下一次巡检开始。
命令行(持续集成)
可在构建服务器上扫描 Prefab 文件夹,无需打开插件窗口:
Unity -batchmode -projectPath <project> -executeMethod Fastzhuzhu.LocalizationChecker.Editor.Ugui.CommandLine.Scan -logFile <log>
[-locchkFolder Assets/UI] [-locchkReport <file.csv>] [-locchkJUnit <file.xml>] [-locchkFailOn critical|warning]
- 范围:
-locchkFolder指定文件夹及其全部子文件夹,默认Assets,行为同 文件夹里的 Prefab,不打开场景。 - 设置:读取
ProjectSettings/LocalizationChecker.json。先在窗口中配置,再将该文件提交至版本库。 - 报告:
-locchkReport生成与 导出 CSV… 相同格式的报告;-locchkJUnit生成 JUnit XML,总览每格对应一个测试用例,并报告整次运行的成败。路径相对工程目录,不能位于Assets、Packages或包目录中。 - 日志:包含摘要、注记和结论,例如 不通过:严重及以上的计数问题有 3 个。
- 退出码:
0表示所有 Prefab 文件均已读取,且无达到-locchkFailOn阈值的问题(默认critical);仅供参考的结果不导致失败。2表示存在达到阈值的问题,或部分 Prefab 无法读取。3表示无法完成请求,例如未知或重复参数、报告路径被拒、未选语言、文件夹不在工程内、扫描中止、报告写入失败或意外错误,原因见日志。1为 Unity 自身失败,例如脚本编译错误。 - 请勿添加
-quit。扫描完成后会自行退出编辑器;提前退出会中断需要等待帧的测量。
代码和数据
代码和数据 页签用于查找场景和 Prefab 扫描无法覆盖的可疑字符串,以及受系统区域设置影响的调用。结果可信度为 Low:文本匹配不能证明字符串会显示,也不能证明调用有错。此操作不修改源码或资产,结果不保存到磁盘。
- 代码中的文字。 扫描代码 检查
Assets下参与游戏构建的 C# 文件,排除 Editor 文件夹、编辑器程序集和测试。列出直接赋给text、传给SetText或经string.Format使用的字符串,例如Assets/Scripts/Shop.cs:42中的$"Coins: {coins}"。空字符串、默认New Text、不含字母的内容,以及同行带locchk:ignore注释的内容不列出。单击定位脚本,双击打开对应行。 - 区域设置相关调用。 扫描代码 还单独列出无参数的
ToUpper()、ToLower(),char.ToUpper(c)、char.ToLower(c),未指定IFormatProvider的float、double、decimal的Parse、TryParse,以及单参数Convert.ToSingle、ToDouble、ToDecimal。例如土耳其语环境中i的大写为İ,德语、法语环境对1.5的解析可能不同。key、文件名、存档和设置通常需要ToUpperInvariant、ToLowerInvariant或CultureInfo.InvariantCulture。同名自定义方法也可能列出;同行locchk:ignore可排除。 - 数据中的文字。 扫描数据 按磁盘文本解析 ScriptableObject 的
.asset,不实例化资产或执行其脚本。列出至少两个词,或至少两个中日韩泰等字符的可疑内容,例如Assets/Data/Shop/Gems.asset › m_ItemName。单词、LocalizedString字段和 I2 语言源不列出。二进制资产无法读取,请将 Asset Serialization 设为 Force Text。单击高亮资产,双击选中。
导出
在“列出 N 行”右侧打开 导出 菜单。问题报告遵循当前清单的筛选和顺序。对话框记住上次使用的目录;导出路径不能位于 Assets、Packages 或包目录。
- 导出 HTML…:生成离线 UTF-8 单文件报告,跟随系统深浅色,支持严重程度、检查 × 语言筛选及全文搜索(快捷键 /)。展开问题可并排查看源文和译文。在 Unity 里选中 会复制定位标记;保持插件窗口打开并切回 Unity,即可定位。若物体位于未打开场景,仅高亮场景文件。报告只描述导出的结果,不代表所有检查均已通过。
- 导出 CSV…:将同一清单导出为 UTF-8,包含分辨率、页、检查时间和物体 id。可先点击总览计数或启用 隐藏仅供参考的 缩小范围。为避免表格软件执行公式,单元格开头为
=、+、-、@、Tab 或回车时添加撇号;分号后的同类开头也会处理。 - 导出截图…:复制已保存的巡检截图,每种语言一个文件夹。
- 导出上下文包…:将已完成巡检页的文字与截图关联,供翻译人员或工具了解文字出现的位置和界面尺寸,操作见下文。
- 并排预览中的 导出图…:将预览保存为 PNG。文件名由物体、分辨率和语言组成,非法字符替换为下划线,过长名称截短,重名添加编号,保留每张图。
上下文包
先在 Play 中完成需要的页面巡检,再退出 Play,并保持相关场景打开。打开 导出 › 导出上下文包…,选择工程资产目录之外的目标文件夹。插件会生成 context.json 并复制可用截图;key 从退出 Play 后的已打开场景中关联,因此需要在编辑模式导出。
包内按页、语言和文字分别记录显示内容、截图路径、截图中的边界、物体和元素、可关联的表与 key、字体字号、容器尺寸、换行及容纳状态。文件同时包含 format 和 version,便于工具识别。伪语言和没有显示文字的记录(例如仅有图标的按钮标签)不包含在包中;截图文件已不存在时不会补生成。
怎么读结果
窗口
品牌栏:logo · Localization Checker · 版本号 · 作者署名
工具栏:▶ 扫描 · 需要你做的事 · ⚙ 设置 · 界面语言 · ⋮ 菜单
页签: 总览 · 问题清单 · 代码和数据
设置: 绑定 · 测量 · 忽略清单 · 巡检
底部: 摘要 · 扫描注记 · 提示
总览 顶部为 扫描之前 清单,扫描后改为 这次扫描。各行依次为 翻译来源、要查的语言、源语言、范围、扫描 和 巡检(可选);前五行可直接展开调整设置。序号圆点用绿色表示完成、红色表示阻塞、黄色表示需关注、蓝色表示可开始。下一步操作行以蓝色突出,优先指向第一个阻塞项,否则指向 扫描。
扫描后各行收起为标题。展开并修改设置后,扫描 行提示 结果过期:设置改过,需要重新扫描。Play 中顶部改为 巡检用的语言。⋮ 菜单提供清除扫描结果、清空巡检结果和关于。
严重程度和“仅供参考”
严重程度用于安排处理顺序,不是对实际故障的最终认定:
- 严重:优先核查可能直接影响显示或内容正确性的问题。
- 警告:检查潜在问题、配置风险及设备差异。
- 提示:作为进一步人工检查的线索。
仅供参考 的结果仍列出,但不计入总览矩阵和三档摘要。例如未绑定、可能由脚本填写、fallback 字符、未测量的输入框标签、源文已有且译文未加重的问题,以及标为 以巡检为准 的扫描问题。原因见详情。启用 隐藏仅供参考的 可将它们从当前清单和导出中排除。
可信度
- Play Verified(巡检实测):来自当时运行中游戏的排版结果。
- Engine Verified(引擎实测):由引擎在预览副本上测量。
- Engine Metadata(字体数据):根据字体资产数据判定。
- Static Estimate(伪译文估计):使用插件生成的伪译文测量。
- 未标注:根据文字内容、翻译表或绑定信息判定。
可信度说明证据来源,应结合检查前提和限制解读。
问题清单
默认列为 严重程度、问题、语言、物体 和 详情。不区分语言的结果显示 (不分语言);物体名称后的淡色文字说明位置。存在巡检页时增加 页 列。右键表头可显示 检查、可信度、翻译表、Key、Key 绑定;悬停单元格可查看全文。
单击一行会选中对应物体。右侧详情栏提供 指定 key…、忽略、并排预览 和适用的 打开截图。巡检问题打开的是该页、该语言截图。
详情末尾还可能出现:
- 手动指定过 key,但有组件驱动它:映射没用上:本次采用组件绑定。
- 驱动它的组件被脚本引用:…:运行时代码可能改变内容,建议对该页进行巡检。
和上一次扫描比
新扫描替换旧结果时,总览统计 新出现 和 不再报,点击数字可查看,变化 列也会标注。仅比较范围、语言、分辨率、源语言和检查选项一致的两次扫描。
不再报 可能表示已修复、被忽略,或本次没有测量,需要核对后再认定修复。扫描结果被清除后,比较依据也会消失。
预览、并排预览、热力图
- 预览:选中扫描爆框结果后,Scene 中对应文字临时替换为译文并显示边界。选择其他行或离开窗口后恢复。仅支持已打开、保存过的场景物体。
- 并排预览:对爆框、文字重叠、换行禁则或布局问题,按扫描分辨率渲染整个 Canvas 或 UI Toolkit 文档,每种语言一图,源语言在前;当前文字或布局根节点以红框标出。跟随选中 随清单切换,缩放 调整显示大小,重新渲染 更新图片,导出图… 保存 PNG,导出时带框 控制图片是否包含边界。巡检问题使用已保存截图。
- 热力图:在 Scene 中按物体绘制当前列出的问题。按最高优先问题使用五类颜色:爆框、截断、缺字、占位符和标签、临界或字号过小,并显示编号和图例。仅供参考、未测量、译文检查及字体资产问题不画框。点击框可跳到对应行。
- Hierarchy 里的标记:有计数问题的物体右侧显示彩色方块,取其最高严重程度颜色;悬停查看计数,点击定位结果。仅支持经典 Hierarchy 窗口。