Open daiaji opened 3 months ago
恩,引擎选RenPy的话是以前没有正则的时候写的。 现在一般是引擎选TXT,然后预设正则里选RenPy。 不过这个是针对第二行有原始文本的,你这个生成的文件里没有是生成设置不对吗?
恩,引擎选RenPy的话是以前没有正则的时候写的。 现在一般是引擎选TXT,然后预设正则里选RenPy。 不过这个是针对第二行有原始文本的,你这个生成的文件里没有是生成设置不对吗?
SDK是这样“生成翻译“的。 似乎没有其他的选项。 会是版本的问题吗? 还是说用“提取对话“? https://f95zone.to/threads/uni-v0-51-114-hizor-games.15645/ 游戏的话在这里下载。
RMVX也是引擎选择JSON然后选择匹配规则"RMMV_RMVX_System"?
RMVX也是引擎选择JSON然后选择匹配规则"RMMV_RMVX_System"?
不是,RMMV_RMVX_System一般是用于System.json这个单独文件,目的是全部提取。 正常提取Map可以用引擎默认正则,可以排除一些不需要提取的文本。
RenPy这边是单纯的暂时还没支持这种格式的翻译文件?
会是版本的问题吗?
有可能是SDK版本不一样,那之后我重新改下RenPy这个引擎吧,反正之前写的没有正则比较难用。 你的文本都是这种格式对吧,就是句子放在#注释里的。
nathan2.rpy.zip
会是版本的问题吗?
有可能是SDK版本不一样,那之后我重新改下RenPy这个引擎吧,反正之前写的没有正则比较难用。 你的文本都是这种格式对吧,就是句子放在#注释里的。
nathan2.rpy.zip
和压缩包里差不多,文件后部还有些。
# game/fullstartASE/Chaddley McDiggle/nathan2.rpy:5389
old "Quit the bar."
new ""
# game/fullstartASE/Chaddley McDiggle/nathan2.rpy:5389
old "Stay at the bar."
new ""
# game/fullstartASE/Chaddley McDiggle/nathan2.rpy:5663
old "That sounds fun!"
new ""
# game/fullstartASE/Chaddley McDiggle/nathan2.rpy:5663
old "I think I'll pass."
new ""
# game/fullstartASE/Chaddley McDiggle/nathan2.rpy:5950
old "Ask him out."
new ""
# game/fullstartASE/Chaddley McDiggle/nathan2.rpy:5950
old "Keep your thoughts to yourself."
new ""
我在用Ren'Py SDK 8.2.1 https://drive.google.com/file/d/17TzSbSY-OicwHwU__jqy5vNeOeQvwh_C/view?usp=drive_link 全部翻译文件。
更新了RenPy引擎,现在内部直接调用TXT,可以自行修改正则。 只是加了个设置:
extraData=^ ""$|^ .+ ""$|^ new ""$
就是匹配到这些的时候,会先复制上一句文本到这一句(处理#和old之后),再进行提取。
Ok! 提取没报错,我翻译一下,看能不能写入翻译。
大佬我想问下renpy是要拿什么文件作为se提取器的对象,是rpyc的类型文件吗
大佬我想问下renpy是要拿什么文件作为se提取器的对象,是rpyc的类型文件吗
只有rpyc吗?那要解包为rpy,不然就直接用rpy.
# game/fullstartASE/ASEscript.rpy:8
translate chinese start_c3ccac3e:
# centered "This game is a work in progress, because of this you'll encounter a few scenes that are black because they do not yet have CG Scenes made for them. They will be added as development on the game progresses."
居中 "这款游戏还在开发中,因此您会遇到一些黑色场景,因为它们还没有制作 CG 场景。随着游戏开发的进行,它们将被添加。"
# game/fullstartASE/ASEscript.rpy:14
translate chinese start_f09c8f28:
# centered "{b}A year ago, you and your parents were in a terrible car accident while on vacation. Miraculously, you survived - but your parents were not so lucky.{/b}" with dissolve
centered "" with dissolve
这个捕获可能是错的。 把centered也捕获了。 这是居中命令。
这个捕获可能是错的。 把centered也捕获了。 这是居中命令。
现在有正则了可以自行修改,比如加上一行
postSkip=^centered$
# centered "{b}A year ago, you and your parents were in a terrible car accident while on vacation. Miraculously, you survived - but your parents were not so lucky.{/b}" with dissolve
centered "" with dissolve
另一个问题是with dissolve没有被复制,改了一下默认正则:
00_skip=^\s*[#]
01_skip=^\s*(?:translate |old |voice )
10_search=^ (?:new|centered) "(.+)"
11_search=^ "?(?P<name>[^"]+?)"? "(.+)"
20_search=^ "(.+)"
extraData= ""$| ""
取消了所有search的行尾$限定
大佬我想问下renpy是要拿什么文件作为se提取器的对象,是rpyc的类型文件吗
只有rpyc吗?那要解包为rpy,不然就直接用rpy. 我还有个rpy文件,是要先解包里面的东西,再用SE提取器弄解包出来的东西吗
大佬我想问下renpy是要拿什么文件作为se提取器的对象,是rpyc的类型文件吗
只有rpyc吗?那要解包为rpy,不然就直接用rpy.
大佬,我提取成功了,不过文本量好多,这是全部的剧情文字数量吗
这个捕获可能是错的。 把centered也捕获了。 这是居中命令。
现在有正则了可以自行修改,比如加上一行
postSkip=^centered$
人名可能也只会被双引号包裹,这个没有双引号的,多半都是指令。
大佬我想问下renpy是要拿什么文件作为se提取器的对象,是rpyc的类型文件吗
只有rpyc吗?那要解包为rpy,不然就直接用rpy.
大佬,我提取成功了,不过文本量好多,这是全部的剧情文字数量吗
有些提取不出来,你先看看文本对不对吧。
大佬我想问下renpy是要拿什么文件作为se提取器的对象,是rpyc的类型文件吗
只有rpyc吗?那要解包为rpy,不然就直接用rpy.
大佬,我提取成功了,不过文本量好多,这是全部的剧情文字数量吗
有些提取不出来,你先看看文本对不对吧。
我大致把json里面提取的文字在rpy文件匹配查看了下,好像是把对应的日文都拿出来了,我那个renpy游戏剧情回想里面好像本来没有人名显示吧
人名可能也只会被双引号包裹,这个没有双引号的,多半都是指令。
不是,有的游戏人名是变量,虽然不会被修改,但是需要提取出来用于辅助翻译。 比如你这游戏pcname应该就是主角名字吧,不要翻译成中文,但是需要写到name栏。
emm,刚才打开游戏验证了下,发现SE提取器把人名和台词分成两个message提取了,果然要自己写正则吗,早知道就不应该逃课
emm,刚才打开游戏验证了下,发现SE提取器把人名和台词分成两个message提取了,果然要自己写正则吗,早知道就不应该逃课
![]()
倒是无所谓,这只是做词典,到时候直接用替换的,根本没区别。
emm,刚才打开游戏验证了下,发现SE提取器把人名和台词分成两个message提取了,果然要自己写正则吗,早知道就不应该逃课
![]()
倒是无所谓,这只是做词典,到时候直接用替换的,根本没区别。
替换什么,我在想正则要怎么写
emm,刚才打开游戏验证了下,发现SE提取器把人名和台词分成两个message提取了,果然要自己写正则吗,早知道就不应该逃课
![]()
倒是无所谓,这只是做词典,到时候直接用替换的,根本没区别。
替换什么,我在想正则要怎么写
最终字典会把所有的东西都翻译,然后Renpy版本不一样吗?
{
"Uni": "Uni",
"about_title": "",
"save_title": "",
"load_title": "",
"Page {}": "第 {} 页",
"Automatic saves": "自动存档",
"Quick saves": "快速存档",
"{color=#A6956A}{b}[slotNumber]{/b} {#file_time}%B %d %Y, %I:%M %p{/color}": "",
"{color=#A6956A}Empty Slot{/color}": "",
"{color=#93775F}{b}[slotNumber]{/b} {#file_time}%B %d %Y, %I:%M %p{/color}": "",
"The dialogue history is empty.": "对话历史为空。",
"Calibrate": "校准",
"Yes": "是",
"No": "否",
"Skipping": "跳过",
"Self-voicing disabled.": "自动配音已禁用。",
"Clipboard voicing enabled. ": "剪贴板配音已启用。 ",
"Self-voicing enabled. ": "自动配音已启用。 "
}
我这边的字典是这样的…… 所以就没所谓。
emm,刚才打开游戏验证了下,发现SE提取器把人名和台词分成两个message提取了,果然要自己写正则吗,早知道就不应该逃课
![]()
倒是无所谓,这只是做词典,到时候直接用替换的,根本没区别。
替换什么,我在想正则要怎么写
最终字典会把所有的东西都翻译,然后Renpy版本不一样吗?
{ "Uni": "Uni", "about_title": "", "save_title": "", "load_title": "", "Page {}": "第 {} 页", "Automatic saves": "自动存档", "Quick saves": "快速存档", "{color=#A6956A}{b}[slotNumber]{/b} {#file_time}%B %d %Y, %I:%M %p{/color}": "", "{color=#A6956A}Empty Slot{/color}": "", "{color=#93775F}{b}[slotNumber]{/b} {#file_time}%B %d %Y, %I:%M %p{/color}": "", "The dialogue history is empty.": "对话历史为空。", "Calibrate": "校准", "Yes": "是", "No": "否", "Skipping": "跳过", "Self-voicing disabled.": "自动配音已禁用。", "Clipboard voicing enabled. ": "剪贴板配音已启用。 ", "Self-voicing enabled. ": "自动配音已启用。 " }
我这边的字典是这样的…… 所以就没所谓。
抱歉我是没学过renpy就直接打算拿来提取文本翻译,你说的字典是怎么用上去的,我在安装renpy-sdk,这玩意貌似可以直接拿到里面的文字?
https://www.renpy.org/latest.html 下载SDK,然后新开一个工程,再找到那个工程,把你解包好的游戏替换掉那个空的新工程,这样就在SDK生成翻译文件了。 https://www.bilibili.com/read/cv27077168 阿B有教程的。
https://www.renpy.org/latest.html 下载SDK,然后新开一个工程,再找到那个工程,把你解包好的游戏替换掉那个空的新工程,这样就在SDK生成翻译文件了。 https://www.bilibili.com/read/cv27077168 阿B有教程的。
好像没成功,而且我看b站帖子里面的机翻好像是GPT,那我还是自己提取文本用樱花模型翻译吧
生成翻译报错的话,可能SDK版本不对,你试着写正则吧。 毕竟也只是点击生成翻译的事,这都报错就很麻烦了。
@daiaji
好像是这个设置,如果生成不是空字符串应该就不需要用extraData=
@daiaji
好像是这个设置,如果生成不是空字符串应该就不需要用extraData=
无论这个有没有勾选我都试过了,还是失败,老实自己写正则python吧
老游戏可能真的就是兼容性问题,也许只有老版本的SDK能生成翻译。
无论这个有没有勾选我都试过了,还是失败,老实自己写正则python吧
不是,我是说 @daiaji 之前没有文本的问题,他是空字符串""
无论这个有没有勾选我都试过了,还是失败,老实自己写正则python吧
不是,我是说 @daiaji 之前没有文本的问题,他是空字符串""
最开始的那个? 填充文本和填充空字符串也差不多吧……
# "You're in the middle of class when a loud, blaring alarm pierces your ears."
""
你生成的不是为空嘛?应该改下那个设置就行?就不需要extraData了。
# "You're in the middle of class when a loud, blaring alarm pierces your ears." ""
你生成的不是为空嘛?应该改下那个设置就行?就不需要extraData了。
Ok
# "You're in the middle of class when a loud, blaring alarm pierces your ears." ""
你生成的不是为空嘛?应该改下那个设置就行?就不需要extraData了。
对了
main/mainWindow.py的ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid")
能不能换成QT实现?我在Linux下跑,必须删掉这个。
main/mainWindow.py的
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid")
能不能换成QT实现?我在Linux下跑,必须删掉这个。
之前就是QT设置Windows任务栏图标失效才加的这个。刚刚加了一个平台判断,应该没问题了。
main/mainWindow.py的
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid")
能不能换成QT实现?我在Linux下跑,必须删掉这个。之前就是QT设置Windows任务栏图标失效才加的这个。刚刚加了一个平台判断,应该没问题了。
在linux下表现为,QT软件共用一个任务栏TAB.
QT的BUG吗?
截图里就是和AiNiee共用一个TAB
因为pyqt5本身就是用setWindowIcon设置任务栏图标的,有的linux不行可能是发行版GUI不兼容,这个我就不清楚该调用哪个本地代码了。(好像是说的是打包成可执行程序能解决)
[
{
"id": 6,
"atypeId": 2,
"description": "A common armor of chainmail.",
"etypeId": 4,
"traits": [
{
"code": 22,
"dataId": 1,
"value": 0
}
],
"iconIndex": 137,
"name": "Mail",
"note": "",
"params": [
0,
0,
0,
5,
0,
0,
0,
0
],
"price": 0
}
]
这样的结构的话,extractKey=description
就行了吗?
还是说有别的说法?
https://github.com/davide97l/rpgmaker-mv-translator
这边的研究很有用。
基本上阐述了哪些文件的哪些字段是能翻译的。
这样的结构的话,
extractKey=description
就行了吗?
对,这样就行。不过不要用预设的那些正则,因为默认排除掉了英文:[^ -~]
这样的结构的话,
extractKey=description
就行了吗?对,这样就行。不过不要用预设的那些正则,因为默认排除掉了英文:
[^ -~]
正则规则只填extractKey=description
的话好像提取不出东西。
10_search=^<root >(?P<unfinish>[\S\s]+)$
extractKey=description
这样?
P<unfinish>
是内置的规则是是吧?msg和name都行?
有各自的特色?
10_search=^<root >([\S\s]+)$
extractKey=description
确定父节点,最简单的规则就是这样吗?
root
root后为啥会有几个空格啊?啥特殊的语法吗?
实际上RM系的文件都很结构化,就像那个rpgmaker-mv-translator说的一样,如果能先过滤文件名,再过滤键值的话,就能搞定很多问题。 这样添加这些规则到引擎里的设置里会方便很多,也能够更自动化。 Translator++也是做了这些吧。
是为了保持长度和一样,这个是文本所属的元素名。 root是指根节点。 默认还排除了bgm|bgs之类的,一般不用匹配root,只需要处理排除的,然后剩下用<.+?>匹配就行。
Game files containing the data we want to translate are usually contained in the folder data/
.
Among these json files, the ones we are going to translate are the following:
Armors.json
: contains the name and the description of all armors 🛡️. ️Weapons.json
: contains the name and the description of all weapons 🗡️.Items.json
: contains the name and the description of all items 💡.Skills.json
: contains the name and the description of all skills ⚡.Enemies.json
: contains the name of all enemies 👾.MapInfos.json
: contains the name of all maps 🗺️.Classes.json
: contains the name of all classes 🧙.States.json
: contains the name and the relative messages of all states ✨.Actors.json
: contains the profile of all characters 👩.
难说。 说是这些个根节点的键都要翻译。 如果RM系确实如他所言,那么规则里加上文件名过滤会比较好吧,抄作业应该还是容易。 RM的编辑器本身就写死了会读取这些东西吧。 VX应该也是类似。
看了10_search=^(.+?)$
之后的输出我大概懂了。
{
"<root >": "",
"<root >A common armor of chainmail.": "",
"<root >A common cloak.": "",
"<root >A common shield.": "",
"<root >A common hat imbued with some minor magial power.": "",
"<root >An enhanced armor of chainmail.": "",
"<root >Maid uniform.": "",
"<code101>": ""
}
说是这些个根节点的键都要翻译。
我不是说要排除root,是说排除bgm之类的,root就在<.+?>里边了,不需要单独写root
说是这些个根节点的键都要翻译。
我不是说要排除root,是说排除bgm之类的,root就在<.+?>里边了,不需要单独写root
其他的规则在干扰提取吧,RPGMV引擎用_None过一遍还是漏了很多,不如基于文件名用简单规则过一遍,毕竟RM本身也比较结构化。
_None默认规则skip掉了code之外的啊
_None默认规则skip掉了code之外的啊
我直接description、name了,但看着提取的东西,感觉翻完游戏不一定能跑的样子🤦♂️。
_None默认规则skip掉了code之外的啊
- Engine_RPGMV:
type: json
files:
- name: ["Armors.json", "Weapons.json", "Items.json", "Skills.json"]
sample:
- 10_search: ^<root\s+>(.+?)$
- extractKey: [description, name]
- name: ["Enemies.json", "MapInfos.json", "Classes.json"]
sample:
- 10_search: ^<root\s+>(.+?)$
- extractKey: [name]
- name: ["*.json"]
sample:
- 00_skip: ^<.+?>$
- 01_skip: ^<(?!code).+$
- 10_search: ^<code102>([\S\s]+)$
- 15_search: ^<code401>\s?(?P<name>[\S\s]+):$
- 16_search: ^<code401>(?P<unfinish>[\S\s]+)$
- 20_search: ^<.+?>([^ -\[\]-~][\S\s]+)$
- extractKey: [name, description, nickname]
- Engine_RPGVX:
type: json
files:
- name: ["*.json"]
sample:
- 00_skip: ^<.+?>$
- 01_skip: ^<(?!code).+$
- 10_search: ^<code102>([\S\s]+)$
- 15_search: ^<code401>\\C\[\d\]\[(?P<name>.+?)\]\\C\[\d\]$
- 16_search: ^<code401>(?P<unfinish>[\S\s]+)$
- 20_search: ^<.+?>([^ -\[\]-~][\S\s]+)$
- extractKey: [none]
我看能不能让LLM帮我改代码,把规则换成yaml格式,然后用这种写法编写规则,支持过滤文件名,一般来一个游戏说要翻译的文件不会有多个type吧。 文件名支持通配符(可能要支持正则)还是很重要的,不过"*.json"可能需要换成正则的排除,但似乎不是很优雅。 搞好后我再PR吧。
我看能不能让LLM帮我改代码,把规则换成yaml格式,然后用这种写法编写规则,支持过滤文件名,一般来一个游戏说要翻译的文件不会有多个type吧。
其实和自己手动把不同的原始文件放不同的文件夹差不多,只不过你这样改每次只需要操作一次,对同一个游戏的话。(之前我一个游戏是对话和界面UI放到不同文件夹提取的)
主要是需要兼容之前的参数用=
的写法,如果不能兼容的话你先拉取最新的preview分支进行操作吧。(刚刚同步了preview,代码和主分支是完全一样的)
我看能不能让LLM帮我改代码,把规则换成yaml格式,然后用这种写法编写规则,支持过滤文件名,一般来一个游戏说要翻译的文件不会有多个type吧。
其实和自己手动把不同的原始文件放不同的文件夹差不多,只不过你这样改每次只需要操作一次,对同一个游戏的话。(之前我一个游戏是对话和界面UI放到不同文件夹提取的) 主要是需要兼容之前的参数用
=
的写法,如果不能兼容的话你先拉取最新的preview分支进行操作吧。(刚刚同步了preview,代码和主分支是完全一样的)
我让LLM把这个配置翻译成toml,结果都超级丑陋。 ini系不支持嵌套还是没法好起来。 yaml好得多。
逻辑上应该是要多次提取吧。
不过怎么搞,还是有点头疼。
在规则里显式排除["Armors.json", "Weapons.json", "Items.json", "Skills.json"]
这个列表感觉有点逆天。
代码里整个变量存文件名吧,执行最后的*.json
时默认排除这个列表里的文件。
nathan2.rpy.zip 引擎选的RenPy
我减少了样本。
名字提取似乎有问题。
排除非数据行用
r'^ '
比较好吧。 名字用r'^ ".+?"'
会较好吧。