Skip to content

Hime nochi Honey 汉化

https://www.bilibili.com/read/cv20898536/

翻译teakaDanshi的时候偶然想起来自己之前买了asa project的Hime nochi Honey, 但是没玩通,因为用lunatranslator会不时崩游戏,中途弃了。今天拿krkrExtracter测试了一下,解包出来的文件完全可以用,是非加密的 shift-jis编码脚本。引擎是 krkr 2.

中文保存的时候需要转换编码,不过可以顺利被读取。封包的时候需要用上面的xp3viewer.

这样一来思路就是:

解包获得文本文件 -> 转换编码为 utf-16 le -> 提取游戏文本 -> 机翻 -> 回填 -> 制作封包 -> 测试发布。

工具

引擎是 krkr 2, 使用 xp3viewer 进行解包和打包;创建 patch 文件夹,拖动即可打包为 patch.xp3

正则分析

danshi之后,找到了黑屏的原因,暂时先考虑正则提取,并且翻译一个文件试试看;

json regex

[信太郎]「おい、お兄さん達」

[男]「あぁ?なんだてめぇ…[setQuake t=600 se="殴る:ドゴォ" wq=false]ガァァ!!?」

[??? n=理緒]「うわぁぁあああああ」

[??? n=理緒][big2]「うわぁぁあああああー!!!」
[??? n=理緒]「[f t=とう]藤[f t=ま]間[f t=り]理[f t=お]緒…よろしくな。呼ぶときは苗字じゃなく名前で頼む」

[鶴未]「…(雅、…彼が起こしたという鳳きよらへの暴行事件…[z]

@charaOnL st="鶴未A2制服-怒10"

あれは恐らくデマだ)」

[鶴未]「貴様…それでいいのか?[z]

@charaOnCY st="鶴未A2制服-怒13"

負け犬のままこの学園を去る…確かに簡単だが、[z]

@charaOnCY st="鶴未A2制服-怒26"

同時に『逃げ』だ」

;005.ks

[鶴未]「最後は私が全て丸く収めた。[z]

@charaOnCY st="鶴未A2制服-喜05"

聞いただろ、拍手喝采だった。[z]

@charaOnCY st="鶴未A2制服-喜01"

ある種のショウ…見世物だったと思え」

Note

说话,[name] 「text」; 会有效果提示,[控制语句]

暂时性的名字,会有n=name的语句;字体大小用[big]控制;

特别的,若有单字控制,会包含在「」内部,用[]提示,里面的内容包括[]不能翻译;

一句话不一定只在一行内完成,也可能是分行,为了中途变换立绘。标志是[z], 出现在第一行结尾, 以及所有的非结束对话文本的结尾。

[※]振り向き様に一発。完全に油断していたのか、男達はきょとんとアホ面を並べている。

[※]その隙をご丁寧に待ってやるような義理もない。

[※]鋼の意志を持つ男…それがこの俺、[f t=まき]巻[f t=しん]信[f t=た]太[f t=ろう]郎だ…くくく。

[※][B2]……な、[big2]殴りてぇ…[rf]!

旁白,[※]text, 和对话一样会出现控制符。

^[※](?P[^[].?)(?:[.?])?$

旁白,不匹配标识符。但是会出现[big2]等控制符,规律是,每行的控制符都是第一个[]之后出现的,找一个忽略这些控制符的regex

02_skip=^[@;]
03_skip=^\[[A-za-z].*$
10_search=^\[※\](?P<msg>.+?)$
11_search=^\[(?P<name>.+?)\].*(?P<msg>「.+」\s*)$
12_search=^\[(?P<name>.+?)\].*(?P<unfinish>「.+?)\[z\]$
13_search=^(?P<unfinish>.+?)\[z\]$
25_search=^(.+?)(?<=」|。)\s*$
structure=paragraph

02, 跳过注释,所有@开头的语句 03, 跳过控制语句 10, 匹配旁白,单行,不可避免地会有[]控制符; 11, 匹配单行文本, 一行内有「」\s*针对结尾可能存在的空格,希望004.ks的是个例吧 12,匹配多行文本,并且不分段 13, 匹配单行对话文本,不分段,结尾为[z] 25,匹配对话文本结尾;

默认的分隔符是 \r\n

二次提取

可能用脚本会更加快捷?可能最关键的是,😎不会被翻译为别的什么东西。这样一来就不是使用SE二次提取,而是用脚本自己替换;

引擎:json 分隔符:😎 encode: utf-8 无签名

10_search=([^\[\]]+)$|(?P<unfinish>[^\[\]]+)\[

https://github.com/satan53x/SExtractor/issues/59 , 匹配[]以外的内容到行尾,所有[之前的部分全部作为unfinish分组。

10_search=\[[※]\]|([^\[\]]+)$|(?P<unfinish>[^\[\]]+)\[
会匹配对话文本,不可用

编码策略

解包文件是cp932的编码,先用python转换为utf-16 le, 使用sextracter和sakurallm翻译后再用python批量写入bom;

脚本预处理

先转换为utf-16 le, 方便后续使用sextractor;

一个思路是二次翻译,先用SE提取文本;再用一次SE将[控制语句]的字符删除; https://github.com/satan53x/SExtractor/issues/59

二次提取json文件需要修改json文件的段落分隔符,比如修改为🤣 https://github.com/satan53x/SExtractor/issues/45

关于各种函数的说明(没有说明):https://github.com/satan53x/SExtractor/issues/45

note

70.ks 没东西,不需要补丁; end-all.ks, first.ks 同理; select.ks, 和选择支有关,暂时不翻译;

;s004.ks

[芹]「ま、舞ちゃん……」 
未提取出人名, 似乎是因为结尾是空格而不是

004.ks, 翻译后 1344行混淆;gpt重复翻译某个脚本之前需要确认input文件夹内是否更新文本格式;


原文档的config.ks里有标题的定义语句,修改为“bdd自制汉化”,但是标题界面默认shift-jis格式,于是一字无法显示。

Success

目前已经在2dfan发布汉化补丁! 评论数:0!~~超有成就感的hhh~~

Bug

由于galtransl提供了人名替换表,我尝试替换了 きよら 为中文翻译 清羽 但是问题在于krkr里 控制字符和name挂钩,翻译后会无法识别标志,除非将标志内容一同翻译。这样一来后期最快捷的方式就是直接用正则替换翻译过的人名。

todo

选择支 ~~不想管了~~

应该是在 select.ks 里面控制,实际游玩测试的时候再说吧。