pythonでgoogletransを使用してExcelを翻訳する（日、英、中、韓対応）

#はじめに
Excelファイルを指定し、翻訳するツールをgoogletransを使用して作成しました。
日本語、英語、中国語（簡体、繁体）、韓国語に対応しています。
Google翻訳なので100%の精度というわけではありませんが、それでも役立つと思います。
本プログラム作成には、[こちら](https://note.com/gaku_prog/n/n2c2d2a529f12)を参考とさせていただきました。

#仕様
* 対話型プログラムで、翻訳したいExcelファイル、翻訳元言語、翻訳先言語を指定することで翻訳を実行する。
* Excelファイルの全シート分について翻訳する。
* 翻訳されたファイルは、「翻訳元ファイル名(Translated).拡張子」で保存される。（筆者は.xlsx以外のExcelファイルについては動作確認しておりません。ご了承ください。）

#事前準備
##各種インストール
* pythonのインストール（やり方はWeb検索するとたくさん出てくるので、ここでは割愛）
* openpyxlのインストール（Windows編）
    * コマンドプロンプトで下記を入力して、Enterを押下

```
pip install openpyxl
```

* googletransのインストール（Windows編）
    * コマンドプロンプトで下記を入力して、Enterを押下

```
pip install install googletrans==4.0.0-rc1
```

##フォルダ構成・その他
* 翻訳したいExcelファイルと、実行するpythonファイルを同じフォルダ配下に格納する。
* 翻訳実行前に、翻訳元ファイルを閉じておく。

#ソースコード
本プログラムのソースコードを下に記載します。

```python:TranslateExcel.py
#-----------------------------------------------------
#概要：Excelブックを翻訳するプログラム
#補足：複数シートを翻訳する
#　　　本Pythonファイルと同じフォルダに翻訳元のExcel(.xlsx)を格納しておく
#　　　翻訳後のファイル名は「翻訳元ファイル名(Translated).拡張子」とする
#-----------------------------------------------------

import datetime
import openpyxl
from googletrans import Translator
import os
import sys
import time

#-----------------------------------------------------
#各種定数
REPEAT_NUM = 15 #開始、終了時メッセージの「-」の繰り返し数
#-----------------------------------------------------

#-----------------------------------------------------
#各種関数

#プログラム終了処理
def pgmEndProcess() -> None: 
    print("-" * REPEAT_NUM + " END " + "-" * REPEAT_NUM)

#翻訳コード変換処理
def transLangChange(lang_num: int) -> str:
    if lang_num == 1: #日本語
        lang_code = "ja"
    elif lang_num == 2: #英語
        lang_code = "en"
    elif lang_num == 3: #韓国語
        lang_code = "ko"
    elif lang_num == 4: #簡体中国語
        lang_code = "zh-cn"
    else: #繁体中国語
        lang_code = "zh-tw"
    return lang_code

#-----------------------------------------------------

#-----------------------------------------------------
#メイン処理
print("-" * REPEAT_NUM + " START " + "-" * REPEAT_NUM)

file_name = input("翻訳したいExcelファイル名を入力してください（例：ABC.xlsx）。終了は-1：") #翻訳元ファイル名を取得

#ファイル名がカレントディレクトリにない場合、再度ファイル名を入力
while (os.path.isfile(file_name) == False):
    #ファイル名が-1であれば終了
    if file_name == "-1":
        pgmEndProcess()
        sys.exit()

    file_name = input("指定されたファイルが存在しません。\n再度翻訳したいExcelファイル名を入力してください（例：ABC.xlsx）。終了は-1：") #翻訳元ファイル名の取得

#翻訳元言語の指定
src_lang = input("翻訳元の言語を半角数字で指定してください。\n1.日本語　2.英語　3.韓国語　4.簡体中国語　5.繁体中国語。終了は-1：")

#入力値が不正である場合、再度翻訳先言語を入力
while (src_lang != "-1" and src_lang != "1" and src_lang != "2" and src_lang != "3" and src_lang != "4" and src_lang != "5"):
    src_lang = input("入力値が不正です。\n再度翻訳元の言語を半角数字で指定してください。\n1.日本語　2.英語　3.韓国語　4.簡体中国語　5.繁体中国語。終了は-1：")

#入力値が-1であれば終了
if src_lang == "-1":
    pgmEndProcess()
    sys.exit()

#翻訳先言語の指定
dest_lang = input("翻訳先の言語を半角数字で指定してください。\n1.日本語　2.英語　3.韓国語　4.簡体中国語　5.繁体中国語。終了は-1：")

#入力値が不正である場合、再度翻訳先言語を入力
while (dest_lang != "-1" and dest_lang != "1" and dest_lang != "2" and dest_lang != "3" and dest_lang != "4" and dest_lang != "5"):
    dest_lang = input("入力値が不正です。\n再度翻訳先の言語を半角数字で指定してください。\n1.日本語　2.英語　3.韓国語　4.簡体中国語　5.繁体中国語。終了は-1：")

#入力値が-1であれば終了
if dest_lang == "-1":
    pgmEndProcess()
    sys.exit()

#翻訳コードに変換
src_lang = transLangChange(int(src_lang))
dest_lang = transLangChange(int(dest_lang))

translator = Translator() #翻訳準備
workBook = openpyxl.load_workbook(file_name) #ブックを開く
total_sheet_num = len(workBook.sheetnames) #シート数取得
sheet_num = 0 #翻訳中のシート番号

for ws in workBook.worksheets:
    sheet_num += 1
    print(str(sheet_num) + "/" + str(total_sheet_num) + "シート目を翻訳中です...") #翻訳しているページ数を出力

    for row in ws:
        for cell in row:
            #空白セルは翻訳しない 
            if cell.value is None:
                continue
            #セルが数値の場合は翻訳しない
            if isinstance(cell.value,int):
                continue
            #時刻は翻訳しない
            if isinstance(cell.value,datetime.time): 
                continue
            #日付は翻訳しない
            if isinstance(cell.value,datetime.datetime):
                continue
            cell.value = translator.translate(str(cell.value), src=src_lang, dest=dest_lang).text
            time.sleep(0.1) #サーバ負荷軽減処理。データ数が多い場合、時間を増やすことを検討

print("翻訳が終了しました。") #翻訳終了メッセージ

file_name_split = os.path.splitext(os.path.basename(file_name)) #翻訳元ファイル名を拡張子以外と拡張子に分割
workBook.save(file_name_split[0] + "(Translated)" + file_name_split[1]) #翻訳先ファイル名を指定して保存
pgmEndProcess()
#-----------------------------------------------------

```

#プログラムの挙動（Windowsのコマンドプロンプト上での流れ）
プログラムを実行

```
python TranslateExcel.py
```

翻訳したいファイル名を入力（ここでは、test.xlsxとする）

 
```
--------------- START ---------------
翻訳したいExcelファイル名を入力してください（例：ABC.xlsx）。終了は-1：test.xlsx
```

翻訳元言語を指定（ここでは1.日本語とする）

```
翻訳元の言語を半角数字で指定してください。
1.日本語　2.英語　3.韓国語　4.簡体中国語　5.繁体中国語。終了は-1：1
```

翻訳先言語を指定（ここでは2.英語とする）

```
翻訳先の言語を半角数字で指定してください。
1.日本語　2.英語　3.韓国語　4.簡体中国語　5.繁体中国語。終了は-1：2
```

翻訳が開始される。「END」が表示されプログラムが終了するまで待機。（量が多いと時間かかるため、別作業をしていても良い）

```
1/1シート目を翻訳中です...
翻訳が終了しました。
--------------- END ---------------
```

プログラムが正常に終了すると、翻訳元ファイルが格納されているフォルダ配下に「翻訳元ファイル名(Translated).拡張子」が作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334856/9493eec9-78ed-9ff4-446b-e74207b796fc.png)


#最後に
Excelはセルの数が多いため翻訳回数も多くなりがちで、処理時間とサーバ負荷の兼ね合いでどの程度翻訳の間隔をあけてあげるかが悩みどころでした。
あくまで個人的に少し利用する程度という前提で0.1秒間隔としましたが、量が多い場合には1, 2秒と間隔を広げてあげるのが良いかもしれません。