今天我们要聊的是一个挺有意思的实战方向:给 Among Us Revamped 做繁体中文汉化本地化。
不少玩家和开发者在接触 Among Us 的 Revamped 版本时,会发现英文界面用起来还是有点门槛,尤其是给队友报任务、讨论投票结果的时候,英文不熟练很容易误操作。网上关于这个游戏汉化的资料比较零散,大多是直接丢一个成品包,很少有人讲清楚“汉化包到底做了什么”“语言文件长什么样”“为什么有些汉化补丁会乱码或漏字”。
这篇文章我会围绕 Among Us Revamped 繁体中文汉化这个主题,从本地化工程的视角做一次系统拆解。内容包含语言文件结构、中文编码处理、字体替换思路、文本溢出问题、打包与验证流程,以及常见踩坑点。不论你是想自己做一份汉化包,还是想了解游戏本地化的通用流程,这篇都能给你一条完整可执行的路线。
1. 背景与核心概念
1.1 Among Us Revamped 是什么
Among Us 是一款由 Innersloth 开发的多人社交推理游戏,玩家在一艘太空飞船中分成船员和冒充者两个阵营,通过完成任务和投票找出冒充者。Revamped 通常指社区改造版本或增强版本,这类版本在视觉表现、游戏机制、地图细节上做了大量调整,体验上比原版更丰富。
由于游戏原版界面是英文,中文玩家在体验时经常会遇到几个问题:任务描述看不懂、紧急会议里表达不清楚、设置项不知道每个开关是什么意思。因此,一个高质量的繁体中文语言包对中文玩家来说几乎是刚需。
1.2 游戏本地化到底是什么
游戏本地化(Game Localization)不只是“翻译文本”,而是一套完整的工程流程。技术层面至少包括:
- 提取游戏内所有需要翻译的字符串。
- 将英文资源替换为目标语言资源。
- 处理编码格式、字符集和字体支持。
- 调整 UI 布局以适配不同语言文本长度。
- 在目标语言环境下做完整回归测试。
一个好的本地化包,不只是让文字变成中文,还要保证中文在游戏里显示正常、不溢出、不乱码。这背后涉及的字符编码、字体资源、资源打包等知识,才是本地化工程真正的核心。
1.3 为什么选择繁体中文而不是简体
有一部分玩家习惯阅读繁体中文,尤其是在港台地区的玩家社群中,繁体中文的接受度更高。此外,Among Us 的社区模组生态中,不少国际模组默认支持繁体中文而未必支持简体。从制作成本来说,繁体中文与简体中文共享同一套中文字符处理逻辑,做了繁体版本之后,再生成简体版本只需要做一次简繁转换,工程上并不重复。
这篇教程会以繁体中文为目标语言展开,但所有方法对简体中文同样适用。
2. 环境准备与版本说明
2.1 环境要求
本地化工程本身不依赖特定操作系统,但不同平台的文件处理方式略有差异。推荐使用以下环境:
| 工具 | 用途 | 说明 |
|---|---|---|
| Windows 10/11 或 macOS | 宿主操作系统 | 也可使用 Linux,差异不大 |
| Python 3.8+ | 批处理脚本 | 用来做文本转换、文件批处理 |
| VS Code 或 Notepad++ | 文本编辑 | 必须能识别 UTF-8 编码 |
| Beyond Compare 或 Diff 工具 | 文件对比 | 用来对比原版与汉化版差异 |
| 7-Zip | 资源打包 | 处理模组资源文件 |
| 游戏本体(Among Us Revamped) | 测试环境 | 版本需要根据你手中的模组确定 |
这里特别提醒,Among Us Revamped 的版本非常多,不同的 Revamped 版本资源结构可能存在差异。本文的示例以常见资源结构为例,重点演示本地化的思路和处理流程,具体路径需要根据你的实际版本调整。
2.2 目录结构认识
大多数 Among Us 模组版本在安装后会有一个模组目录。以常见的 Among Us 模组安装结构为例:
Among Us/ ├── Among Us.exe ├── BepInEx/ │ ├── config/ │ ├── core/ │ └── plugins/ ├── Among Us_Data/ │ ├── Managed/ │ ├── Resources/ │ └── StreamingAssets/ └── language/其中语言相关文件通常出现在Among Us_Data/StreamingAssets或模组自定义的language目录中。Revamped 版本为了支持多语言,往往会使用 JSON 格式的语言文件,这是一种可读性很强、也容易替换格式。
如果测试时发现路径不一致,建议先打开目录浏览一遍,找到包含语言代码(如 en、zh-TW)或语言名称的 JSON 文件再做后续操作。
3. 核心语法、配置或原理拆解
3.1 JSON 语言文件结构
Among Us Revamped 的语言文件通常是一个 JSON 文件。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用键值对保存字符串内容。一个典型条目如下:
{ "menu": { "play": "Play", "settings": "Settings", "quit": "Quit" }, "task": { "swipe_card": "Swipe Card", "fix_wiring": "Fix Wiring", "download_data": "Download Data" } }这里的"menu"和"task"是命名空间,用来对字符串分组。"play"是键名,表示某个 UI 元素对应的标识,"Play"是它在英文环境下显示的值。
汉化时,你不需要改动键名,只需要改动值:
{ "menu": { "play": "開始遊戲", "settings": "設定", "quit": "退出遊戲" }, "task": { "swipe_card": "刷卡", "fix_wiring": "修復電路", "download_data": "下載資料" } }关键点:键名是游戏代码读取的标识符,绝对不能改;值才是显示在界面上的文本。新手最容易犯的错误就是把键名也翻译了,导致游戏读取不到对应文本,最终界面显示默认英文甚至报错。
3.2 编码问题:UTF-8 与 BOM
编码问题是中文汉化中最常见的坑点。
JSON 文件本身没有强制指定编码,但 Among Us 基于 Unity 引擎开发,Unity 的资源读取默认以 UTF-8 作为首选字符串编码。中文文本必须保存为 UTF-8 编码,否则会出现乱码。
这里有一个容易被忽略的细节:UTF-8 编码的文件可以带 BOM(Byte Order Mark,字节序标记),也可以不带。BOM 是文件开头的一段不可见字符,用来标识文件的编码方式。对于 JSON 文件,绝大多数解析器能同时兼容带 BOM 和不带 BOM 的情况,但有些严格模式的解析器遇到 BOM 会解析失败。
因此,建议:
- 使用 VS Code 或 Notepad++ 编辑语言文件。
- 保存时统一选择“UTF-8”(不带 BOM)。
- 不要用 Windows 自带的记事本直接保存中文文件,因为老版本记事本默认保存为 ANSI 编码,会导致中文乱码。
VS Code 中可以通过右下角的编码按钮切换编码模式:
UTF-8 -> 通过“重新打开”和“保存编码”选项调整3.3 简繁转换的工程化处理
做繁体中文语言包时,你可能已经拿到了一个简体汉化包,或者需要把英文直接翻译成繁体。手动逐条翻译效率极低,而且容易漏项。推荐在 Python 中使用 OpenCC 库完成批量简繁转换。
OpenCC(Open Chinese Convert)是一个开源的中文简繁转换库,支持多种转换标准。安装命令如下:
pip install opencc-python-reimplemented基础用法:
# -*- coding: utf-8 -*- from opencc import OpenCC # 使用台湾标准的繁体转换 cc = OpenCC('s2twp') text = "我们在飞船上完成了刷卡任务" converted = cc.convert(text) print(converted)运行结果:
我們在飛船上完成了刷卡任務's2twp'是 OpenCC 中的一个转换配置,代表“简体到台湾繁体,并转换为台湾常用词汇”。例如“软件”会转换为“軟體”,“鼠标”会转换为“滑鼠”。如果你的目标读者是香港玩家,可以考虑使用's2hk'。
需要注意的是,简繁转换不是简单的字符映射,同一个简体字在不同语境下可能对应不同的繁体字,比如“发”可以对应“發”和“髮”,“后”可以对应“後”和“后”。所以转换之后,对游戏内的关键文本必须做人工审校。
3.4 中文字体支持原理
这一步是整个汉化工程里最容易“翻车”的地方。
英文游戏默认使用的字体通常只包含 ASCII 字符集,也就是英文字母、数字、常见符号,并不包含中文字符。当你把语言文件里的文本替换成中文后,游戏渲染字体时找不到对应的字形,就会出现两种情况:
- 中文文本显示为方框(豆腐块)。
- 中文文本完全不可见。
- 中文文本正常但与其他英文字符混排时高低不一。
原理是:游戏 UI 渲染时,每个字符会查询字体文件中的字形索引。中文字符数以万计,而英文字体文件通常只有几百个字形,庞大数据量的中文字符不可能在英文通用字体里找到对应位置。
因此,汉化包必须附带一个支持中文的字体文件,并在游戏配置或代码中指定该字体。常见的做法有两种:
- 使用开源中文字体,例如思源黑体、思源宋体、Noto Sans CJK。
- 从其他支持中文的 Unity 游戏中提取字体文件,但需要注意许可协议。
本文推荐使用思源黑体(Source Han Sans)或 Noto Sans CJK,这两者本质上是同一款字体系列,开源免费,字形完整,简体繁体都能正确显示,并且屏幕阅读效果较好。
字体文件通常为.ttf或.otf格式。Among Us 的模组资源目录中一般会有一个fonts或resources文件夹,将中文字体文件复制进去并按照模组路径的配置方式替换即可。
4. 完整实战案例
下面我们从零开始,完整演示如何制作一个 Among Us Revamped 繁体中文语言包。
4.1 创建项目结构
首先在工作目录下创建一个本地化工程目录:
among-us-zh-tw/ ├── original/ │ └── language/ │ └── en.json ├── translated/ │ └── language/ │ └── zh-TW.json ├── fonts/ │ └── SourceHanSansTW-Regular.otf ├── scripts/ │ ├── convert_to_traditional.py │ ├── merge_language.py │ └── check_json.py └── output/各目录的用途:
original/保存从游戏模组中提取的原始英文语言文件。translated/保存转换后的繁体中文语言文件。fonts/存放中文字体文件。scripts/存放批处理脚本。output/存放最终打包好的汉化包。
4.2 提取原始语言文件
打开 Among Us Revamped 的安装目录,找到语言文件所在的文件夹。常见位置是:
Among Us_Data/StreamingAssets/language/或
BepInEx/plugins/AmongUsRevamped/language/将原版英文语言文件en.json(文件名可能略有不同)复制到工作目录的original/language/下。
提取后先用文本编辑器打开,确认结构。以常见的任务名称为例:
{ "tasks": { "admin_card": "Admin Card", "align_engine": "Align Engine", "asteroids": "Clear Asteroids", "calibrate": "Calibrate Distributor", "chart": "Chart Course" }, "ui": { "start": "Start", "stop": "Stop", "report": "Report!", "vote": "Vote", "skip": "Skip", "emergencyMeeting": "Emergency Meeting" } }4.3 编写简繁转换脚本
如果已有简体汉化版本,可以直接用 OpenCC 做简繁转换。假设你已经有一份简体语言文件zh-CN.json,内容如下:
{ "tasks": { "admin_card": "管理员卡", "align_engine": "对准引擎", "asteroids": "清除小行星", "calibrate": "校准分配器", "chart": "规划航线" }, "ui": { "start": "开始", "stop": "停止", "report": "报告!", "vote": "投票", "skip": "跳过", "emergencyMeeting": "紧急会议" } }编写转换脚本:
# -*- coding: utf-8 -*- # 文件路径:scripts/convert_to_traditional.py import json import os from opencc import OpenCC def convert_json_file(input_path, output_path, conversion='s2twp'): with open(input_path, 'r', encoding='utf-8') as f: data = json.load(f) cc = OpenCC(conversion) def convert_obj(obj): if isinstance(obj, dict): return {k: convert_obj(v) for k, v in obj.items()} elif isinstance(obj, list): return [convert_obj(item) for item in obj] elif isinstance(obj, str): return cc.convert(obj) else: return obj converted_data = convert_obj(data) # 确保输出目录存在 os.makedirs(os.path.dirname(output_path), exist_ok=True) with open(output_path, 'w', encoding='utf-8') as f: json.dump(converted_data, f, ensure_ascii=False, indent=2) print(f"转换完成:{input_path} -> {output_path}") if __name__ == '__main__': convert_json_file( input_path='translated/language/zh-CN.json', output_path='translated/language/zh-TW.json', conversion='s2twp' )运行命令:
cd among-us-zh-tw python scripts/convert_to_traditional.py运行后检查translated/language/zh-TW.json,内容应该是:
{ "tasks": { "admin_card": "管理員卡", "align_engine": "對準引擎", "asteroids": "清除小行星", "calibrate": "校準分配器", "chart": "規劃航線" }, "ui": { "start": "開始", "stop": "停止", "report": "報告!", "vote": "投票", "skip": "跳過", "emergencyMeeting": "緊急會議" } }4.4 校验 JSON 文件合法性
JSON 文件只要多一个逗号或少一个引号,游戏读取时就会失败,导致汉化不生效或游戏无法启动。一个稳妥的做法是写一个校验脚本,检查所有语言文件是否符合 JSON 格式。
# -*- coding: utf-8 -*- # 文件路径:scripts/check_json.py import json import sys def check_json(file_path): try: with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) print(f"[OK] {file_path} 是合法的 JSON,包含 {len(data)} 个顶层键") return True except json.JSONDecodeError as e: print(f"[FAIL] {file_path} 解析失败:{e}") return False except Exception as e: print(f"[FAIL] {file_path} 读取失败:{e}") return False if __name__ == '__main__': files = [ 'original/language/en.json', 'translated/language/zh-TW.json' ] all_ok = True for f in files: if not check_json(f): all_ok = False sys.exit(0 if all_ok else 1)运行:
python scripts/check_json.py预期输出:
[OK] original/language/en.json 是合法的 JSON,包含 2 个顶层键 [OK] translated/language/zh-TW.json 是合法的 JSON,包含 2 个顶层键4.5 处理字体文件
将下载好的思源黑体繁体版本放入fonts/目录。字体文件名建议修改为不包含空格的格式,例如:
SourceHanSansTW-Regular.otf接下来需要将字体文件放入游戏模组的资源目录。根据模组不同,有几种常见路径:
Among Us_Data/Resources/fonts/ BepInEx/plugins/AmongUsRevamped/assets/fonts/ Among Us_Data/StreamingAssets/fonts/如果你使用的是支持自定义语言的 Revamped 版本,语言配置文件中通常有一个font字段。在zh-TW.json中追加:
{ "meta": { "language": "zh-TW", "name": "繁體中文", "font": "SourceHanSansTW-Regular.otf" }, "tasks": { "admin_card": "管理員卡" } }这里的meta区块是自定义内容,具体字段名需要以你手上的模组实际配置为准。有些模组支持全局字体配置,有些则需要单独修改配置文件。如果模板有文档,优先以文档为准。
4.6 复制文件到游戏目录
将翻译好的zh-TW.json复制到游戏的语言文件夹中:
cp translated/language/zh-TW.json "Among Us/Among Us_Data/StreamingAssets/language/zh-TW.json"将字体文件复制到对应资源文件夹:
cp fonts/SourceHanSansTW-Regular.otf "Among Us/Among Us_Data/Resources/fonts/SourceHanSansTW-Regular.otf"如果你的模组是通过 BepInEx 加载插件的方式运行的,复制路径要相应调整。这一步完成后,启动游戏。
4.7 运行与验证
启动 Among Us Revamped,进入主菜单后打开设置界面,找到语言切换选项,选择“繁體中文”或“zh-TW”。
验证重点:
- 主菜单文字是否全部显示为中文。
- 任务列表中的任务名称是否正常显示。
- 中文是否存在乱码或方框。
- 中英文混排时,行高是否压迫、文字是否重叠。
- 输入中文昵称时是否能正常显示。
如果发现文字显示为方框,说明字体文件没有被正确加载,需要检查字体路径和配置文件中的字体名。
5. 常见问题与排查思路
以下是在 Among Us Revamped 汉化过程中最常见的几类问题,按出现频率排序。
5.1 中文显示为方框
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 中文显示为方框或空白 | 游戏当前使用的字体不支持中文 | 确认字体文件已放入资源目录,并确认字体名称与配置文件一致 |
| 某个菜单页正常,其他页面方框 | 只有部分弹窗使用了自定义字体 | 检查弹窗或特定 UI 的字体绑定配置 |
| 换行后字符消失 | 字体字形缺失 | 更换为更完整的中文字体,推荐 Noto Sans CJK |
5.2 汉化后游戏启动失败
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 启动时黑屏闪退 | 语言 JSON 文件语法错误 | 用校验脚本检查 JSON 合法性 |
| 加载到某个界面时崩溃 | 语言文件中存在空值或类型错误 | 对照原版语言文件结构逐项比对 |
| 字体文件格式不兼容 | 字体文件损坏或版本不支持 | 重新下载字体,确认后缀为 ttf/otf |
5.3 部分文本没有翻译成功
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 大部分是中文,个别英文未翻译 | 原语言文件里存在重复键名,游戏读取优先级不同 | 检查模组是否有多个语言文件同时加载 |
| 新增内容仍为英文 | 模组版本更新后新增了字符串,汉化包未同步 | 将最新 en.json 与汉化文件做 diff,补齐缺失键 |
| 控制台指令 / 弹窗提示没翻译 | 这部分字符串可能硬编码在程序代码中,不在语言文件里 | 需要修改程序资源或接受保留英文 |
5.4 繁体转换结果不准确
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| “里” 转换为 “裡” 或 “裏” 不符合游戏语境 | 简繁一对多导致 OpenCC 判断错误 | 手动修正游戏常用词 |
| 香港与台湾用语习惯不同 | 使用s2twp后会偏向台湾用法 | 面向香港玩家时改用s2hk或人工审校 |
| 人名、地名转换错误 | OpenCC 无法判断专有名词 | 在转换脚本中加入自定义替换表 |
6. 最佳实践与工程建议
6.1 不要修改键名
这是本地化的铁律。键名是游戏代码读取资源的索引,修改后游戏无法匹配到对应文本,轻则汉化不生效,重则引发异常。所有翻译工作只在“值”上进行。
6.2 保留一份可追溯的原版文件
在制作汉化包时,保留一份没有修改过的原版英文语言文件。不要直接在原文件上修改,而是复制一份出来再操作。这样做的原因有两个:一是后续模组版本更新时可以快速用 diff 工具找出新增字符串;二是测试时如果出错,可以随时对照原版确认是不是格式问题。
6.3 对语言文件做版本管理
汉化包不是一次性的工作。Among Us Revamped 每隔一段时间会更新,更新后通常会增加新任务、新地图或新设置项。建议把汉化工程目录放到 Git 仓库中管理,每次更新时提交一次记录,这样能清晰看到每次改动的内容,也方便多人协作。
6.4 使用脚本做自动化检查
人工检查容易遗漏,建议至少做两层自动化检查:
- JSON 语法检查,确保文件可被正确解析。
- 键一致性检查,确保汉化文件里的键名与英文原版完全一致。
下面是一个补充的键一致性检查示例:
# -*- coding: utf-8 -*- # 文件路径:scripts/compare_keys.py import json def flatten_keys(obj, prefix=''): keys = set() if isinstance(obj, dict): for k, v in obj.items(): new_prefix = f"{prefix}.{k}" if prefix else k keys.add(new_prefix) keys.update(flatten_keys(v, new_prefix)) return keys with open('original/language/en.json', 'r', encoding='utf-8') as f: en_data = json.load(f) with open('translated/language/zh-TW.json', 'r', encoding='utf-8') as f: zh_data = json.load(f) en_keys = flatten_keys(en_data) zh_keys = flatten_keys(zh_data) missing_in_zh = en_keys - zh_keys extra_in_zh = zh_keys - en_keys if missing_in_zh: print("以下键在中文文件中缺失:") for k in sorted(missing_in_zh): print(f" {k}") if extra_in_zh: print("以下键在中文文件中多余:") for k in sorted(extra_in_zh): print(f" {k}") if not missing_in_zh and not extra_in_zh: print("键一致性检查通过")6.5 注意字体文件体积
中文字体文件通常比较大,一个完整的思源黑体文件可能达到十几 MB,甚至更大。在打包发布汉化包时,建议对字体文件做裁剪,只保留游戏中用到的字符。可以使用 fonttools 库实现:
pip install fonttools裁剪脚本示例:
# -*- coding: utf-8 -*- # 文件路径:scripts/subset_font.py from fontTools import subset # 指定需要的字符集合 text_file = 'needed_chars.txt' with open(text_file, 'r', encoding='utf-8') as f: text = f.read() # 去除换行和空格 text = text.replace('\n', '').replace(' ', '') options = { 'text': text, 'output_file': 'fonts/SourceHanSansTW-Regular-Subset.otf' } subset.main([ 'fonts/SourceHanSansTW-Regular.otf', f'--text={text}', '--output-file=fonts/SourceHanSansTW-Regular-Subset.otf', '--font-number=0', '--layout-features=*', '--glyph-names', '--symbol-cmap', '--legacy-cmap', '--notdef-glyph', '--notdef-outline', '--recommended-glyphs', '--name-IDs=*', '--name-legacy', '--name-languages=*' ])这里需要先在needed_chars.txt中放入汉化文本中包含的全部字符。如果后续游戏更新添加了新文本,需要重新生成裁剪字体。
实际操作中,很多汉化发布者通常直接使用完整字体文件以避免字符缺失。是否裁剪取决于你的发布渠道和体量要求。
6.6 UI 溢出问题处理
繁体中文文本通常比英文短吗?并不一定。比如英文中的 “Emergency Meeting” 在繁体中文中是“緊急會議”,长度反而更短。但是有一些英文短词翻译成中文后会变长,比如 “Chat” 翻译为“聊天室”,“Kill” 在某些语境下翻译成“擊殺”也不短。
如果游戏 UI 没有做自适应宽度,文本溢出就会成为问题。处理方式有限:
- 调整翻译文本长度,在保证语义的前提下尽量精简。
- 修改游戏 UI 布局文件,但这通常比语言文件的修改复杂得多。
- 接受轻微的文本裁剪,前提是不影响玩家理解。
在汉化包的发布说明中,建议明确列出已知的文本溢出位置,以及建议的显示分辨率。
6.7 版权与合规提醒
制作和发布汉化包时,有几个合规事项需要留意:
- 语言文件本身是游戏数据的一部分,仅用于个人学习研究是常见做法。
- 公开发布汉化包时,不应声称这是官方繁体中文版本。
- 字体文件尽量使用开源许可字体,避免使用来源不明的商业字体。
- 发布时注明模组原版作者和汉化贡献者,遵守社区规则和模组许可协议。
7. 总结与学习路线
这篇教程围绕 Among Us Revamped 繁体中文汉化,覆盖了从语言文件提取、JSON 结构认识、简繁转换、字体处理到游戏内验证的完整流程。核心收获可以归纳为几点:
- 语言文件的本质是键值对集合,键名不能动,只动翻译值。
- JSON 文件必须使用 UTF-8 编码保存,并确保语法合法。
- 中文显示是否正常的关键在于字体资源是否被正确替换。
- 简繁转换要借助 OpenCC 这类工具,但不要迷信工具,专有名词和游戏术语需要人工校验。
- 版本更新后要对语言文件做增量同步,而不是重新汉化整个文件。
如果你之前没有接触过游戏本地化,可以顺着这条路线继续深入:
- 熟悉 JSON 语法和 Python 基础文件读取操作。
- 学习 Unity 游戏资源结构,了解
StreamingAssets、Resources目录的加载机制。 - 掌握字体子集化工具,理解字体渲染的基础原理。
- 关注模组社区,了解 Among Us Revamped 的插件加载方式,例如 BepInEx 的使用。
动手做一次完整的汉化包,比看十篇教程都有效。找一个你熟悉的模组版本,提取语言文件,替换几个词条,再把字体换成中文字体,走完一遍流程后,再回头看这篇里的排查表格,理解会完全不一样。
如果这篇教程对你有帮助,可以收藏备用。也欢迎在评论区分享你在汉化过程中遇到的问题,或者你使用的模组版本和路径结构,方便其他人少走弯路。