# 40250 简体中文适配 ## 语言包(2026-09-28 起为正式 pack) ```sh cmake --build build-native --target locale_proto_patch eterpack_pack python3 script/build_zh_locale.py ``` 生成器复制 40250 `Eternexus/locale_en/locale/en` 的文件结构到暂存目录 `build/zh-locale/locale-src/zh`,将中文内容按键合入 `locale_game.txt`、`locale_interface.txt`。 旧龙驹语言包缺失或占位符与 40250 不一致的键,改用 `data/zh_40250/locale_game_zh_overlay.txt` 中经审核的译文(同样校验占位符);报告在 `build/zh-locale/zh-locale-report.json`。职业与帝国说明采用龙驹中文文本。 暂存目录随后由 `eterpack_pack`(`extension/tests/eterpack_pack.cpp`,直接调用移植的 40250 `CEterPack::Put` / `EncryptIndexFile`)打成 `locale_zh.eix/.epk`,格式与原版 `locale_en` 等 相同:231 个文件全部为 COMPRESS(LZO),索引经 LZO + TEA 加密。工具写完后以只读方式 重新打开 pack,逐个经 `CEterPack::Get` 读回并与源文件比对。用同一工具重打原版 `locale_en` 源文件,文件名、类型、CRC 和解压内容与原版 pack 逐项一致。 输出客户端 `build/zh-locale/Client`: - `pack/`:原版 pack 逐个符号链接,加上 `locale_zh.eix/.epk`,以及在 `locale/en/` 之前 注册 `locale/zh/` → `locale_zh` 的 `Index`(CRLF,与原版一致)。 - `locale.cfg` 与 `locale_zh.cfg`:`10002 936 zh`。 - 不留散装的 `locale/zh`:客户端默认先查散装文件,留着会绕过 pack。 仓库 `Client/` 是 `audit/assets/40250-client.json` 校验的原版资源,不做修改。 macOS 启动: ```sh build-native/native_render/mt_native_render \ --live-client build/zh-locale/Client --login-screen --width 1024 --height 768 ``` Android:`./push-android-client.sh --locale zh`(默认推送 `build/zh-locale/Client`,符号链接按 目标文件复制,并以 `locale_zh.cfg` 写入设备上的 `locale.cfg`)。 物品与怪物原型从 40250 原版解压,按线上 40250 服务端 `gb2312name` 的 VNUM 快照 只替换 `szLocaleName` 字段后按原格式 重新压缩加密;生成器验证记录数、结构大小、除名称外所有字节不变,以及写出后的 解压往返一致。`itemdesc.txt`、`skilldesc.txt`、`skilltable.txt`、地图坐标、UI 脚本和图像 仍为 40250 原版。龙驹版本的原型不能整份覆盖。 ## 已核对的差异 - 40250 `locale_game.txt` 有 817 个键;771 个来自龙驹,45 个来自审核译文, 仅 `TOOLTIP_UNSEAL_LEFT_TIME` 保留英文原文(原文为空,40250 脚本未使用)。 - 40250 `locale_interface.txt` 的 326 个键均找到中文对应项。 - 40250 客户端物品原型 5,743 条、怪物/NPC 原型 1,334 条都已按 VNUM 写入 `data/zh_40250/` 中的服务端名称快照;快照里分别有 1,608 和 346 个名称不含汉字。 2026-09-28 审核确认的译文放在 `item_names_zh_overlay.txt`(1,607 条)和 `mob_names_zh_overlay.txt`(231 条),构建时覆盖快照同 VNUM 的名称;快照本身保持服务端原样。 剩余英文仅为 vnum 2 占位物品 `YMIR` 和 115 个名称为地图坐标的传送点标记(游戏内不显示)。 客户端显示译名,服务端数据库仍为英文,服务端发出的含名称消息会显示英文。 - 40250 服务端(`192.168.21.203`,2026-09-27 只读 SSH 核对)当前数据库配置为 `LOCALE=newcibn`、`DB_NAME_COLUMN=gb2312name`,有 `newcibn` 语言目录。 因此客户端采用 CP936;服务端广播字典已在 2026-09-28 完成首轮补齐,名称与任务文本仍需核对。 - 文本阶段的 `port_login_flow_test` 使用生成目录通过完整离线登录、进场、移动、战斗、 商店及仓库流程;macOS 原生窗口的登录服务器选择文字已目视确认显示中文。 名称原型加入后,测试运行确认原生客户端已加载中文的物品 19(武士刀+9); 原英文测试中的名称断言及依赖英文布局的仓库点击断言不再适用,完整中文流程待专门验收。 ## 后续验收 1. 物品/怪物译名和界面回退键已在客户端补齐(overlay);是否同步写入服务端 `gb2312name` 需另行核对后决定。`itemdesc`、`skilldesc` 仍需按 40250 键和语义逐项合并。 2. (已完成)46 个英文回退键已补齐。 3. 在游戏窗口验证中文字符、字体、输入法、换行和 UI 宽度,再联机检查登录、背包、 商店、任务、公告及聊天。 4. 中文 pack 已注册到 `pack/Index`(见上);macOS 登录界面已确认从 pack 读取中文, Android 真机/模拟器待测。 ## 服务端适配进度(2026-09-28) 服务端 `newcibn/locale_string.txt` 原有 733 个中文键,和 40250 英文参考字典的 762 个键比对后缺少 36 个。`script/build_zh_server_locale.py` 保留原字典的 733 个键 及其原始 GBK 译文,补齐 36 个 40250 键,并修复两条丢失 `%d` 参数的译文;旧字典 特有的 7 个键继续保留。生成文件有 769 个键,全部译文按 GBK 编码,格式参数与 韩文调用键逐条一致。生成产物在 `build/zh-locale/server/newcibn/locale_string.txt`; `python3 script/test_build_zh_server_locale.py` 验证键和旧译文保持不变。 已将该文件部署到 `/usr/metin2/server/share/locale/newcibn/locale_string.txt`,远端 SHA-256 为 `7f16a8c7b9d08774ec90c4a86b80b17364b072c0af9e2b76a0ea9df027adaef8`。 原文件保存在同目录的 `locale_string.txt.pre-zh-20260928`。在确认没有外部玩家连接后, 仅重启了第 1 频道的三个 `game` 进程和 `game99`,认证及数据库进程未重启;四个 游戏进程和对应监听端口均已恢复。服务端日志中还存在此前就有的 `new_quest_lv52` 缺少 `is_destination_village` 函数错误,本轮没有修改任务脚本。 只读导出的线上数据库中,`item_proto` 有 5,743 条、`mob_proto` 有 1,334 条, `gb2312name` 全部能按 GBK 解码,但分别有 1,608 和 346 个名称不含汉字。 `script/audit_zh_server_names.py` 将线上 VNUM 与旧中文名称表比对,发现物品 1 处、 怪物/NPC 20 处同 VNUM 不同名(例如 VNUM 101 在线上是 `Wild Dog`,旧表是`幼狼`)。 旧表并非完整的 40250 名称表,因此本轮没有批量修改数据库。客户端已改用本次 只读导出的服务端名称快照,见 `data/zh_40250/README.md`,两侧 VNUM 名称由此一致。