✅qiitransコマンドは、文書作成支援ツールです

Overview

All Tests Go Report Card CodeQL Go Reference License: MIT Open in Visual Studio Code

QiiTrans

qiitransコマンドは、文書作成支援ツールです。

qiitransの機能は、標準入力から受け取ったテキストを翻訳して返すだけです。しかし、使い方を工夫すれば、機械翻訳で読まれても理解しやすい文章を作ることができます。

$ # 日本語 -> 英語に翻訳
$ echo 'おはよう。今日はいい天気ですね。' | qiitrans ja en
Good morning. It's a beautiful day.

$ # 英語 -> 日本語に翻訳
$ echo 'Good morning. It\'s a beautiful day.' | qiitrans en ja
おはようございます。今日はとてもいい天気ですね。
$ # 日本語 -> 英語 -> 日本語
$ echo '私は、賛成の反対に同意なのだ' | qiitrans ja en ja
同意しないことに同意します。

$ # 日本語 -> 英語 -> スペイン語 -> 中国語 -> 日本語
$ echo '同意しないことに同意します。' | qiitrans ja es en es zh ja
同意しないことに同意します。

$ echo '同意しないことに同意します。' | qiitrans ja en
I agree to disagree.

インストール

Windows10, macOS, Linux 用のバイナリを用意しています。(Intel/AMD 32bit/64bit, ARM v5,6,7 アーキテクチャ)

リリース・ページからダウンロードしたバイナリをパスの通ったディレクトリに設置後、実行権限を設定してください。

コマンドの構文

$ qiitrans --help
qiitrans
  qiitrans コマンドは文書作成支援ツールです。
  標準入力のテキストを、引数の言語から言語へ自動翻訳した結果を返します。

Usage:
  qiitrans [Options] LangFrom LangTo [LangTo ...]

Example:
  $ # 日本語 → 英語に翻訳
  $ echo '私は、賛成の反対に同意なのだ' | qiitrans ja en
  I agree to disagree.

  $ # 日本語 → 英語 → 日本語に翻訳
  $ echo '私は、賛成の反対に同意なのだ' | qiitrans ja en ja
  同意しないことに同意します。

  $ # 日本語 → 英語 → スペイン語 → 中国語 → 日本語の順に翻訳
  $ echo '同意しないことに同意します。' | qiitrans ja en es zh ja
  同意しないことに同意します。

LangFrom:
  標準入力から受け取るテキストの言語を指定します。(翻訳元の言語)

LangTo:
  翻訳先の言語を指定します。
  LangTo は複数指定可能で、1 つ前の言語から翻訳します。

翻訳エンジンについて
  現在は以下の翻訳 API に対応しています。
  利用するには、無料もしくは有料アカウントの登録とアクセス・トークンの発行が必要です。

  deepl ... DeepL API: https://www.deepl.com/docs-api/ (デフォルトの翻訳エンジン)

翻訳エンジンとアクセス・トークンの設定について:
  qiitrans は、翻訳 API のアクセストークンを環境変数から読み取ります。

  QIITRANS_API_KEY ... デフォルトで使うアクセス・トークンです。
  DEEPL_API_KEY ... DeepL 専用のアクセス・トークンです。セットされている場合は、QIITRANS_API_KEY より優先されます。


Options:

      --apikey           翻訳に使うエンジンのアクセス・トークンを指定します
      --engine[=deepl]   翻訳に使うエンジンを指定します
      --clear            実行前にキャッシュを完全に削除します。(API の利用枠を消費します)
  -h, --help             ヘルプを表示します
      --debug            デバッグ情報を標準エラー出力に出力します
      --no-cache         キャッシュを利用せずに翻訳 API から再取得します。(API の利用枠を消費します)
      --info             API のリクエスト可能な残数など、API 情報を最後に出力します

アクセス・トークン

QiiTrans は、翻訳 API のアクセス・トークンを必要とします。以下のいずれかで指定し、最初に該当したアクセス・トークンを利用します。

  1. コマンド・オプションの --apikey で指定されたトークン。
  2. 環境変数に、使用している翻訳エンジン専用の変数がセットされている場合は、その値。
    • DEEPL_API_KEY ... --engine=deepl (デフォルトの翻訳エンジン)
  3. QIITRANS_API_KEY がセットされている場合は、その値。

その他の環境変数

QiiTrans は、以下の環境変数がセットされていた場合は、デフォルト値として利用します。

  • QIITRANS_ENGINE: 翻訳に使うエンジンです。現在は "deepl" のみが指定可能です。
  • QIITRANS_API_KEY: 翻訳に使うエンジンの APIキー(アクセストークン)です。

コントリビュート

ライセンスと著作権

Issues
  • "--info" オプションが働いていない

    リクエスト残数が表示されないのだ

    $ ./qiitrans -v
    qiitrans v1.0.0-RC1 (cf8204d)
    
    $ ./qiitrans -h | grep info
          --info             API のリクエスト可能な残数など、API 情報を最後に出力します
    
    $ echo 'Qiitanは賛成の反対に同意なのだ' | ./qiitrans --info ja en ja
    Qiitanは意見が一致している!
    
    bug 
    opened by KEINOS 1
  • feat: codeql-analysis.yml

    feat: codeql-analysis.yml

    opened by KEINOS 1
  • STDIN が空の場合も API を叩いている

    STDIN が空の場合も API を叩いている

    以下のログのように、空の場合でもキャッシュと API を呼び出しています。もったいない。

    strings.TrimSpace() しても空の場合はストレートに空の文字列を返すべきです。

    $ echo -n "" | qiitrans ja en ja --debug
    badger 2021/07/07 02:37:39 INFO: All 2 tables opened in 0s
    badger 2021/07/07 02:37:39 INFO: Discard stats nextEmptySlot: 0
    badger 2021/07/07 02:37:39 INFO: Set nextTxnTs to 2
    badger 2021/07/07 02:37:39 INFO: Deleting empty file: /tmp/QiiTrans/000003.vlog
    badger 2021/07/07 02:37:39 INFO: Lifetime L0 stalled for: 0s
    badger 2021/07/07 02:37:39 INFO: 
    Level 0 [ ]: NumTables: 02. Size: 584 B of 0 B. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 64 MiB
    Level 1 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 2 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 3 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 4 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 5 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 6 [B]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level Done
    [LOG]: JA -> EN: 新規取得: 
    badger 2021/07/07 02:37:41 INFO: All 2 tables opened in 1ms
    badger 2021/07/07 02:37:41 INFO: Discard stats nextEmptySlot: 0
    badger 2021/07/07 02:37:41 INFO: Set nextTxnTs to 2
    badger 2021/07/07 02:37:41 INFO: Deleting empty file: /tmp/QiiTrans/000004.vlog
    badger 2021/07/07 02:37:41 INFO: Lifetime L0 stalled for: 0s
    badger 2021/07/07 02:37:41 INFO: 
    Level 0 [ ]: NumTables: 03. Size: 876 B of 0 B. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 64 MiB
    Level 1 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 2 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 3 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 4 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 5 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 6 [B]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level Done
    badger 2021/07/07 02:37:41 INFO: All 3 tables opened in 0s
    badger 2021/07/07 02:37:41 INFO: Discard stats nextEmptySlot: 0
    badger 2021/07/07 02:37:41 INFO: Set nextTxnTs to 3
    badger 2021/07/07 02:37:41 INFO: Deleting empty file: /tmp/QiiTrans/000005.vlog
    badger 2021/07/07 02:37:41 INFO: Lifetime L0 stalled for: 0s
    badger 2021/07/07 02:37:41 INFO: 
    Level 0 [ ]: NumTables: 03. Size: 876 B of 0 B. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 64 MiB
    Level 1 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 2 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 3 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 4 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 5 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 6 [B]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level Done
    [LOG]: EN -> JA: 新規取得: 
    badger 2021/07/07 02:37:41 INFO: All 3 tables opened in 1ms
    badger 2021/07/07 02:37:41 INFO: Discard stats nextEmptySlot: 0
    badger 2021/07/07 02:37:41 INFO: Set nextTxnTs to 3
    badger 2021/07/07 02:37:41 INFO: Deleting empty file: /tmp/QiiTrans/000006.vlog
    badger 2021/07/07 02:37:41 INFO: Lifetime L0 stalled for: 0s
    badger 2021/07/07 02:37:41 INFO: 
    Level 0 [ ]: NumTables: 04. Size: 1.1 KiB of 0 B. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 64 MiB
    Level 1 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 2 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 3 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 4 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 5 [ ]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level 6 [B]: NumTables: 00. Size: 0 B of 10 MiB. Score: 0.00->0.00 StaleData: 0 B Target FileSize: 2.0 MiB
    Level Done
    
    bug 
    opened by KEINOS 1
  • Fix issue #8

    Fix issue #8

    opened by KEINOS 1
  • Mergify が *.md/*.json の編集を含むとマージしてしまう

    Mergify が *.md/*.json の編集を含むとマージしてしまう

    下記、2 つ目のルール(赤枠)は、.md and/or .json ファイルのみ・・の編集の PR に発動する意図で入れています。

    しかし、この設定ではこれらのファイルを含む PR であった場合に条件がマッチしてしまい自動マージが働いてしまいます。

    これは「1 回でも条件にマッチした」場合にフラグが立ってしまうためです。

    スクリーンショット 2021-07-08 9 11 35

    リファレンス

    bug 
    opened by KEINOS 1
  • Issue #1 に伴うリファクタと修正

    Issue #1 に伴うリファクタと修正

    Issue に対して main のテストがしづらいため、./test/issues/ に再現テストが作りづらい。

    Issue #1 の再現テスト及びその修正を行うにあたり、リファクタが必要です。

    リファクタ内容

    • main パッケージにおける本体動作部分を app パッケージに 抜き出す
    • mainapp のインスタンス作成および引数を渡して実行するだけにする。

    これにより、アプリ(コマンド)に渡すオプションや引数のコントロールと、その実行結果の確認が app のオブジェクトで完結できるため、再現テストが作りやすくなる。

    opened by KEINOS 0
  • run-all(総合テスト)で lint とドキュメントチェックを先に実行

    run-all(総合テスト)で lint とドキュメントチェックを先に実行

    Docker 内での総合テストの順番を変更

    Unit テストでは内容的に API の利用枠を消費します。しかし、API の利用枠を消費しない lint やドキュメント更新のチェックが unit テストよりも後なので、失敗した場合に無駄に API 利用枠を消費します。

    消費しないテストを先に実行すべきです。

    $ run-all
    ===============================================================================
     Run all tests before merge
    ===============================================================================
    - Shell format ... OK
    - Shell check ... OK
    - Go format ... OK
    - Go unit tests ... OK
    - Lint check (golangci-lint) ... OK
    - Document check (gomarkdoc) ...OK
    
      Shell format ... OK
      Shell check ... OK
      Go format ... OK
    - Go unit tests ... OK
      Lint check (golangci-lint) ... OK
      Document check (gomarkdoc) ...OK
    + Go unit tests ... OK
    
    enhancement 
    opened by KEINOS 0
  • Fix: issue #11 テストの順番

    Fix: issue #11 テストの順番

    close #11

    opened by KEINOS 0
  • Open with VSCode バッジの追加

    Open with VSCode バッジの追加

    VSCode 1.18 から URL スキームに DevContainer が対応したので、Open in VSCode バッジが使えるようになりました。

    このリポジトリは Dev Container に対応しているので、設置した方が .devcontainer ディレクトリを掘らなくてもわかりやすいかな、と。

    • 構文
      • [![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/organization/repository)

    つまり、こう。

    • [![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/Qithub-BOT/QiiTrans)

    参考文献

    opened by KEINOS 1
  • Google Translate API のエンジン追加

    Google Translate API のエンジン追加

    Chrome の自動翻訳向けに Google 翻訳でも確認したい

    qiitrans --engine google ja en ja
    

    デフォルトエンジンの DeepL の方が Google 翻訳より精度は高いのですが、Google Chrome 標準の自動翻訳を使った場合に、いささかチグハグになってしまいます。

    以下のような棲み分けができるといいなと思いました。

    • 原文とは別に翻訳文を静的ドキュメントとして作成する場合は DeepL エンジン
    • 原文をブラウザの自動翻訳にまかせたい場合のドキュメント作成の場合は Google エンジン

    参考文献・リファレンス

    enhancement 
    opened by KEINOS 0
  • 標準入力がない場合は対話モードにする

    標準入力がない場合は対話モードにする

    単発の翻訳の場合は echo "foo bar" | qiitrans en ja en とパイプ渡しします。

    しかし、文書を考える際にあれこれと考える時にパイプ渡しだと操作が煩雑になります。 対話モードでできると便利です。

    $ qiitrans ja en ja --stop-word="stop" --info
    おはよう。今日はいい天気ですね。
    -> おはようございます。今日はとてもいい天気ですね。
    おはようございます。今日はとてもいい天気ですね。
    -> おはようございます。今日はとてもいい天気ですね。
    stop
    [INFO]: 残り文字数: 123,456
    

    すでに対話モードの関数は用意されています。

    • InteractSTDIN()

    • 関連 Issue: #3 標準入力がないと待機(ハング)する

    enhancement 
    opened by KEINOS 0
  • 標準入力がないと待機(ハング)する

    標準入力がないと待機(ハング)する

    $ ./qiitrans ja en
    
    ^C
    $
    

    対話式の翻訳が実装できていないことが原因ですが、問題はテストで、テストの実行バイナリを exec.Command(os.Args[0], "--info", "ja", "en") で呼び出すと、tty が掴まれたまま帰ってこないため ^c でも抜けられません。

    bug 
    opened by KEINOS 0
Releases(v1.0.0-RC1)
Owner
Qithub - QiitaとQiitadonとGitHubをつなげるBOT
QiitaとQiitadonのユーザ間コラボレーションを支援するためのBOTを共同で作るためのOrganizationです。
Qithub - QiitaとQiitadonとGitHubをつなげるBOT