我没有rpgmaker,我也不会用,说的不对请见谅。主要提供思路,代码不保证对。
基本知识介绍:
首先mtool产生的翻译文件用的是json文件,它是日语文本和中文文本的映射。
rpgmaker的事件和别的东西都是在./www/data文件夹里的json文件里面定义,事件一般都定义在map*.json文件夹中,里面就有对话文本。
算法描述:
步骤1:读取翻译文本文件并转为json(字典)类型变量J。
步骤2:遍历整个data,假设data文件夹有x个json文件,以文本方式(不用转json变量)读取json文件为变量Tx。
步骤3:遍历翻译变量J,将文本中的翻译Jkey对应的字符串转为对应的Jvalue字符串。
步骤3(优化版本,只替换对话文本,不易出bug):遍历翻译变量J,将文本中的翻译{"code":401,"indent":数字n,"parameters":["Jkey"]}对应的字符串转为{"code":401,"indent":数字n,"parameters":["Jvalue"]}字符串。
可能遇到的BUG
字符转义(小问题):翻译文件同时存在\n和\\n问题,建议首先将翻译文件的\n转为\\n
文件冲突:存在Jkey与别的资源文件重名文件,比如说把cat.png也进行翻译变成了猫.png而文件夹中依然为cat.png导致无法加载图片文件,这里不建议修改资源文件夹的命名。这个问题退而求其次最稳定的办法就是只翻译对话,json文件中的文本即Tx对话的表示为
{"code":401,"indent":一个数字,"parameters":["一个文本"]}
例如 {"code":401,"indent":2,"parameters":["「\\n[9]!是想跟我說話嗎?"]}
所以将步骤三改为:遍历翻译变量J,将文本中的翻译{"code":401,"indent":数字n,"parameters":["Jkey"]}对应的字符串转为{"code":401,"indent":数字n,"parameters":["Jvalue"]}字符串。
数字n可以不用通配符和正则表达式。一般数字n不会太大,直接写个循环把0-n都试一下,看到哪里不替换了就结束了。
写的代码
变量命名我很随意,和上面讲的不一样。不行就用gpt改一改
import os
import re
# 读取Map.json文件
translation_file = "GPT3.5翻译文件.json"
with open(translation_file, "r", encoding="utf-8") as f:
translation_data = json.load(f)
# 获取dic1字典对象
dic1 = translation_data
sorted_keys = sorted(dic1.keys(), key=len, reverse=True) # 按照键的长度降序排列
data_folder = "data" #设置你自己的到data的路径
for filename in os.listdir(data_folder):
if filename.endswith(".json"):
file_path = os.path.join(data_folder, filename)
print(file_path)
# 读取json文件
with open(file_path, "r", encoding="utf-8") as f:
map_data = f.read()
pattern =r'\{"code":401,"indent":\d+,"parameters":\["(.*?)"\]\}'
matches = re.findall(pattern, map_data)
print(matches)
# 遍历字典,替换json文件中的字符串
for key in sorted_keys:
if '\v' in key: # 如果key中包含 '/' 字符,则跳过
continue
if 'png' in key:
continue
import re
# 从文件中读取文本
for sent in matches:
if key in sent:
value = r"{}".format(dic1[key])
# 使用原始字符串表示方法进行替换
if '\n' in value:
value=value.replace('\n', '\\n')
map_data = map_data.replace(key,value)
break
# 将替换后的数据写回原json文件
with open(file_path, "w", encoding="utf-8") as f:
f.write(map_data)
总结
不一定行,能优化欢迎评论,别让我帮改代码。