YUKI翻译器的简单介绍及使用方法
这篇文章主要是简单地整理了一下官方文档。有些表述可能不太正确,请大家多多包涵。
简介
YUKI是一款Galgame翻译器,使用 GPLv3 许可证开源。
开源仓库的地址。
YUKI 和 VNR 相比有何优缺点?
YUKI 相比 VNR,有如下优点:
基于 Electron->Node->Google V8 的框架链,使得其相比于基于 PyQt->Python 的 VNR 有了巨幅的性能提升
相比功能强大的 VNR,其配置难度可能较低(如果你熟悉一点编程)
基于 Textractor 的文本提取,可以免特殊码支持更多的游戏
当然,作为一个功能迭代时间不算长的项目,YUKI 相比 VNR 有如下的缺点:
缺少很多基于网络数据库的功能,如共享辞书、人工字幕等。这点不急于实现的原因很大程度上在于目前在线翻译 API 逐渐 AI 化,导致替换文字有时反而会降低其翻译质量
缺少 OCR 功能,尚处于摸索阶段
BUG 多,这点没什么好说的
Electron 应用的通病,磁盘和内存占用较大
功能
从正在运行的 Galgame 里即时提取文本
从离线字典中获取翻译,如 J 北京等
从在线翻译 API 中获取翻译,如谷歌、百度、有道等
可编程外部翻译 API (参考 config\ 目录下的 JavaScript 文件)
在游戏窗口上方浮动显示原文+翻译(就像 VNR 一样)
自定义在线 API 翻译获取方式: URL、请求方法、请求报头格式、响应的解析方式等
支持扩展
下载
Assets下的第一个.zip文件就是编译完的版本,下载解压即用。
也可以自己编译使用:
安装好 Node.js 和 yarn 后,随便找个文件夹,运行以下代码:
- git clone https://github.com/project-yuki/YUKI.git
- cd YUKI
- yarn
- yarn dev
使用
下载完解压到文件夹里,打开YUKI.exe即可。
我们可以看到,主界面是这样的:
我们可以通过添加游戏来将本地的Gal加入Gal启动,如图
选择完游戏路径后可以修改显示的游戏名,然后点击下一步添加特殊码
这里没输特殊码也问题不大,之后还能再加。
点击完成,这个游戏就会添加到我的游戏里,点击运行启动游戏,点击删除就是在YUKI删除这个游戏。
如果不是从YUKI启动的Gal,也可以点击从进程启动添加正在运行的Gal来启动翻译器。
接下来是设置,设置里有区域转换器、程序库、翻译器三个部分。
区域转换器
noChanger就是不使用转换器直接运行。
有的游戏需要转区,这里就来个 Locale-Emulator (LE) 的下载地址。
程序库
可用的Mecab的下载地址。
J北京可以直接点右边的下载。
翻译器可以看到这个要自己手动配置,具体看下面的配置文件解析部分。
配置文件
下面都是直接抄的YUKI配置文件详解,基本没改动,看着改配置文件就完事了。
YUKI 的配置文件存放在程序主目录下的 config 子目录下,分为配置普通项的 JSON 文件和用于自定义翻译 API 的 JS 文件。
配置文件的生成与修改
在程序启动时,会检查 config 目录下是否存在配置文件,如果不存在,则会自动创建一个包含全部项默认参数的配置文件。如果存在,则不会对该文件进行覆盖,程序直接读取文件并保存在内存中以供查阅。
根据这种处理配置文件的逻辑,我们可以得出以下几点:
在下载更新版本的 YUKI 后,如果没有说明配置文件存在「破坏性更新」,则可以直接将原来的 config 目录直接复制到新的程序目录下,正常运行即可恢复以前的配置
由于程序中部分功能不检查配置文件中是否存在所需的项,因此尽量不要删除配置文件中的项,有可能会导致程序出错。请尽量只进行项的添加或修改
每次修改配置文件后需要重启 YUKI(此项不适用于自定义翻译 API 的 JS 文件,因为程序具有修改 JS 文件后保存即重新加载的功能,当然以后可能会对 JSON 文件添加同样的功能)
如果某一翻译 API 失效,且最新版本的 YUKI 修复了该 API,则应重新生成默认 config.json 并替换 onlineApis 对象(后面有详解)。
与 JSON 文件格式有关的几个注意事项
由于 YUKI 不验证配置文件的「合法性」(即是否存在违犯 JSON 语法规范的配置文件写法),偏偏 JSON 想要不写错又比较的困难,因此需要特别指出, JSON 语法规定:
不允许存在注释,即不能使用//或/**/
任何非数字和布尔类型的值均为字符串类型,必须使用""(双引号)包括,而非''(单引号)
任何在字符串值中出现的"(双引号)必须使用转义字符\(反斜杠),例如"\""表示仅有一个双引号的字符串。\(反斜杠)自身则需要表示为\\。在后续的配置文件中,我们会发现大量使用转义字符描述的场合。
config.json
config.json 是程序最基本的配置文件,包含一系列跟程序运行有关的配置项和一些无法拆分为单独 JSON 文件的杂项。
默认配置文件(以 v0.14.3 为例,后续可能发生变化)
{
"localeChangers": {
"localeEmulator": {
"name": "Locale Emulator",
"enable": false,
"exec": ""
},
"ntleas": {
"name": "Ntleas",
"enable": false,
"exec": ""
},
"noChanger": {
"name": "No Changer",
"enable": true,
"exec": "%GAME_PATH%"
}
},
"onlineApis": [
{
"enable": true,
"external": true,
"jsFile": "config\\youdaoApi.js",
"name": "有道"
},
{
"enable": false,
"method": "POST",
"name": "谷歌",
"requestBodyFormat": "X{\"q\": %TEXT%, \"sl\": \"ja\", \"tl\": \"zh-CN\"}",
"responseBodyPattern": "Rclass=\"t0\">([^<]*)<",
"url": "https://translate.google.cn/m"
},
{
"enable": false,
"method": "POST",
"name": "彩云",
"requestBodyFormat": "J{\"source\": %TEXT%, \"trans_type\": \"ja2zh\", \"request_id\": \"demo\", \"detect\": \"true\"}",
"requestHeaders": "{\"X-Authorization\": \"token 3975l6lr5pcbvidl6jl2\"}",
"responseBodyPattern": "J%RESPONSE%.target",
"url": "https://api.interpreter.caiyunai.com/v1/translator"
},
{
"enable": true,
"external": true,
"jsFile": "config\\qqApi.js",
"name": "腾讯"
},
{
"enable": false,
"external": true,
"jsFile": "config\\tencentApi.js",
"name": "腾讯云"
},
{
"enable": false,
"external": true,
"jsFile": "config\\azureApi.js",
"name": "Azure"
},
{
"enable": false,
"external": true,
"jsFile": "config\\baiduApi.js",
"name": "百度"
},
{
"enable": false,
"external": true,
"jsFile": "config\\newBaiduApi.js",
"name": "百度开放平台"
}
],
"translators": {
"jBeijing": {
"enable": false,
"path": "",
"dictPath": ""
}
},
"dictionaries": {
"lingoes": {
"enable": false,
"path": ""
}
},
"mecab": {
"enable": false,
"path": ""
},
"librariesRepoUrl": "https://github.com/project-yuki/libraries/raw/master/_pack/",
"language": "zh"
}
新页标签可以查看大图√
.localeChangers
存储区域转换器信息的对象,其中每个 key 代表一个区域转换器的 ID,可以自行取,但是不能重复,value 为包含 name、enable 和 exec 的对象,分别代表区域转换器的名字,是否启用和区域转换器的执行方式。
区域转换器的执行方式
即最终的运行命令。存在一些可能的转义段用以合成该命令。目前仅有%GAME_PATH%,代表目标游戏所在的绝对路径。
以 Locale Emulator 为例,该区域转换器的运行方式即为
注意目录中的\(反斜杠)必须转义,因此为\\。
路径都要用\\隔开就对了。
.onlineApis
在线翻译 API 数组,包含相对简单的,可以通过指定一些参数访问的API和必须要运行 JS 脚本文件才能得到结果的外部 API两种。
name
API 名称。该项的值会显示在翻译器窗口每项结果的左侧。
enable
是否启用。默认为 false。
external
该 API 是否为外部 API。如果该项设置为 true,则必须指定 jsFile,同时其它简单配置项将会失效。默认为 false。
jsFile
脚本文件所在的路径。
url
请求(Request)的 URL 地址。
method
请求的类型,可以为 GET、POST、PUT 等任何 HTTP 标准中支持的类型。一般为 GET 或 POST。
requestBodyFormat
请求体格式。该项比较复杂,说明如下:
字符串的第一个值为 X 或者 J。X 表示作为表单(Form)发送网络请求,J 表示作为 JSON 对象发送网络请求
之后的{}包含的部分为请求体的具体格式。注意,由于解析时使用 JSON 格式,因此每项都需要以""(双引号)包含,而 JSON 字符串中的"(双引号)又必须以\(反斜杠)转义,因此就是目前看到的"{\"key1\": \"value1\", \"key2\": \"value2\"}"样式
转义段目前仅为%TEXT%,表示实际需要翻译的文本
requestHeaders
任何需要手动指定的请求头(Request Headers)都可以在此处指定,格式同样为 JSON。
常见用于指定 User-Agent 或 Referer。
responseBodyPattern
响应(Response)解析格式。说明如下:
字符串的第一个值为 R 或者 J。R 表示将响应作为字符串,并在其中调用正则表达式(Regex)进行翻译文本提取,常见于返回结果为嵌入翻译结果的网页的情况。发送网络请求,J 表示将响应作为 JS 对象,并对其进行后续的解析
如果以正则表达式解析,R 后跟的部分即为正则表达式的语法。如class=\"t0\">([^<]*)<对应 JS 中的/class=\"t0\">([^<]*)</正则表达式。程序将会把该正则表达式运行结果的第一项作为正式的翻译结果返回
如果以 JS 对象解析,J 后跟的部分为实际运行的参数。转义段目前仅为%RESPONSE%,表示实际获取到的响应体 JS 对象。如%RESPONSE%.target,则说明响应体对象下的 target 属性即为所需翻译结果。此处语法与 JS 相同。
.translators
离线翻译器对象。目前仅支持 J 北京(jBeijing属性)。
enable
是否启用 J 北京离线翻译。
path
J 北京所在的目录。
dictPath
J 北京自定义词典所在的目录,在YUKI下载了J北京会自动填上。
.mecab
MeCab 是一个日语分词器,用于将日语文本进行分词并标注词性。经过分词的文本会更加清晰并易于与翻译结果进行对照。
由于实现问题,YUKI 依赖对 MeCab 直接的 DLL 调用。
enable
是否启用 MeCab。
path
MeCab 所在的目录。注意,该目录下应包含 libmecab.dll。
.librariesRepoUrl
模块下载的主域名。目前尚处在实现中,建议保留默认值。
.language
翻译器的显示语言。可选项为简体中文(zh)或英文(en)。
texts.json
texts.json 保存着所有与翻译文本有关的中间件(Middlewares)的配置信息。
中间件的执行顺序为:
Merger -> Interceptor -> Modifier -> Mecab(如果启用的话)-> Filter -> Publish默认配置文件
{
"interceptor": {
"shouldBeIgnore": [
"value",
"sys",
"\u00020",
"windowbtn",
"00_プロローグ1",
"menu",
"WndDisp"
],
"ignoreAsciiOnly": false,
"maxLength": 1000
},
"modifier": {
"removeAscii": false,
"deduplicate": false,
"delineBreak": false
},
"merger": {
"enable": true,
"timeout": 500
}
}
启动
配置完之后就可以启动游戏了。
启动游戏后,YUKI的主界面会最小化并弹出翻译器的窗口
(图片仅供参考)
可以看到默认就已经有了一些钩子。
新开始游戏,切换几次文本,看有哪个钩子能获取到正确的文本,然后点击右边的选择,就会跳转到翻译界面,然后就可以开始玩了。
如果每个钩子都不能获取到文本时那就需要特殊码了。如果添加游戏时没有添加特殊码,可以在文本钩子设置的右上角加载钩子添加。
部分问题
某些翻译 API 经常挂掉?
目前监测下来百度和沪江容易出现此情况,可能跟其限制同一设备日均访问次数/频率有关,建议
文本不要推得太快,给出一定的 API 调用间隔
如果不幸被限制,可以更换其私人 API(如百度开放平台)
禁用该 API,换用其它的 API
如何去除文本中出现的叠字(如变 AAABBBCCC 为 ABC)?
参照 text.json,修改 deduplicate 属性为 true,重启 YUKI 即可。
怎样调整翻译窗口透明度?
翻译器窗口->翻译器设置 中有修改背景色的选项,第二个拖动条就是 Alpha 通道,其值位于 0~1,1 为完全不透明。如果想要全透明效果,记得调整该值为 0。
翻译窗口有一层毛玻璃效果,怎样去除?
修改 gui.json 文件中的 translatorWindow.renderMode 为 transparent,重启 YUKI 即可。
翻译窗口挡住了游戏窗口,不能正常操作,怎么办?
善用“翻译窗口置顶”功能。其位于翻译窗口右上角图案为锁的按钮,点击即可在窗口置顶/窗口不置顶间切换。
一种可能的操作方案:
点击按钮,切换为窗口不置顶模式
点击游戏窗口。此时游戏窗口显示在翻译窗口上方
操作游戏窗口
在进入对话阶段后,点击翻译窗口。此时翻译窗口显示在游戏窗口上方
点击按钮,切换为窗口置顶模式
点击游戏窗口,推进文本,查看翻译
详细的问题可见YUKI常见问题。
补充
YUKI目前自带的texteactor应该还是只有32位的,遇到64位的游戏可能不大行。
解决方法:到Textractor的仓库下载最新版的Textractor,Zip-Version的那个zip压缩包就行,里面带有32位的和64位的版本,YUKI的texteactor路径在根目录下的 /lib/textractor 里,对应那两个文件替换就行了。
再具体的就参考官方文档或者自己摸索吧,这里我就先溜了。