浏览器运行环境异常,请检查是否开启本站的JavaScript权限或下载最新版浏览器
Logo
综合
文章
漫画
圈子
帮助
签到
创作
极速下载
资源区
学习区
专栏区
无标题文章
4
反对
11
收藏
分享

AI写的RPG MV翻译插件(PC/安卓JOI)

学习区-技术教程
4
2.9k

文本追踪 (TextTracker v3) 可在游戏过程中逐步捕获所有未翻译的日语文本:
通过假名检测(平假名/片假名)识别日语,只记录未被翻译的文本

匹配优先级: 精确 > 正则 > 部分匹配 > 原文

 * 【幂等性说明】
 * - 单次 translate() 调用只会应用一条规则
 * - 避免 A→B→C 的级联替换现象
 * - 结果更加可预测和稳定

这个插件需要读data目录下的translations.json翻译文件。

json里面的内容格式:

{
    "初めから": "从头开始",
    "つづく": "继续",
    "タイトルへ": "返回标题",
    "取り消し": "撤销",
    "__regex__": [
        ["HPを([0-90-9]+)回復する", "HP回复$1点"],
        ["正则模式1", "替换文本1"],
        ["正则模式2", "替换文本2", "gi"],
        ["([0-9]+)回$", "$1次"],
        ["回", "次"]        注释:这种写法容易出问题,最好在规则中添加其他特征(比如前面带数字,限制范围:使用 \b ^ $ 边界符)
    ]
}
优先级排列原则:
┌────────────────────────────────────┐
│  1. 最具体/最长的模式 ← 高优先级
│  2. 中等具体的模式
│  3. 最通用/最短的模式 ← 低优先级
└────────────────────────────────────┘

对于数据外置版本,需要在data文件夹中建立配置文件translator_config.json。

一般情况下,插件进入游戏后会自动进行翻译。按下F9键开启UI界面,选择启用或者是关闭翻译。

关于翻译字体拦截

接着说下怎么让Claude写出来的插件:
一开始是只知道找变量来进行字符串修改,让AI生成CE的Lua脚本来批量处理Json数据(没啥用)。
后面就是让AI生成JS插件:

1. 提出基本功能描述。
2. 去搜索RPG Maker MV的Library和Database。
3. 复制粘贴一个Classes列表和Database列表给到Claude。
4. 让AI处理这些列表,添加注释和说明,生成一个专业化的速查表文档。
5. 切换到其他AI(例如gemini、grok、gpt),让他们对文档进行事实核查(修正)和二次补充。
6. 将最终批改完成的文档发给AI,再次强调下功能描述(好的模型是不需要反复去强调)、然后它就会自己挑有用的内容来拼凑出翻译插件。
7. 将写出来的代码内容进行事实核查。
8. 反复迭代版本。

---

AI有自作聪明的表现:
- 每个ts文件都写个向后兼容/外部API接口等之类的东西。
虽然合理,不过有点问题(AI不会移除冗余的接口和代码。每次都把注意力分散到接口,浪费Token)
- 喜欢把事情弄复杂,偏好写复杂代码。有时不会抽取通用逻辑,函数之间有重叠功能的代码
- 有些算法和功能都会优先独立实现而不是导入外部依赖包。独立实现还是有好处的:这提高了旧版兼容性

目前我完全是个萌新,因为杀软误封Mtool我才去接触MV和JS知识。

关于版本说明:

v7.0.8 & v7.0.9版本改动:
 * - 新增存档提醒功能:
 *   - 按下F9键时先弹出确认框提醒玩家保存存档
 *   - 支持"下次不再提醒"选项(仅当前游戏会话有效)
 *   - 可通过 TranslatorSaveReminder.reset() 重置提醒设置
 * - 简化F9确认框样式:
 *   - 使用innerHTML一次性创建DOM,减少DOM操作
 *   - 采用事件委托统一处理按钮点击
 *   - 精简CSS样式,提升渲染性能
 * - 性能优化:
 *   - S.isOn() 使用预构建的安全映射表,避免每次遍历
 *   - Bloom Filter 哈希函数内联常量,缓存字符串长度
 *   - 翻译器核心函数缓存数组长度和引用
 *   - U.each() 缓存数组长度减少属性访问
v7.1.0版本改动:
 * - TypeScript 重构,代码模块化
 * - 统一版本号管理,从 package.json 读取
 * - V8 引擎性能优化(保持 ES5 兼容)
 * - Terser 压缩 + Tree-shaking 优化
 v7.1.1 ~ v7.1.3版本改动:
 * - 重构了UI界面,解决v7.1.0的页面渲染问题
 * - 添加了一些默认值后备,重写了JSON配置加载机制
 * - 修复自定义 Hook 动态安装UI显示功能
 * - 修复自定义 Hook 安装状态同步时机问题,参考了v7.0.9版:
 *   - 解决UI显示上"已安装"但实际上没启用Hook的问题
 * - 修复在个别注释中仍然使用硬编码的版本号问题
 v7.1.4 & v7.1.5版本改动:
 * - 在"部分"页面中添加"提取"到正则匹配规则的功能
 * - 移除了配置文件中的keycodes,转为使用panelkeys
 * - 使用工厂函数来统一处理页面样式、选择列表等样式
 * - 修复面板按键误触发问题(再次打开面板时误读之前的按键状态):
 *   - 最难解决:直接让AI分析代码没法解决,要AI先分析每一帧数时序关系、对应的按键事件后,才能去处理代码中的问题。
 * - 解决了插件fs模块报错,在代码使用了node:fs(ESLint 等分析推荐我使用最新node前缀,但实际上MV/MZ不支持),现在改为原本的fs
v7.1.6 v7.1.7版本改动:
 * - 新增"调试"页面,显示控制台信息
 * - 默认开启debugMode,在调试页面中显示
 * - 实现背景半透明 + Tile/Cell-based 重绘架构(干净)
 * - 移除大量硬编码文本,转移至json配置文档
 * - 修改"部分"页面的提取正则方法,改成以原文为基础
 * - 在"正则"页面显示规则命中状态(黄色"[已命中]"标签)
 * - 新增Cuckoo/Bloom过滤智能切换功能
 *   - 默认从 Cuckoo Filter 64KB 起步(只要内存估算不超过限制),适合低配机器玩小作品
 *   - 切换到 Bloom Filter 256KB 的条件只有:**插入失败**、**内存超限**、**负载因子过高
 * - 重构存档提醒对话框,使用RPG MV/MZ原生功能实现(兼容安卓平台)
 * - 修复游戏中弹窗的焦点问题(鼠标点击问题)
 *   - 将save-reminder改写为简单精灵组件、由UI面板来调用
 *   - 交给单一场景和堆栈进行管理
 *   - 使用 window.prompt() 替代复杂的渲染逻辑:简单粗暴,不会有渲染逻辑和时序错误,能准确在渲染报错前提醒你存档
 * - 更换新算法(经过多次核查得出的、发现Bloom的作用有局限,最终决定只拿来检测和去重)
 *   - 精确匹配存储:SwissTable(替代原生 Map)
 *   - 正则匹配搜索:预过滤 + 原生RegExp
 *   - 部分匹配搜索:Aho-Corasick 多模式匹配算法
 *   - 原文预过滤 (bloom):快速判断文本是否可能是原文键
 *   - 译文检测 (transBloom):快速判断文本是否可能是已翻译的译文
 * - 移除旧算法:长度分桶
 * - 完善统计页面的统计信息
---
v7.2.0 版本改动(重要:之后都是核心版本,没有多余功能):
重写项目改为核心版本,因为项目越写越大,功能太多导致维护/认知成本太高。
只保留了跟翻译性能优化有关的算法LRU、Aho-Corasick等。
增强了自定义Hook的配置功能,现在翻译Hook完全依靠JSON进行配置。项目里没有内置硬编码(Window_Base之类的)。
增加了CJK字体安装功能,可以在JSON中配置自定义字体,或者使用默认提供的字体NotoSans-Regular。
v7.0.9版本能够兼容还在使用旧版RPG引擎的游戏。
之后用typescript重构的项目,用了一些现代依赖,比如zod和neverthrow,旧版可能不兼容。
v7.2.1 版本改动:
移除了zod和neverthrow,使用独立实现类似功能。
实现严格错误显式,解析不成功直接alert报错。
v7.2.2 版本改动:
修复globalThis未定义问题,改为window。
新增字段 "__sourceLocale__": "ja" 用于判断未翻译文本
  // 日语:平假名 + 片假名
  if (locale === "ja" || locale === "jp" || locale === "jpn") {
    return /[\u3040-\u309F\u30A0-\u30FF]/;
  }
  // 韩语:谚文(韩文字母)
  if (locale === "ko" || locale === "kor" || locale === "kr") {
    return /[\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F]/;
  }
  // 英语:基本拉丁字母
  if (locale === "en" || locale === "eng" || locale.startsWith("en-")) {
    return /[a-zA-Z]/;
  }
重写UI界面。实现翻译核心与UI界面项目分离。管理两个项目而不是合并为一个大项目。减少排错难度。
v7.2.3 版本改动:修复 `__regex__` 字段没有对flags进行处理的问题。


模型使用:claude-opus-4-5(thinking), gemini-3-pro, etc.

插件下载:

隐藏内容,请登录后查看
已有N位咔友解锁内容查看,积分在本站全免费获取,快来注册吧

下载内容
当前锁定内容可能含有下载内容,请解锁后查看全文
隐藏内容,请登录后查看
已有N位咔友解锁内容查看,积分在本站全免费获取,快来注册吧
4条评论
目前项目进度:暂停
暂停原因:功能足够,并且需要收集问题和错误报告才能进行下一步改善工作
目前不考虑的功能:在线翻译API、MCP协议等(影响实时翻译性能)
问一下手机可以用吗?
ZmRhNj: 理论上可以,用javascript写的可以跨平台使用。
实测不行的话,之后改写下代码做适配就行。
yan6hhdc回复ZmRhNj: 太吊了大佬
感谢佬的用爱发电
大地武神,我们敬爱你口牙!!!!
(#°Д°)你到底了哦
logo
有维咔App就够了
随时随地发现资源,免去网页端烦恼广告
打开App