Localization Checker 手册(上):各项检查和结果

本页目录
  1. 扫描怎么做
  2. 扫描读什么
  3. UI Toolkit(Unity 6)
  4. 译文从哪来
  5. Unity Localization
  6. 翻译文件
  7. I2 Localization
  8. 文字怎么绑到 key
  9. 各项检查
  10. 爆框
  11. 布局
  12. 文字重叠
  13. 换行禁则
  14. 伪本地化
  15. 变量样本
  16. 缺字
  17. 占位符
  18. 富文本标签
  19. 译文
  20. Play 里的巡检
  21. 伪语言
  22. 以巡检为准
  23. 巡检中 TMP 报的缺字
  24. 命令行(持续集成)
  25. 代码和数据
  26. 导出
  27. 上下文包
  28. 怎么读结果
  29. 窗口
  30. 严重程度和“仅供参考”
  31. 可信度
  32. 问题清单
  33. 和上一次扫描比
  34. 预览、并排预览、热力图

本手册说明扫描范围、翻译来源、各项检查、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(逗号或分号)、TSVUTF-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,且翻译表启用了 文本框里写的是这张表的 keyHigh
文字内容与某条源语言内容相同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、\"、&amp; 比源文出现更多。
结尾标点不一致警告源文以句号、问号、冒号等结尾,译文改为另一类标点或省略。
多出的空白警告比源文多出首尾空白或连续空格。
括号或引号不成对警告源文成对的符号在译文中不成对。
数字不一致警告数字缺失、改变或增加。若仅缺少 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 窗口。