【Python】気に入った英文をさっと対訳&教材にできるCUIアプリを作ってみた

■前置き

Pythonの勉強がてら作りました

  • できること:1文毎に対訳作成しテストできる。間違えたところを何度でも復習可能。

極めてシンプル、保存すらできません


■必要なもの

Deepl API key(無料)


■コード

import urllib.request
import urllib.parse
import json
import re

# ==========================================
# 設定
# ==========================================
API_KEY = "YOUR_DEEPL_API_KEY" # ここにAPI keyいれる
DEEPL_URL = "https://api-free.deepl.com/v2/translate"

# ==========================================
# 関数
# ==========================================
def translate_text(text):
    data = urllib.parse.urlencode({
        'text': text,
        'target_lang': 'JA'
    }).encode('utf-8')
    
    headers = {
        'Authorization': f'DeepL-Auth-Key {API_KEY}',
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    
    req = urllib.request.Request(DEEPL_URL, data=data, headers=headers)
    try:
        with urllib.request.urlopen(req) as response:
            res_json = json.loads(response.read().decode('utf-8'))
            return res_json['translations'][0]['text']
    except Exception as e:
        return f"【翻訳エラー】: {e}"

def split_sentences(text):
    text = text.replace('\n', ' ')
    text = re.sub(r'\s+', ' ', text).strip()
    sentences = re.split(r'(?<=[.!?])\s+', text)
    return [s for s in sentences if s]

def learning_session(sentences):
    mistakes = []
    total_sentences = len(sentences)
    
    for i, sentence in enumerate(sentences):
        print("\n" + "="*40)
        print(f"【 {i + 1} / {total_sentences} 文目 】")
        print("-" * 40)
        print(sentence)
        
        input("\n(Enterを押して日本語訳を表示...)")
        
        ja_text = translate_text(sentence)
        print("\n【日本語訳】")
        print(ja_text)
        
        while True:
            ans = input("\n合っていましたか? (y/n): ").strip().lower()
            
            # y/n の判定をガバガバにする(全角や空白混入対策)
            if 'y' in ans or 'y' in ans:
                break
            elif 'n' in ans or 'n' in ans:
                mistakes.append(sentence)
                if i + 1 < total_sentences:
                    input("(Enterを押して次の英文へ...)")
                break
            elif ans == "":
                continue # 空エンター連打は無視
            else:
                print("※ y または n を入力してください。")
                
    return mistakes

# ==========================================
# メイン処理
# ==========================================
def main():
    mistake_list = []
    
    while True:
        print("\n\n" + "*"*40)
        print(" メニュー")
        print("*"*40)
        print("1: 英文を入力して学習を開始する")
        print(f"2: 間違えリストを学習する (現在 {len(mistake_list)} 文)")
        print("3: アプリを終了する")
        
        choice = input("\n番号を選択してください (1-3): ").strip()
        
        if choice == '1':
            print("\n英文をペースト(入力)してください。")
            print("※ すべてペーストし終わったら、新しい行に「END」と入力してEnterを押してください。")
            
            lines = []
            while True:
                line = input()
                # END と入力されたら読み込み終了
                if line.strip().upper() == "END": 
                    break
                lines.append(line)
            
            full_text = " ".join(lines)
            if not full_text.strip():
                print("英文が入力されませんでした。")
                continue
                
            sentences = split_sentences(full_text)
            print(f"\n>>> 英文を {len(sentences)} 文に分割しました。学習をスタートします!")
            
            new_mistakes = learning_session(sentences)
            
            for m in new_mistakes:
                if m not in mistake_list:
                    mistake_list.append(m)
                    
            print("\n=== 全ての英文の学習が完了しました! ===")
            
        elif choice == '2':
            if not mistake_list:
                print("\n※ 間違えリストは空です。まずは「1」で学習してください。")
                continue
                
            print(f"\n>>> 間違えリスト(全 {len(mistake_list)} 文)の学習を開始します!")
            remaining_mistakes = learning_session(mistake_list)
            mistake_list = remaining_mistakes
            print("\n=== 間違えリストの学習が完了しました! ===")
            
        elif choice == '3':
            print("\nお疲れ様でした!アプリを終了します。")
            break

if __name__ == "__main__":
    main()


■使ってみた

BBCの記事を拝借


アプリを起動


モード選択し貼り付け


実行。


復習モード


コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です