diff --git a/README.md b/README.md index 2ed815e..acf0ae8 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ ## 文档 - [YUKI 配置文件详解](/docs/ConfigFiles_CN.md) +- [YUKI 常见问题](/docs/FAQ_CN.md) ## 挖坑的动力 diff --git a/config/config.json b/config/config.json index 6067d57..8cbe682 100644 --- a/config/config.json +++ b/config/config.json @@ -1,4 +1,12 @@ { + "dictionaries": { + "lingoes": { + "enable": true, + "path": "C:\\YUKI\\libraries\\dict\\lingoes\\njcd.db" + } + }, + "language": "zh", + "librariesRepoUrl": "https://github.com/project-yuki/libraries/raw/master/_pack/", "localeChangers": { "alphaROMdiE": { "enable": false, @@ -21,6 +29,10 @@ "name": "Ntleas" } }, + "mecab": { + "enable": true, + "path": "C:\\YUKI\\libraries\\pos\\mecab-ipadic" + }, "onlineApis": [ { "enable": true, @@ -64,17 +76,5 @@ "enable": true, "path": "C:\\JBeijing7" } - }, - "dictionaries": { - "lingoes": { - "enable": true, - "path": "C:\\YUKI\\libraries\\dict\\lingoes\\njcd.db" - } - }, - "mecab": { - "enable": true, - "path": "C:\\YUKI\\libraries\\pos\\mecab-ipadic" - }, - "librariesRepoUrl": "https://github.com/project-yuki/libraries/raw/master/_pack/", - "language": "zh" + } } diff --git a/docs/FAQ_CN.md b/docs/FAQ_CN.md new file mode 100644 index 0000000..935a1e2 --- /dev/null +++ b/docs/FAQ_CN.md @@ -0,0 +1,105 @@ +# YUKI 常见问题(Frequently Asked Questions) + +## 综合篇 + +### YUKI 和 VNR 相比有何优缺点? + +YUKI 相比 VNR,有如下优点: + +1. 基于 Electron->Node->Google V8 的框架链,使得其相比于基于 PyQt->Python 的 VNR 有了**巨幅**的性能提升 +2. 相比功能强大的 VNR,其配置难度**可能**较低(如果你熟悉一点编程) +3. 基于 Textractor 的文本提取,可以免特殊码支持更多的游戏 + +当然,作为一个功能迭代时间不算长的项目,YUKI 相比 VNR 有如下的缺点: + +1. 缺少很多基于网络数据库的功能,如共享辞书、人工字幕等。这点不急于实现的原因很大程度上在于目前在线翻译 API 逐渐 AI 化,导致替换文字有时反而会降低其翻译质量 +2. 缺少 OCR 功能,尚处于摸索阶段 +3. BUG 多,这点没什么好说的 +4. Electron 应用的通病,磁盘和内存占用较大 + +### 为何这么多功能设置都需要手动修改配置文件? + +因为设计 UI 比实现功能难多了(确信) + +### 为何修改配置文件后需要重启 YUKI? + +由于架构设计问题,目前很多配置仅在程序启动时进行加载并参与模块构建,此后该模块在程序运行期间一直驻留内存,无法进行热替换,因此必须重启以重新加载模块。 + +这也是上一个问题的另一部分原因。 + +~~然而改架构又太费时间,说到底还是一条懒狗。~~ + +### 为何那么多功能计划拖了这么久还不实现? + +作者目前留学中,更新频率相比以往会有很大程度的下降。 + +当然,作为一个开源项目,肯定是希望有更多人参与项目讨论与开发的。把功能计划放出来的目的就是期待有开发者能够一同完成/改进。 + +## 使用篇 + +### 如何开启/关闭某一翻译 API? + +请参照 [config.json 配置详解](/docs/ConfigFiles_CN.md#configjson),修改各个 onlineApi 的 enable 属性为 true/false,重启 YUKI 即可。 + +### 某些翻译 API 经常挂掉? + +目前监测下来百度和沪江容易出现此情况,可能跟其限制同一设备日均访问次数/频率有关,建议 + +- 文本不要推得太快,给出一定的 API 调用间隔 +- 如果不幸被限制,可以更换其私人 API(如百度开放平台) +- 禁用该 API,换用其它的 API + +### 如何去除文本中出现的叠字(如变 AAABBBCCC 为 ABC)? + +请参照 [text.json 配置详解](/docs/ConfigFiles_CN.md#textsjson),修改 deduplicate 属性为 true,重启 YUKI 即可。 + +### 怎样调整翻译窗口透明度? + +翻译器窗口->翻译器设置 中有修改背景色的选项,第二个拖动条就是 Alpha 通道,其值位于 0~1,1 为完全不透明。如果想要全透明效果,记得调整该值为 0。 + +### 翻译窗口有一层毛玻璃效果,怎样去除? + +修改 gui.json 文件中的 translatorWindow.renderMode 为 transparent,重启 YUKI 即可。 + +### 我要快进一段剧情,怎样不让 YUKI 翻译快进部分的文本? + +使用“暂停文本获取”功能。 + +1. 点击翻译窗口右上角的暂停按钮 +2. 快进到想要的位置 +3. 点击翻译窗口右上角的播放按钮 + +### 翻译窗口挡住了游戏窗口,不能正常操作,怎么办? + +善用“翻译窗口置顶”功能。其位于翻译窗口右上角图案为锁的按钮,点击即可在窗口置顶/窗口不置顶间切换。 + +一种可能的操作方案: + +1. 点击按钮,切换为窗口不置顶模式 +2. 点击游戏窗口。此时游戏窗口显示在翻译窗口上方 +3. 操作游戏窗口 +4. 在进入对话阶段后,点击翻译窗口。此时翻译窗口显示在游戏窗口上方 +5. 点击按钮,切换为窗口置顶模式 +6. 点击游戏窗口,推进文本,查看翻译 + +### 我想要...功能! + +请先查阅[YUKI 配置文件详解](https://github.com/project-yuki/YUKI/blob/master/docs/ConfigFiles_CN.md),看看想要的功能是否已经存在,如果是,则按照对应要求修改配置文件以开启该功能。 + +## 进阶篇 + +### config 文件夹下的那些 .js 文件是什么? + +外部 API(External API),一种可编程式翻译 API,可以供 YUKI 在翻译文本时调用。 + +为什么要有这样的设计? + +一部分原因在于基于配置的 API(也称为内部 API)很难计算出一些翻译 API 要求的 sign 或 timestamp,而这些值对于其 API 正常工作来说是必要的,因此可以在外部 API 中编写一些函数用以生成此类参数。 + +另一部分原因在于这种设计可以将 API 与翻译器本身解耦,以防止像目前的 VNR 一样出现停止维护后翻译 API 需要修改源代码才能进行更新/修复的情况,以最大程度延长未来 YUKI **可能的**停止维护后的可用时间。 + +### 我自己编写了一个可以使用的外部 API,怎样提供给他人使用? + +由于外部 API 文件独立于主程序之外,可以直接将分发出去,他人设置好 config.json 中对应的属性,即可正常使用。 + +当然,如果想要合并进 YUKI 以供更多人使用交流,欢迎提交 Pull Request :) diff --git a/package.json b/package.json index 36ca6ff..be6898d 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,9 @@ "lib/**/*", "config/youdaoApi.js", "config/baiduApi.js", - "config/qqApi.js" + "config/qqApi.js", + "config/newBaiduApi.js", + "config/azureApi.js" ], "win": { "icon": "build/icons/icon.png" diff --git a/src/main/DownloaderFactory.ts b/src/main/DownloaderFactory.ts index af4142d..c0cf572 100644 --- a/src/main/DownloaderFactory.ts +++ b/src/main/DownloaderFactory.ts @@ -28,6 +28,7 @@ export default class DownloaderFactory { ipcMain.emit(IpcTypes.HAS_DOWNLOAD_PROGRESS, packName, state) }).onError((err) => { debug('yuki:downloader:library')('[%s] download error !> %s', packName, err) + ipcMain.emit(IpcTypes.HAS_DOWNLOAD_COMPLETE, packName, err.toString()) }).onEnd(() => { debug('yuki:downloader:library')('[%s] download complete', packName) extract( diff --git a/src/main/Processes.ts b/src/main/Processes.ts index 99e3a4e..224e491 100644 --- a/src/main/Processes.ts +++ b/src/main/Processes.ts @@ -4,7 +4,7 @@ const debug = require('debug')('yuki:processes') export default class Processes { public static async get () { return new Promise((resolve, reject) => { - exec(Processes.TASK_LIST_COMMAND, + exec(`${Processes.CHCP_COMMAND} & ${Processes.TASK_LIST_COMMAND}`, (err, stdout, stderr) => { if (err) { debug('exec failed !> %s', err) @@ -24,10 +24,11 @@ export default class Processes { ) }) } + private static CHCP_COMMAND = 'chcp 65001' private static TASK_LIST_COMMAND = 'tasklist /nh /fo csv /fi "sessionname eq Console"' private static findsProcessIn (value: string) { - return value.startsWith('"') + return value.indexOf('"') !== -1 } private static parseProcessesFrom (value: string) { diff --git a/src/main/config/DefaultConfig.ts b/src/main/config/DefaultConfig.ts index cdfccb1..6868cd2 100644 --- a/src/main/config/DefaultConfig.ts +++ b/src/main/config/DefaultConfig.ts @@ -13,7 +13,7 @@ export default class DefaultConfig extends Config { }, onlineApis: [ { - enable: true, + enable: false, external: true, jsFile: 'config\\baiduApi.js', name: '百度' diff --git a/src/main/setup/Ipc.ts b/src/main/setup/Ipc.ts index 2f93f24..e68ce87 100644 --- a/src/main/setup/Ipc.ts +++ b/src/main/setup/Ipc.ts @@ -234,8 +234,8 @@ export default function (mainWindow: Electron.BrowserWindow) { ipcMain.on( IpcTypes.HAS_DOWNLOAD_COMPLETE, - (packName: string) => { - mainWindow.webContents.send(IpcTypes.HAS_DOWNLOAD_COMPLETE, packName) + (packName: string, err: string | undefined) => { + mainWindow.webContents.send(IpcTypes.HAS_DOWNLOAD_COMPLETE, packName, err) } ) diff --git a/src/renderer/App.vue b/src/renderer/App.vue index b5ac44d..a9c953f 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -7,15 +7,11 @@ diff --git a/src/renderer/components/LibrarySettings.vue b/src/renderer/components/LibrarySettings.vue index 96fcf44..b09aaab 100644 --- a/src/renderer/components/LibrarySettings.vue +++ b/src/renderer/components/LibrarySettings.vue @@ -10,7 +10,8 @@ "pleaseSelect2": "", "nowDownloading": "正在下载", "installed": "安装完成,重启生效", - "lingoes": "灵格斯词典" + "lingoes": "灵格斯词典", + "failed": "下载失败" }, "en": { "appLibrariesSettings": "App Libraries Settings", @@ -21,7 +22,8 @@ "pleaseSelect2": "in the directory", "nowDownloading": "Now downloading", "installed": "installed. Restart to take effect", - "lingoes": "Lingoes Dictionary (ja to zh-CN)" + "lingoes": "Lingoes Dictionary (ja to zh-CN)", + "failed": "Download failed" } } @@ -48,7 +50,13 @@ /> - + @@ -66,7 +74,13 @@ /> - + @@ -82,7 +96,13 @@ /> - + {{$t('download')}}  mdi-cloud-download @@ -93,21 +113,11 @@