renpy-renpy对话内容汉化

文章目录

    • 前言
    • 思路
    • 实现
      • 1,提取对话内容
      • 2,汉化对话内容文件
      • 3,修改gui文件,使得renpy游戏支持中文显示

前言

最近下载了一些renpy视觉小说内容,发现对话都为英文,因此我在想能否提取出这些对话然后汉化后再封装回原文件,将其汉化
当然汉化过程是机器翻译,汉化其他语言同理,大概5分钟左右就可以自动机翻完毕,还是挺高效的
最后实现了,流程如下,一起来看看吧

思路

步骤分为如下几步:
1,提取出renpy游戏中的对话内容
2,汉化提取出的对话内容文件,与原文形成一一对应关系,建立一个字典映射关系(根据原文所处的哪个文件,第几行,将汉化的文字内容对原文进行替换,形成新文件覆盖源文件)
3.修改gui.rpy文件,添加对中文显示的支持,因为renpy默认只支持英文显示

实现

1,提取对话内容

下载renpy的sdk文件,https://www.renpy.org/latest.html
将renpy游戏复制到sdk目录下会自动识别,然后
注意,为了保险起见,建议将renpy游戏复制保存一份,拿另一份来进行修改,以便出错时可以及时使用原文件修复
在这里插入图片描述

在这里插入图片描述
如下设置后会在renpy游戏目录生成一个dialog.tab文件,
如果提取出的dialog.tab文件为空,查看game目录下是否是rpa压缩文件,如果有rpa文件,从百度上搜rpa文件解压工具,将其中的rpy文件解压出来放到原目录即可,将解压出来的文件和原本的rpa文件放到同一目录下,重新提取对话文件

2,汉化对话内容文件

使用python,设置好提取出的tab文件路径,执行如下代码,python会提取出tab文件中的对话内容,封装到tab文件同级目录下的aaa.txt文件中

import csv
import os
import threading
import docx
file=r"dialogue.tab文件路径"
fileBase=file+"\\{}"
filetxt="aaa.txt"
realFIle=fileBase.format(filetxt)
tempFileFlag=[]
with open(file, 'r',encoding= "utf8") as file:reader = csv.reader(file, delimiter='\t')header = next(reader)  # read the header row# print(header)  # print the header rowfor row in reader:# print(row)tempFileFlag.append([row[3],row[4],row[2]])
fileNameList=[]
for i in tempFileFlag:fileNameList.append(i[0])
fileNameList=list(set(fileNameList))
print(fileNameList)
def createFIle(path,content):with open(path, 'w',encoding="utf-8") as file:file.write(content)print("文件创建完成")
allTxt=""
for i in tempFileFlag:# print(i[2])allTxt+=i[2]+"\n"
# 所有对话提取完毕
createFIle(realFIle,allTxt)

从上述代码中会得到一个aaa.txt文件,这是游戏中所有的对话内容,接下来我们使用wps打开,然后将其另存为aaa.docx文件
然后将aaa.docx文件拖动到谷歌翻译的文件翻译中,谷歌翻译会自动翻译其中的对话内容,然后给我们反馈出一个新的已经汉化的aaa.docx文件,我们将其命名为aaa2.docx,放置到tab文件同级目录下
接下来,我们需要使用python,为aaa.docx,和aaa2.docx中的内容建立映射关系,然后使用这种映射关系来修改renpy游戏中的rpy文件,将renpy游戏中的英文对话进行汉化
汉化原理是,对renpy游戏总的rpy文件中的英文对话语句进行汉化替换,删除旧有的英文rpy文件,使用汉化的语句进行新建原本的文件
执行如下代码:

import csv
import os
import threading
import docx
file=r"dialogue.tab文件路径"
fileBase=file+"\\{}"
filetxt="aaa.txt"
realFIle=fileBase.format(filetxt)
tempFileFlag=[]
with open(file, 'r',encoding= "utf8") as file:reader = csv.reader(file, delimiter='\t')header = next(reader)  # read the header row# print(header)  # print the header rowfor row in reader:# print(row)tempFileFlag.append([row[3],row[4],row[2]])
fileNameList=[]
for i in tempFileFlag:fileNameList.append(i[0])
fileNameList=list(set(fileNameList))
print(fileNameList)
def createFIle(path,content):with open(path, 'w',encoding="utf-8") as file:file.write(content)print("文件创建完成")
allTxt=""
for i in tempFileFlag:# print(i[2])allTxt+=i[2]+"\n"
# 所有对话提取完毕
# createFIle(realFIle,allTxt)
# 读取文档,完成列表替换,完成文件传输
def deleteFile(path):os.remove(path)print("文件删除完成")
def readdocx():cnTxt = []path = file+"\\aaa2.docx"# 打开文档doc = docx.Document(path)# 读取每个段落的内容for para in doc.paragraphs:# print(para.text)cnTxt.append(para.text)return cnTxt
cnTxt=readdocx()
print(len(cnTxt))
print(len(tempFileFlag))
allLen=len(tempFileFlag)
newTxtFlag=[]
for i in range(allLen):temp=[]temp.append(tempFileFlag[i])temp.append(cnTxt[i])newTxtFlag.append(temp)
newListByFile=[]
for i in fileNameList:temp=[]for j in newTxtFlag:if i==j[0][0]:temp.append(j)newListByFile.append(temp)
#     展示替换效果
for i in newListByFile:print(i)
def changeFile(path,listLine):with open(path, 'r',encoding="utf-8") as file:lines = file.readlines()for i in listLine:textIndex=int(i[0][1])-1lines[textIndex]=lines[textIndex].replace(i[0][2],i[1])print(lines)deleteFile(path)allnewTxt=""for i in lines:allnewTxt+=icreateFIle(path,allnewTxt)print("新文件创建完毕")
testi=[]
for i in newListByFile:filetxt = i[0][0][0].replace("/","\\")testFIle = fileBase.format(filetxt)# print(testFIle)changeFile(testFIle,i)
print("文件更新完毕,程序停止")

当出现文件更新完毕,程序停止时,代表所有的对话文件已经更新完毕

3,修改gui文件,使得renpy游戏支持中文显示

使用simfang.ttf这个支持中文的ttf文件,对renpy游戏中的文件进行展示替换游戏默认的ttf文件
simfang.ttf是windows自带的文件,用于支持中文显示的样式文件,目录在C:\Windows\Fonts
可以直接搜到,找到后复制到renpy游戏的game目录下,和那些rpy,rpyc文件放在一起

打开gui.rpy文件,修改如下行

## The font used for in-game text.
define gui.text_font = "simfang.ttf"## The font used for character names.
define gui.name_text_font = "simfang.ttf"## The font used for out-of-game text.
define gui.interface_text_font = "simfang.ttf"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208451.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark使用详解

wireshark简介 wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。   wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容&#…

自然语言处理 (NLP) 中的组合语义分析

埃弗顿戈梅德(Everton Gomede) 一、介绍 自然语言处理 (NLP) 中的组合语义分析是一个引人入胜且复杂的话题。为了充分理解它,将这个概念分解成它的基本组成部分是至关重要的:组合语义及其在NLP中的应用。组…

Java笔记

md5加密 spring框架我我们提供了一个工具类DigestUtils 调用类中的md5digestAsHes对密码进行加密 但是要将密码转成bytes数组 password DigestUtils.md5DigestAsHex(password.getBytes()); 对象的属性拷贝 BeanUtils.copyProperties(有数据的对象,空对象)&#…

LeetCode算法题解(动态规划)|LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和

一、LeetCode1143. 最长公共子序列 题目链接:1143. 最长公共子序列 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一…

GitHub----使用记录

一、上传文件到仓库 1、首先新建一个github仓库 然后先记住这一句指令 2、下载git工具 https://git-scm.com/downloads 下载工具安装不用运行 3、使用git工具上传文件并推送 找到你想上传的文件的位置,右击git Bush here git init :初始化这个仓…

canvas基础:绘制贝塞尔曲线

canvas实例应用100 专栏提供canvas的基础知识,高级动画,相关应用扩展等信息。 canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。 文章目录 bez…

Xshell连接VMware虚拟机中的CentOS

Xshell连接VMware虚拟机中的CentOShttps://www.cnblogs.com/niuben/p/13157291.html 步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式。(由于只在本机进行连接,所以没有选择桥接模式。当然,桥接模式的配置会…

Python函数的高级用法

Python 的函数是“一等公民”,因此函数本身也是一个对象,函数既可用于赋值,也可用作其他函数的参数,还可作为其他函数的返回值。 使用函数变量 Python 的函数也是一种值:所有函数都是 function 对象,这意…

算法学习系列(三):汉诺塔

目录: 引言一、问题描述二、问题求解三、测试四、附录(所有代码) 引言 这个汉诺塔问题就是一个典型的递归问题,这篇博客也算是上一篇的一个扩展吧,都是递归问题,这个问题太大,而且牵扯到的问题…

第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码)

记第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码) RS type 1 衍射空间像计算傅里叶变换采样条件实际计算计算要求傅立叶变换法计算直接卷积方法计算代码傅立叶变换方法直接卷积https://zhuanlan.zhihu.com/p/624292239 Goodman, J. W. (2004). Intro…

Linux shell中的函数定义、传参和调用

Linux shell中的函数定义、传参和调用: 函数定义语法: [ function ] functionName [()] { } 示例: #!/bin/bash# get limit if [ $# -eq 1 ] && [ $1 -gt 0 ]; thenlimit$1echo -e "\nINFO: input limit is $limit" e…

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

string的模拟

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:能手撕模拟string类 > 毒鸡汤:时间…

强化学习(一)——基本概念及DQN

1 基本概念 智能体 agent ,做动作的主体,(大模型中的AI agent) 环境 environment:与智能体交互的对象 状态 state ;当前所处状态,如围棋棋局 动作 action:执行的动作,…

无脑018——win11部署whisper,语音转文字

1.conda创建环境 conda create -n whisper python3.9 conda activate whisper安装pytorch pip install torch1.8.1cu101 torchvision0.9.1cu101 torchaudio0.8.1 -f https://download.pytorch.org/whl/torch_stable.html安装whisper pip install -U openai-whisper2.准备模型…

代码随想录算法训练营第三十四天|62.不同路径,63. 不同路径 II

62. 不同路径 - 力扣(LeetCode) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#…

分享几个可以免费使用GPT工具

1. 国产可以使用GPT3.5和4.0的网站,每日有免费的使用额度,响应速度,注册时不用使用手机号,等个人信息,注重用户隐私,好评! 一个好用的ChatGPT系统 ,可以免费使用3.5 和 4.0https://…

如何用Java实现扑克牌(附源码)

目录 一.扑克牌的数据结构 二.买牌(扑克牌的初始化) 三.洗牌 四.发牌 五.完整代码 Card.java CardList.java 六.测试 输出结果 一.扑克牌的数据结构 首先,扑克牌是一幅一幅的,除去大小王以外一共有52张,我们可以考虑用数组来存储…

Java高级技术-反射

认识反射、获取类 获取类的方法 获取类的构造器 获取类的构造器、并对其进行操作 获取构造器的作用:依然是初始化对象返回 获取成员变量 获取成员变量的方法 获取成员变量的作用:赋值、取值 获取类的成员方法 方法 作用:依然是执行 作用、…

Docker容器间网络共享

Docker容器间网络共享 1、新建网络2、容器绑定网卡3、验证 Docker环境中为了一套应用部署多个环境、并且不修改配置文件的情况下,做到一键部署。要求不同容器直接的网络交互,使用容器名称。 网络相关常用命令 #查看网络内部信息docker network inspect b…