DeepL APIをコマンドラインで使用する(Mac)

# これは何

標準入力もしくはテキストファイルと翻訳したい言語を指定して、DeepLによる翻訳結果を標準出力に出力するコマンドラインツールです。

DeepL APIを使用しており、Pythonで書いています。

# 当方の環境

- Darwin monju.local 21.1.0 Darwin Kernel Version 21.1.0: Wed Oct 13 17:33:23 PDT 2021; root:xnu-8019.41.5~1/RELEASE_X86_64 x86_64
- Python 3.9.1
- MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)



# 準備

## DeepL APIに登録

https://www.deepl.com/ja/pro-api?cta=header-pro-api/

手順どおりに登録すると、auth_keyを手に入れることができます。

## deeplのインストール

PyPIにあります。詳細は、ドキュメントをお読みください。

https://pypi.org/project/deepl/

```sh
$ pip install deepl
```

# コード

イキナリの結論です。

<details><summary>DeepL.py</summary><div>

```python
#!/usr/bin/env python
import sys
import os

import deepl

# https://www.deepl.com/ja/docs-api/translating-text/
# as of 2021.11.14
LANG = ["BG",\
        "CS",\
        "DA",\
        "DE",\
        "EL",\
        "EN-GB",\
        "EN-US",\
        "EN",\
        "ES",\
        "ET",\
        "FI",\
        "FR",\
        "HU",\
        "IT",\
        "JA",\
        "LT",\
        "LV",\
        "NL",\
        "PL",\
        "PT-PT",\
        "PT-BR",\
        "PT",\
        "RO",\
        "RU",\
        "SK",\
        "SL",\
        "SV",\
        "ZH"]

def comment():
    print('Usage: %s target_lang FILENAME' % (sys.argv[0]))
    text = """
target_lang:    
    "DE" - German
    "EN-GB" - English (British)
    "EN-US" - English (American)
    "JA" - Japanese
    
!!!!!!!!!!!!!!!!!!! NOTE !!!!!!!!!!!!!!!!!!!
Input file must be UTF8-encoded plain text.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    """
    print(text)

def translate(input_text, target_lang):
    if is_str(input_text):
        pass
    else:
        print('入力ファイルは、文字列ではありません。')

    auth_key = 'YOUR_AUTHKEY'
    translator = deepl.Translator(auth_key) 
    result = translator.translate_text(input_text, target_lang=target_lang) 
    return result.text

def is_str(v):
    return type(v) is str

def get_file(filename):
    with open(filename, mode='r') as contents:
        try:
            input_text = contents.read()
        except OSError as e:
            print(e)
        else:
            return input_text


def main():
    std_input = []
    target_lang = sys.argv[1]

    # tty入力のチェック
    if sys.stdin.isatty():
        # パイプあるいはリダイレクトからの入力ではない場合、ファイルからの入力処理を実行
        # まずは、helpが引数として指定された場合の処理       
        if sys.argv[1] == 'help':
            comment()
            sys.exit()
        # 次に、target_langのチェック
        if target_lang not in LANG:
            print('\nTarget language is wrong!\n')
            sys.exit()
        # 次は、引数の数が多い場合
        elif len(sys.argv) > 3:
            print('Usage: %s target_language FILENAME' % (sys.argv[0]))
            sys.exit()
        elif len(sys.argv) == 3 :
            filename = sys.argv[2]
            input_text = get_file(filename)
        else:
            comment()
            sys.exit()
        print(translate(input_text, target_lang))
    # パイプあるいはリダイレクトからの入力の場合、標準入力からの処理を実行
    else:
        for std_input_row in sys.stdin:
            std_input.append(str(std_input_row))
        std_input_to_str = ''.join(std_input)
        print(translate(std_input_to_str, target_lang))



if __name__ == '__main__':
    main()
```
</div></details>

# 使用方法

実行可能にするために、chmod+xが必要です。

## 標準入力から読み込む場合

```sh
$ ./DeepL.py target_lang FILENAME
```

## ファイルから読み込む場合

```sh
$ cat hogehoge.txt | ./DeepL.py target_lang
```

## target_langの種類

target_langは、こちらに記載があります。
source_langは自動判別となっており、オプションです。

https://www.deepl.com/ja/docs-api/translating-text/


## 使用例1(標準入力から読み込み)

```sh
$ cat kumonoito.txt | ./DeepL.py EN-US
It happened one day.
The Buddha was wandering alone at the edge of a lotus pond in paradise.
The lotus flowers blooming in the pond were as white as jade, and the golden stamens in the middle of the flowers emitted an inexplicable fragrance that filled the air.
It must be morning in paradise.
```

## 使用例2(ファイルから読み込み)

```sh
$ ./DeepL.py EN-US kumonoito.txt 
It happened one day.
The Buddha was wandering alone at the edge of a lotus pond in paradise.
The lotus flowers blooming in the pond were as white as jade, and the golden stamens in the middle of the flowers emitted an inexplicable fragrance that filled the air.
It must be morning in paradise.
```

元の文章はこちら。

<details><summary>kumonoito.txt</summary><div>
ある日の事でございます。
御釈迦様は極楽の蓮池のふちを、独りでぶらぶら御歩きになっていらっしゃいました。
池の中に咲いている蓮の花は、みんな玉のようにまっ白で、そのまん中にある金色の蕊からは、何とも云えない好い匂が、絶間なくあたりへ溢れて居ります。
極楽は丁度朝なのでございましょう。
</div></details>

# さらなる情報

deepl APIについては、こちらに詳細が記述されています。

https://www.deepl.com/ja/docs-api/