本版本使用 .NET Framework 4.8 编写,支持 RPG Maker MV 和 RPG Maker MZ 的游戏。
2.2.1 以及之前的版本有可能会被杀毒软件误报为病毒,请自行判断是否下载使用。
- 加载 MTools 的翻译文件 (推荐使用插件进行翻译)
- 翻译插件:加载我的翻译插件,并解析json文件,保存到
www/translations.jsonFaster更快的翻译速度,部分菜单可能未被翻译Broader更全面的翻译,速度较慢 (推荐,但在JoiPlay里面可能会出现插件菜单未翻译的情况)Comprehensive翻译最全的 (默认模式)
- 替换翻译:根据json文件,修改
data/*json文件 和js/plugins.js文件- 普通模式,会按白名单翻译
plugins.js和command356command357 - 大范围模式,不在白名单的,且在json中的,直接翻译 (如果运行出错,请使用普通模式;如果想,可以提交Issue)
- 普通模式,会按白名单翻译
- 翻译插件:加载我的翻译插件,并解析json文件,保存到
- 修改字体 (复制系统字体到 www/Fonts,并修改CSS)
- 添加作弊,使用的是 paramonos/RPG-Maker-MV-MZ-Cheat-UI-Plugin 的代码
- 找游戏的宝箱密码
- 自动识别txt文件的编码格式,并转换为 UTF-8
- 直接下载 exe 文件
- 运行 exe 文件
- 选择游戏目录 和/或 翻译文件(json)
- 点击修改按钮
- 等待修改完成
- 找到游戏的
js/plugins.js文件,添加我的插件到插件列表中 (最好添加到第一个) - 将我的js插件复制到
js/plugins文件夹中,并重命名为JtJsonTranslationManager.js - 将json复制到
MV:游戏目录/www/translations.jsonMZ:游戏目录/translations.json
- 一定要删除 json 里面的
//“注释”
{"name":"JtJsonTranslationManager","status":true,"description":"Loads translations.json and applies it.","parameters":{}},“注释” 例子 (被GitHub标红)
{
// 由XXX分享,请尊重劳动成果
"する": "执行",
}- 对于常用的、只加载一次的字段,直接在游戏加载时替换
- 为了方便作弊的使用,也会翻译变量
variablesswitches - 对于地图事件的对话和选项之类的,替换游戏的渲染方法
- 并且将类命名为
TranslationManager,有些插件会调用这个类
RPG Maker 的相关方法:
Window_Message.prototype.startMessage()添加对话Window_Command.prototype.addCommand()添加选项Window_BattleLog.prototype.addText()战斗日志Window_Base.prototype.convertEscapeCharacters()会被很多插件调用
RPG Maker 的相关方法:
Bitmap.prototype.drawText()绘制文本Window_Base.contexts就是Bitmap的实例Window_Base.prototype.drawText()就调用了this.contents.drawText()也就是Bitmap.prototype.drawText()
Bitmap.prototype.measureTextWidth()测量文本宽度 (例如计算选项的宽度)Window_Base.prototype.convertEscapeCharacters()转义字符 (会被Window_Base.prototype.drawTextEx()调用)Window_Base.prototype.drawTextEx()绘制高级文本,是很多插件会调用的方法Window_Base.prototype.convertEscapeCharacters()也会被某些插件调用
总结就是:
- 只要覆盖了
Bitmap.prototype.drawText(),Bitmap.prototype.measureTextWidth()和Window_Base.prototype.convertEscapeCharacters(),大部分的游戏内容和插件都能被翻译- 于此同时,因为覆盖了这么多的方法,提升翻译方法的效率是必要的
- 所以要做的几个重要事情是:
- 将已经翻译过的内容保存到集合中,以避免重复翻译
- 如果遇到字典里没有的内容,由键的长度从长到短依次匹配
- 无论是否找到了,都将“译文”保存到集合中,以避免重复翻译或浪费计算资源
- 将内容拆分成更小的部分进行翻译(使用
\n拆分)
- 又为了方便使用作弊插件,常用的游戏内容(物品、技能、状态、敌人等)都在游戏加载时直接替换
详细内容请查看 RPG Maker MV/MZ 的源码。就在 js/rpg_objects.js, js/rpg_windows.js 和 js/rpg_managers.js 文件中
Comprehensive 模式结合了 Faster 和 Broader 的优点
不能全依靠Broader,有些插件自己创建了新的消息显示窗口,所以我们还是需要Faster的功能
- data/*json 包含了所有的游戏数据
- js/plugins.js 包含了所有的插件配置
只需要翻译 data/*json 文件 和 js/plugins.js 文件即可
需要翻译的字段有:
<Object>.json(Actors.json,Armors.json,Classes.json,Enemies.json,Items.json,MapInfos.json,Skills.json,States.json,Weapons.json)name,description,profileand somenote
events.json(MapXXX.json,CommonEvents.json)- 对话、背景和选项
code:401,102,402,405翻译所有parameters中的字符串 - 插件代码
code:356和357- 使用白名单进行翻译
- 如果值在字典中,直接替换
- 赋值代码
code:122- 只有当
parameters[3] == 4且parameters[4]是简单的字符串'xxxxx'并且 值在字典中,才翻译
- 只有当
- 对话、背景和选项
js/plugins.js- 通过白名单进行翻译
- 如果值在字典中,直接替换
- 如果值为JSON,解析完后,再遍历
当第四个参数为4时,会执行js,返回的值会赋值给对应的变量。
例如下面第一个例子执行后,游戏变量1215 就是 '雫' 主角的名字
{ "code": 122, "indent": 1, "parameters": [1215, 1215, 0, 4, "'雫'"] },被使用的例子:
{
"code": 401,
"indent": 0,
"parameters": ["(選択中のウワサ「\\v[1215]」+「\\v[1239]」)"]
},第二个例子是一个游戏的称号系统,通过选词来实现:
- 先从词库里面选择对应的词
102展示选项 - 然后通过
122赋值,然后将它们组合到一起
{
"code": 102, "indent": 0,
"parameters": [
["した", "になった", "様の", "大好きな", "好きな", "なし"],
-1, -1, 2, 0
]
},
{
"code": 102, "indent": 0,
"parameters": [
["彼女", "嫁", "人妻", "黒髪清楚", "なし"],
-1, -1, 2, 0
]
},假设执行了以下分支,游戏变量1215就是 "雫好きな嫁" ("name": "一ノ瀬 雫")
{ "code": 122, "indent": 1, "parameters": [1239, 1239, 0, 4, "'好きな'"]},
{ "code": 122, "indent": 1, "parameters": [1240, 1240, 0, 4, "'嫁'"] },
{
"code": 122,
"indent": 2,
"parameters": [
1215, 1215, 0, 4,
"$gameParty.lastItem().name + $gameVariables.value(1239) + $gameVariables.value(1240)"
]
},{
"code": 355,
"indent": 1,
"parameters": [
"BattleManager._logWindow.push('addText', 'ミス!悪意の手は空を切った!');"
]
},
{
"code": 355,
"indent": 1,
"parameters": [
"$dataClasses[1].name = '\\\\C[25]裏切りのハンター\\\\i[29]'"
]
},356是MV里面的调用插件的代码,在MZ里面已被弃用- 参数为长度为1的字符串列表
- 参数由
" "空格分隔 - 分隔后的第一个为插件名称
357是MZ里面调用插件的代码- 参数为一个JS列表
- 列表第一个为字符串,且为插件的名称
{
"code": 356,
"indent": 1,
"parameters": ["D_TEXT こんだけ注目集めといてSじゃなかったら・・・ 12"]
}
{
"code": 357,
"indent": 0,
"parameters": [
"DTextPicture",
"dText",
"文字列ピクチャ準備",
{ "text": "ロレンチア\n", "fontSize": "0" }
]
}- 感谢 davide97l/rpgmaker-mv-translator 提供的思路
- 感谢 paramonos/RPG-Maker-MV-MZ-Cheat-UI-Plugin 提供的作弊代码
