Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

测试语法错误的代码是否会被自动拒绝合并 #14

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .all-contributorsrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"projectName": "ja-learner",
"projectOwner": "ks233",
"files": [
"README.md"
],
"commitType": "docs",
"commitConvention": "angular",
"contributorsPerLine": 7,
"contributors": [
{
"login": "ks233",
"name": "ks233",
"avatar_url": "https://avatars.githubusercontent.com/u/38981529?v=4",
"profile": "https://ks233.github.io/",
"contributions": [
"code"
]
},
{
"login": "shaka0919",
"name": "Harvey Wang",
"avatar_url": "https://avatars.githubusercontent.com/u/17539962?v=4",
"profile": "https://github.com/shaka0919",
"contributions": [
"code"
]
},
{
"login": "ly-nld",
"name": "跨性别",
"avatar_url": "https://avatars.githubusercontent.com/u/38471793?v=4",
"profile": "http://lgbt.sh",
"contributions": [
"infra"
]
}
]
}
37 changes: 15 additions & 22 deletions GUI/MainForm.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
using Microsoft.Web.WebView2.Core;
using System.Diagnostics;
using System.Runtime.InteropServices;
using MeCab;
using System.Text;
using System.Reflection.Metadata;
using OpenAI_API.Chat;
using Microsoft.VisualBasic;
using System.Windows.Forms.Design;
using System.Net.Http;

namespace ja_learner
{
Expand All @@ -16,7 +9,6 @@
DictForm dictForm;

TextAnalyzer textAnalyzer = new TextAnalyzer();
GptCaller gptCaller;
private string sentence = "";

public string Sentence
Expand All @@ -37,7 +29,7 @@

public MainForm()
{
InitializeComponent();
InitializeComponent()

Check failure on line 32 in GUI/MainForm.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 32 in GUI/MainForm.cs

View workflow job for this annotation

GitHub Actions / build

; expected
}
private async Task InitializeWebView()
{
Expand Down Expand Up @@ -111,16 +103,16 @@
{
if (timerWindowAttach.Enabled)
{
heightAfter = this.Height;
heightAfter = Height;
if (dictForm.Visible)
{
dictForm.Width = this.Right - WindowAttacher.TargetWindowRect.Right;
dictForm.Width = Right - WindowAttacher.TargetWindowRect.Right;
}
}
}


private System.Drawing.Point locationBefore; // 记录普通模式下窗口的位置
private Point locationBefore; // 记录普通模式下窗口的位置
private Size sizeBefore; // 记录普通模式下窗口的大小
private int heightAfter = 200; // 附着模式时,窗体通常会比较矮

Expand All @@ -131,17 +123,17 @@
if (checkBoxWindowAttach.Checked)
{
// 记录普通状态的窗口位置,切换到吸附状态下的窗口位置
sizeBefore = this.Size;
locationBefore = this.Location;
this.Height = heightAfter;
sizeBefore = Size;
locationBefore = Location;
Height = heightAfter;
timerWindowAttach.Enabled = true;
}
else
{
timerWindowAttach.Enabled = false;
heightAfter = this.Height;
this.Size = sizeBefore;
this.Location = locationBefore;
heightAfter = Height;
Size = sizeBefore;
Location = locationBefore;
}
}

Expand All @@ -151,7 +143,7 @@
{
WindowAttacher.AttachWindows(this, dictForm);
}
catch (Exception ex)
catch
{
WindowAttach = false;
}
Expand Down Expand Up @@ -201,7 +193,7 @@

private void btnInputText_Click(object sender, EventArgs e)
{
Sentence = Microsoft.VisualBasic.Interaction.InputBox("手动输入", "输入句子", "", 0, 0);
Sentence = Interaction.InputBox("手动输入", "输入句子", "", 0, 0);
}

private void timerSelectWindow_Tick(object sender, EventArgs e)
Expand Down Expand Up @@ -250,7 +242,7 @@
string windowTitle = WindowAttacher.GetWindowTitle(hwnd);
checkBoxWindowAttach.Text = $"与【{windowTitle}】对齐";
// 判断窗口句柄是不是自己的
if (hwnd == this.Handle || hwnd == dictForm.Handle)
if (hwnd == Handle || hwnd == dictForm.Handle)
{
checkBoxWindowAttach.Enabled = false;
return;
Expand Down Expand Up @@ -340,7 +332,8 @@

async private void checkBoxTranslateKatakana_CheckedChanged(object sender, EventArgs e)
{
await webView.ExecuteScriptAsync($"setTranslateKatakana({checkBoxTranslateKatakana.Checked.ToString().ToLower()})");
string param = checkBoxTranslateKatakana.Checked ? "true" : "false";
await webView.ExecuteScriptAsync($"setTranslateKatakana({ param })");
}
}
}
58 changes: 38 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
* 左键点击单词会在词典窗口中显示 MOJi 辞書的搜索结果
* 中键点击单词会在浏览器中打开单词在 MOJi 辞書的搜索页面

![demo](README/demo.gif)


### 窗口吸附

Expand All @@ -60,43 +62,59 @@

#### 使用 GPT(需要 API Key)

首先要配置 api key,在 `config.txt` 的第一行输入 api key,第二行输入 api url
首先要配置 api key,在 `appsettings.json` 中配置 ApiKey 与 ApiUrl

```
sk-xxxxxxxxx
https://api.openai.com/{0}/{1}
"ApiKey": "sk-xxx",
"ApiUrl": "https://api.openai.com/{0}/{1}",
```

如果你使用官方 API,第二行就不用修改,如果使用第三方反代,就要修改为相应的域名
如果你使用官方 API,就不用修改 ApiUrl,如果使用第三方反代,就要将其修改为相应的域名

配置好 api key 就可以使用 GPT 翻译和解说文本了。
配置好 ApiKey 就可以使用 ChatGPT 翻译和解说文本了。

![gpt](README/gpt.gif)

## 声明

### 分析与翻译仅供参考

本项目的分词与注音功能基于 MeCab,有时会犯一些低级错误,比如把「<ruby>身体<rt>からだ</rt></ruby>」注音为 しんたい、把「<ruby>二人<rt>ふたり</rt></ruby>」注音为 ににん,用词汇更丰富的 [UniDic](https://clrd.ninjal.ac.jp/unidic/) 词典替换 `dic` 文件夹中默认的 IPADIC 效果会稍好一些。
## 声明:分析与翻译仅供参考

翻译毕竟都是机翻,出错也很正常。谷歌翻译遇到复杂的句式和不规范的表达就容易翻车,ChatGPT 比谷歌懂更多俗语、流行语,但偶尔也会发癫,比如使用简体中文以外的语言回复、唐突的[塞氏翻译法](https://zh.moegirl.org.cn/zh-hans/塞氏翻译法)等等。建议把本软件当做一个精读工具而不是翻译器,把注意力放在日语原文上,只在不确定的时候使用翻译作为参考
本项目的分词与注音功能基于 MeCab,虽然整体准确率还算可以,但有时会犯一些连 N5 都不会犯的低级错误。比如在某些语境下把「<ruby>身体<rt>からだ</rt></ruby>」注音为 しんたい、把「<ruby>二人<rt>ふたり</rt></ruby>」注音为 ににん,遇到读音特殊的人名也无法正确注音。用词汇更丰富的 [UniDic](https://clrd.ninjal.ac.jp/unidic/) 词典替换 `dic` 文件夹中默认的 IPADIC 效果会稍好一些

外来语标注功能使用谷歌翻译将片假名单词翻译为英语,但不是所有片假名单词都是外来语,外来语也不一定来源于英语,还有像 supplies 和 surprise 这样的“同音词”也不好区分,因此也会出现标记错误的情况
翻译毕竟都是机翻,准确率有限。谷歌翻译遇到复杂的句式和不规范的表达就容易翻车,ChatGPT 比谷歌懂更多俗语、流行语,但稳定性欠佳,翻译质量时好时坏,偶尔会使用简体中文以外的语言回复、唐突地使用[塞氏翻译法](https://zh.moegirl.org.cn/zh-hans/塞氏翻译法)。建议把本软件当做一个精读工具而不是翻译器,把注意力放在日语原文上,只在不确定的时候使用翻译作为参考

根据我个人的使用体验,整体准确率还可以接受,但还是不建议完全初学者使用,以免被误导。如果遇到可疑的注音或翻译,建议点击单词查看 MOJi 辞書的解释和注音,并对照不同引擎的翻译结果,或者使用 ChatGPT 的解说功能
外来语标注功能使用谷歌翻译将片假名单词翻译为英语,但不是所有片假名单词都是外来语,外来语也不一定来源于英语,还有像 supplies 和 surprise 这样的“同音词”也不好区分,因此也会出现标注错误的情况

### 相关项目
根据我个人的使用体验,准确率还可以接受,但还是不建议完全初学者使用,以免被误导。如果遇到可疑的注音或翻译,建议结合 MOJi 辞書、各引擎的翻译结果、ChatGPT 的解说,综合多个方面进行判断。

本项目的前端页面:[ks233/ja-learner-webview](https://github.com/ks233/ja-learner-webview)
## 相关项目

开坑的想法主要来源于 [YUKI 翻译器](https://github.com/project-yuki/YUKI) 和 [Translation-Aggregator](https://github.com/Translation-Aggregator/Translation-Aggregator),前者支持了丰富的翻译接口,内置了文本提取功能,但使用起来比较复杂,且缺少快速查词的功能;后者虽然可以鼠标悬停查词,但只有日英词典、界面比较古老,而且翻译接口几乎炸完了,于是我决定搓一个更简单、更符合自己需求的工具。

[taishi-i/awesome-japanese-nlp-resources](https://github.com/taishi-i/awesome-japanese-nlp-resources) 有非常多日语相关的工具和资源,对我开发这个项目帮助很大。

### 使用的第三方库与框架
使用的第三方库与框架:

* 形态分析:[taku910/mecab](https://github.com/taku910/mecab) 的 .Net 移植版本 [kekyo/MeCab.DotNet](https://github.com/kekyo/MeCab.DotNet)
* 调用 ChatGPT:[OkGoDoIt/OpenAI-API-dotnet](https://github.com/OkGoDoIt/OpenAI-API-dotnet)
* ChatGPT:[OkGoDoIt/OpenAI-API-dotnet](https://github.com/OkGoDoIt/OpenAI-API-dotnet)
* 谷歌翻译:参考了 [FilipePS/Traduzir-paginas-web](https://github.com/FilipePS/Traduzir-paginas-web) 的 API 调用方式
* 单词搜索:[MOJi 辞書](https://www.mojidict.com/)
* Webview 页面:Vite + Vue
* [Web 页面](https://github.com/ks233/ja-learner-webview):[WebView2 控件](https://www.nuget.org/packages/Microsoft.Web.WebView2),Vite + Vue

另外 [taishi-i/awesome-japanese-nlp-resources](https://github.com/taishi-i/awesome-japanese-nlp-resources) 有非常多日语相关的工具和资源,对我开发这个项目帮助很大。

## 贡献者

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://ks233.github.io/"><img src="https://avatars.githubusercontent.com/u/38981529?v=4?s=100" width="100px;" alt="ks233"/><br /><sub><b>ks233</b></sub></a><br /><a href="#code-ks233" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shaka0919"><img src="https://avatars.githubusercontent.com/u/17539962?v=4?s=100" width="100px;" alt="Harvey Wang"/><br /><sub><b>Harvey Wang</b></sub></a><br /><a href="#code-shaka0919" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://lgbt.sh"><img src="https://avatars.githubusercontent.com/u/38471793?v=4?s=100" width="100px;" alt="跨性别"/><br /><sub><b>跨性别</b></sub></a><br /><a href="#infra-ly-nld" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
</tr>
</tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->
Binary file added README/demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion TextAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ struct TextAnalyzerResult
public string Surface;
public string Pos;// 词性
public string Basic;// 基本型
public string Reading;// 渲染
public string Reading;// 读音
public readonly string ToJson()
{

Expand Down
1 change: 0 additions & 1 deletion appsettings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{
"SecretKey": "Secret key value",
"AppSetting": {
"ApiKey": "sk-xxx",
"ApiUrl": "https://api.openai.com/{0}/{1}",
Expand Down
Loading