今日速览

  • 本地化 ≠ 翻译:先把「要翻的东西」从代码里抽出来(key 化),再谈翻成几种语言,Godot 官方推荐用 CSV 表格驱动整个流程。
  • CSV 翻译表格式固定:第一列是 KEY(惯例全大写、大小写敏感),其余每列一种语言,列名必须是合法 locale(en / ja / zh / es…)。
  • 两个致命坑:CSV 必须是 UTF-8 无 BOM(Excel 默认 ANSI 会乱码);含逗号/换行/引号的文本要用双引号包裹、内部引号翻倍转义。
  • 翻译要「注册」才生效:CSV 导入后,还要在 Project > Project Settings > Localization > Translations 里把它加进项目。
  • 中文/日文等 CJK 文本默认字体显示成「方块字 □□」,要靠 DynamicFont fallback 字体链解决,而图片/音频资源可走 Remaps 按语言替换。

核心学习内容

1. 为什么用 CSV:Godot 的官方「多语言工作流」

Godot 文档直言:即便今天工具五花八门,游戏本地化最常见的方式依然是电子表格——策划、翻译、校对都看得懂。流程是:代码里所有用户可见文本 → 抽成 KEY → CSV 一列一个语言 → Godot 导入成压缩翻译资源 → 运行时 tr("KEY") 自动替换成当前语言文本。KEY 用大写加下划线(如 MENU_START、ITEM_POTION_DESC),好处是重命名文案不用改代码,翻译没到位时玩家看到 KEY 也比看到裸英文好排查。

CSV 表长这样(左上角格子忽略):

keys,en,zh,ja
MENU_START,Start,开始,スタート
DIALOG_GREET,"Hello, friend!","你好,朋友!",こんにちは

注意 "Hello, friend!" 必须加引号,因为里面含逗号;文本里若有引号则写成两个引号转义。

2. 代码侧:tr()、自动翻译与语言切换

  • 场景里 Label / Button 等 Control 节点的文本默认自动翻译,编辑器里直接写中文,运行时按玩家语言替换——前提是这段文本在翻译表里有对应 key 或原文匹配。
  • GDScript 里拼接动态文案用 tr("KEY");Godot 4.6+ 还支持复数 tr_n()(?plural 列)和同词不同义(?context 列),但用这两者时必须手动 tr(),自动翻译不生效。
  • 语言选择:启动时用 OS.get_locale_language() 读取系统语言;没翻译的语言会回落到 Project Settings 里的 Locale Fallback(默认 en)。务必在设置菜单里提供手动切换语言的选项——Steam 玩家语言偏好五花八门,自动判断不一定对。
  • 切换语言就一行:TranslationServer.set_locale("ja"),所有 tr() 立即刷新。UI 上已显示的文本需要刷新节点(重新 set text 或重开场景)。

3. 中文字体与素材的「本地化配套」

这是中文开发者最常踩的坑:Godot 默认字体没有 CJK 字形,游戏里出现中文/日文就是方块。解法是给字体做 fallback 链:主字体 + 回退字体(如 Noto Sans SC/JA 的 ttf/otf),中文日文韩文都能显示。注意 Remaps 资源替换不支持 DynamicFont,字体必须走 fallback 系统——好处是它不依赖当前语言,多人聊天里玩家各说各话也能正常显示。另外,游戏内的招牌图、剧情插画等「嵌字素材」用 Remaps 按 locale 换图,避免每种语言一套代码。

4. Steam 侧的本地化配套

本地化不只是游戏内文本:Steam 商店页支持语言、游戏内语言都要在 Steamworks 后台声明;商店页本身(描述、截图文案)也建议随游戏语言一起翻译。先把游戏内文本管线搭好,商店文案交给同一套 DeepSeek 工作流,事半功倍。

🎯 DeepSeek 提示词

提示词 1:生成 Godot 翻译表骨架(中文文案 → 多语言 CSV)

你是一名游戏本地化工程师。我将给你一批游戏 UI 中文文案(JSON 格式,value 为中文原文),请:
1. 为每条文本生成全大写加下划线的 KEY(如“开始游戏”→MENU_START_GAME),语义清晰、不重复;
2. 输出一份 Godot 4 可直接导入的 CSV 翻译表,列为:keys,zh,en,ja;
3. 中文列保留原文,英文和日文列给出地道翻译(不要机翻腔,日文注意口语/敬语与字符宽度);
4. 含逗号、换行、双引号的单元格必须用英文双引号包裹,内部双引号写成两个;
5. 只输出 CSV 正文,不要解释。
文案如下:{"start_game":"开始游戏","settings":"设置","confirm_quit":"确定要退出游戏吗?"}

适用场景:一次性给 DeepSeek 几十条中文文案,秒出可导入的三语翻译表。注意把生成结果存成 UTF-8 无 BOM 文件再拖进 Godot(VSCode 右下角可切换编码)。

提示词 2:上下文感知翻译 + 术语一致性(CSV 扩充语言)

你是游戏本地化审校。下面是一份 Godot CSV 翻译表,目前只有 zh 列翻译完整。请:
1. 只补全 en、ja 两列,不要改动 keys 列和 zh 列;
2. 严格遵守术语表:主角名=“凛/Rin”,物品“灵力”统一译为“Spirit/霊力”,不得换词;
3. 保留所有占位符与格式符(%s、%d、\n、{0})位置不变,数量不变;
4. 保持角色语气:少女冒险者,活泼但不说脏话;
5. 直接输出完整 CSV,列顺序 keys,zh,en,ja,其余说明不要输出。
CSV:keys,zh,en,ja
ITEM_SPIRIT,灵力,, 
HINT_NEED,需要 %d 点灵力才能开门,,

适用场景:后续加语言、补翻译,或找 DeepSeek 当校对。把「术语表 + 语气」写进提示词,能明显减少前后翻译不一致。

提示词 3:写「语言设置 + 字体 fallback」的 Godot Autoload 代码

你是资深 Godot 4 开发者。请为我的 2D 游戏写一个语言管理单例(Autoload,命名 LanguageManager),要求:
1. 用 GDScript 实现;提供 set_language(locale: String) 与 get_language(),内部调用 TranslationServer.set_locale() 并把选择保存到 user://settings.cfg;
2. 启动时 _ready() 里:若存档无语言设置,则用 OS.get_locale_language() 自动检测,并判断该语言是否在 SUPPORTED_LOCALES = ["zh","en","ja"] 中,不在则回落到 "en";
3. 切换语言后发出 signal language_changed,供设置界面刷新所有文本;
4. 另写一段设置中文回退字体的说明:用 Theme 的 fallback 配置加载 Noto Sans CJK,并指出常见报错(字体缺失导致方块字)的排查点;
5. 代码加中文注释,输出可直接粘贴的文件内容,先说明需要创建哪些文件。

适用场景:一条提示词让 DeepSeek 把「自动检测语言 + 手动切换 + 存档 + 信号刷新 + 防方块字」整套一次性写好,比自己翻文档拼代码快得多。

学习心得

做 Steam 游戏的人常犯一个错:先把游戏做完再想本地化,结果几百条硬编码中文散落在代码和场景里,返工成本巨大。正确姿势是第一天就养成「所有文本走 key/tr()」的习惯,翻译表跟着开发一起长。对我们这种「DeepSeek 单人工作室」来说,本地化是 AI 杠杆最大的环节之一:DeepSeek 一个人就能当翻译、审校、术语管理员,把中文本地化游戏铺向日韩欧美的边际成本几乎为零——而 Steam 上多一种语言,就多打开一整个地区的销量。

明日关注

  • 把当前 Demo 里的硬编码 UI 文本抽成 key + zh/en CSV,跑通「导入→注册→tr()」全流程
  • 给项目配一套 Noto Sans CJK fallback 字体,确认中日韩文本无方块字
  • 调研 Steamworks 后台「支持语言」声明与商店页多语言文案的提交流程,规划首批上线语言(建议 zh + en + ja)

本文由自动化学习流水线每日生成,坚持即学即记。