파이썬에서 googletrans을 사용하여 Excel 번역 (일, 영국, 중, 한국 대응)
소개
Excel 파일을 지정하고 번역할 도구를 googletrans을 사용하여 만들었습니다.
일본어, 영어, 중국어(간체, 번체), 한국어에 대응하고 있습니다.
Google 번역이므로 100%의 정밀도라고 하는 것은 아니지만, 그래도 도움이 된다고 생각합니다.
본 프로그램 작성에는 여기 을 참고로 했습니다.
사양
사전 준비
다양한 설치
pip install openpyxl
pip install install googletrans==4.0.0-rc1
폴더 구성 · 기타
소스 코드
본 프로그램의 소스 코드는 아래에 기재되어 있습니다.
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).확장자」가 작성된다.
마지막으로
Excel은 셀의 수가 많기 때문에 번역 횟수도 많아지기 쉽고, 처리 시간과 서버 부하의 합쳐서 어느 정도 번역의 간격을 뚫어 줄까가 고민할 곳이었습니다.
어디까지나 개인적으로 조금 이용하는 정도라고 하는 전제로 0.1초 간격으로 했습니다만, 양이 많은 경우에는 1, 2초로 간격을 넓혀 주는 것이 좋을지도 모릅니다.
Reference
이 문제에 관하여(파이썬에서 googletrans을 사용하여 Excel 번역 (일, 영국, 중, 한국 대응)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fire_walt/items/752ae9bb3c109802da30
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#-----------------------------------------------------
#概要: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()
#-----------------------------------------------------
프로그램 실행
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).확장자」가 작성된다.
마지막으로
Excel은 셀의 수가 많기 때문에 번역 횟수도 많아지기 쉽고, 처리 시간과 서버 부하의 합쳐서 어느 정도 번역의 간격을 뚫어 줄까가 고민할 곳이었습니다.
어디까지나 개인적으로 조금 이용하는 정도라고 하는 전제로 0.1초 간격으로 했습니다만, 양이 많은 경우에는 1, 2초로 간격을 넓혀 주는 것이 좋을지도 모릅니다.
Reference
이 문제에 관하여(파이썬에서 googletrans을 사용하여 Excel 번역 (일, 영국, 중, 한국 대응)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fire_walt/items/752ae9bb3c109802da30
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(파이썬에서 googletrans을 사용하여 Excel 번역 (일, 영국, 중, 한국 대응)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fire_walt/items/752ae9bb3c109802da30텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)