SublimeText上でDeepLを呼び出す

(更新日時 )

カテゴリー:  Tech タグ:  ai python sublime text
/images/programming.webp

最近エディタ上でちょっとした翻訳をしなければ成らないことがあり、 面倒なのでDeepLの無料版APIを使って、Sublime Text上から翻訳を呼び出せるようにしてみました。NeoVimでないのは、たまたまその作業をSublime Textでやっていたからです。

(2023-06-09更新)

Pythonのコードをコマンドラインから直接読み込めるように変更。また、コマンドラインの引数のパースにClickを使用するよう変更。

DeepL APIの登録を行う。

まずは、DeepL APIが使えるように DeepLで登録を行いましょう。 以下の2つが必要です。

  1. DeepLのアカウントを作成する。

  2. DeepL API のページで、API利用の登録を行う。

取り敢えず試すだけならば、無料枠で大丈夫です。以下に示すコードも無料枠を前提に書いています。

API登録が終わると、アカウント情報で APIキー を確認することができます。

DeepL APIを呼び出し翻訳するプログラムを作成する。

Sublime Text上から直接DeepL APIを呼び出すのは荷が重そうなので、APIを呼び出して翻訳を行うプログラムをPythonで書いてみました。

標準入力から原文を受けて標準出力に書き出すようにすれば何とかなるでしょう。

先ほど入手した APIキーは .env ファイルに DEEPL_API_KEY=XXXXXXXXXXXX という形式で保存しておいてください。 .env ファイルはプログラムと同じフォルダでホームディレクトリのものに追加しても大丈夫です。

プログラムは以下のような感じです。やっつけで書いたのでエラー処理とかは書いていません。 実行方法は冒頭のコメントに書いているので確認ください。

# -*- coding: utf-8 -*-
# DeepL API 無料版を使って標準入力からのテキストを翻訳して標準出力に出力する
# 使い方: deepl.py -t j < input.txt > output.txt
#         cat input.txt | python deepl.py -t j > output.txt

# 必要モジュールのインポート
import requests
import sys
import os
from dotenv import load_dotenv
import click


# コマンドライン引数の設定
@click.command()
# コマンドラインの引数で  '--target' または '-t' に続いて言語を指定できるようにする
# 言語は 'japanese' または'english'が指定できる。 'japanese' は 'j'と省略も可能。
# 'english' は 'e'と省略も可能。
@click.option('--target', '-t',
              type=click.Choice(['japanese', 'english', 'j', 'e']),
              default='japanese', help='Target language. (default: japanese)')


def translate(target):

    """Japanese-English translation program using DeepL"""

    # target から指定された言語を読み取り、変数target_languageに以下の条件で
    # 指定言語を格納する
    # targetが'japanese'または'j'のときは、'japanese'
    # targetが'english'または'e'のときは'english'
    if target in ['japanese', 'j']:
        target_language = "JA"
        source_language = "EN"
    elif target in ['english', 'e']:
        target_language = "EN"
        source_language = "JA"

    # .envからAPIキーを取得する。
    # .envファイルには、DEEPL_API_KEY="APIキー"のように記載する。
    load_dotenv()
    auth_key = os.environ["DEEPL_API_KEY"]

    # 翻訳するテキストの取得
    text = sys.stdin.read()

    # DeepL APIを利用して翻訳する。
    url = "https://api-free.deepl.com/v2/translate"
    params = {
            "auth_key": auth_key,
            "target_lang": target_language,
            "source_lang": source_language,
            "text": text,
            }
    response = requests.post(url, data=params)

    # 翻訳結果の取得
    translated_text = response.json()["translations"][0]["text"]

    # 翻訳結果の出力
    click.echo(translated_text)

if __name__ == '__main__':
    translate()

Sublime Textから翻訳ツールを呼び出す

Sublime Textからは範囲選択したテキストを呼び出すコマンドの標準入力に投げて、標準出力の結果を編集部分に挿入すれば OKです。

そんなことをやってくれるプラグインとして、 FilterPipes というものがあったので早速導入してためしてみました。しかし、最終更新日が8年前というのは Sublime Textの転落ぶりを感じますね。

以下の動画はFilterPipesを使って作ったプログラムを呼び出してみたサンプルです。

取り敢えず,急場凌ぎにつくったにしては便利でした。

コメント

Comments powered by Disqus