rpg有机翻文件,不用mtool对游戏进行翻译,要编程-游戏讨论次元阁-乱七八糟-魔王萌次元

rpg有机翻文件,不用mtool对游戏进行翻译,要编程

我没有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)

 

总结

不一定行,能优化欢迎评论,别让我帮改代码。

 

请登录后发表评论

    • Peropopo的头像-魔王萌次元Peropopo等级-LV10-魔王萌次元作者0