2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonでコメントを英訳

Last updated at Posted at 2019-09-06

#pythonで日本語コメントを英語化
コーディングした後に、コメントを日本語化してほしいと依頼があった
ファイル数も多く1件ずつgoogle翻訳するのも大変なので、pythonでやっちまったな

※pythonのコーディング規約pep8なら使えると思う

main.py

#!/usr/bin/env python
# -*- coding: utf8 -*-

import form

if __name__ == "__main__":
    root = form.tk.Tk()
    root.title(u"Comment Translator For Python")
    app = form.Application(master=root)
    app.mainloop()
    pass

form.py

import sys
import tkinter as tk
import tkinter.scrolledtext
import tkinter.filedialog
import translator as tr
import glob
import Util
import threading

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack(expand=1, fill=tk.BOTH, anchor=tk.NW)
        self.__create_widgets()
        self.__IsCancelTranslate = False
        self.__initialMessage()
        
    def __create_widgets(self):
        self.label = tk.Label(self, text=u'対象フォルダ')
        self.label2 = tk.Label(self, text=u'出力フォルダ')
        self.button = tk.Button(self, text=u'開く', command=self.__button_click)
        self.button2 = tk.Button(self, text=u'開く', command=self.__button2_click)
        self.button3 = tk.Button(self, text=u'開始', command=self.__button3_translateStart)
        self.entry = tk.Entry(self)
        self.entry2 = tk.Entry(self)
        self.scrolledText = tk.scrolledtext.ScrolledText(self)

        self.label.grid(column=0, row=0, sticky=tk.W)
        self.label2.grid(column=0, row=1, sticky=tk.W)
        self.button.grid(column=3, row=0, sticky=tk.E)
        self.button2.grid(column=3, row=1, sticky=tk.E)
        self.button3.grid(column=4, row=0, rowspan=2, sticky=tk.E)
        self.entry.grid(column=1, columnspan=2, row=0, sticky=tk.EW)
        self.entry2.grid(column=1, columnspan=2, row=1, sticky=tk.EW)
        self.scrolledText.grid(column=0, columnspan=5, row=2, sticky=tk.NSEW)

        self.columnconfigure(1, weight=1)
        self.rowconfigure(2, weight=1)
        
    def __initialMessage(self):
        self.__WriteLog("翻訳対象と翻訳結果出力先フォルダを指定して開始ボタンを押下して下さい")
        self.__WriteLog("入力チェック作ってないので翻訳対象は手打ちしないでください")

    # 対象フォルダの開くボタン
    def __button_click(self):
        dir = 'C:\\'
        fle = tk.filedialog.askdirectory(initialdir = dir)
        if fle:
            self.entry.delete(0, tk.END)
            self.entry.insert(0, fle)

    # 翻訳先フォルダの開くボタン
    def __button2_click(self):
        dir = 'C:\\'
        fle = tk.filedialog.askdirectory(initialdir = dir)
        if fle:
            self.entry2.delete(0, tk.END)
            self.entry2.insert(0, fle)

    def __button3_translateStart(self):
        if not self.entry.get():
            self.__WriteLog("翻訳対象の入力がありません")
            return
        if not self.entry2.get():
            self.__WriteLog("翻訳出力先の入力がありません")
            return

        self.__WriteLog("Start Translation: 完了メッセージが表示されるまで閉じないでください")
        self.__IsCancelTranslate = False

        threading.Thread(target=self.__translateFiles).start()
        
        self.button3 = tk.Button(self, text=u'中断', command=self.__button3_translateCancel)
        self.button3.grid(column=4, row=0, rowspan=2, sticky=tk.E)
        
    def __button3_translateCancel(self):
        self.__IsCancelTranslate = True
        
        self.button3 = tk.Button(self, text=u'開始', command=self.__button3_translateStart)
        self.button3.grid(column=4, row=0, rowspan=2, sticky=tk.E)

    def __translateFiles(self):
        targetDirectry = self.entry.get()
        translatedDirectry = self.entry2.get()

        pyFiles = glob.glob(f"{targetDirectry}\\**\\*.py", recursive=True)
        pyFilesLength = len(pyFiles)

        # . + (絶対パス - 指定パス) = 指定パスからの相対パス(.\relativPath.py)
        directryNameLength = len(targetDirectry)
        relativPaths = ["." + n[directryNameLength:] for n in pyFiles]

        for (file, relativPath, i) in zip(pyFiles, relativPaths, range(0, pyFilesLength)):
            translator = tr.translator(file)
            translatedLines = translator.translate()
            if self.__IsCancelTranslate:
                self.__WriteLog("処理を中断しました。")
                break

            translatedText = '\n'.join(translatedLines)
            filename = translatedDirectry + relativPath[1:]

            Util.writeText(translatedText, filename)
            progress = round((i + 1) / pyFilesLength * 100)
            msg = f"{progress}% Translated \"{relativPath}\""
            self.__WriteLog(msg)
            
        self.button3 = tk.Button(self, text=u'開始', command=self.__button3_translateStart)
        self.button3.grid(column=4, row=0, rowspan=2, sticky=tk.E)
        self.__WriteLog("Finish!: 閉じても大丈夫です!")
    
    def __WriteLog(self, msg):
        self.scrolledText.insert(tk.END, f"{msg}\n")

translator.py

from googletrans import Translator

class translator:

    def __init__(self, filePath):
        # File open
        self.__source = open(filePath, 'r+', encoding = "utf-8")
        self.text = self.__source.read()
        self.__source.close
        
        self.lines = self.text.split('\n')
        self.lineCount = self.lines.count
        
        # f = open('Sample\\honyaku.py', 'r+',encoding="utf-8_sig")
    def translate(self):
        translator = Translator(from_lang = "ja", to_lang = "en")
        translatedLines = []
        for line in self.lines:
            translatedLine = ""
            # クォーテーションとダブルクォーテーションの中であるか
            isInQuotation = isInDoubleQuotation = False
            for i, char in enumerate(line):
                if char == '\'':
                    isInQuotation = not isInQuotation 
                if char == '\"':
                    isInDoubleQuotation = not isInDoubleQuotation
                if char != '#':
                    continue
                if isInQuotation or isInDoubleQuotation:
                    continue
                
                lineLength = len(line)
                comment = line[i + 2: lineLength]
                translatedComment = translator.translate(comment)
                translatedLine = line + f" ({translatedComment})"
                
                break
            if translatedLine:
                translatedLines.append(translatedLine)
            else:
                translatedLines.append(line)

        return(translatedLines)

####Util.py

import os
import os.path
def writeText(text, filename):
    directry = os.path.dirname(filename)
    if not os.path.exists(directry):
        os.makedirs(directry)
    f = open(filename,'w', encoding='utf-8')
    f.write(text)
    f.close()

利用制限とかあるからずっと使えないけど、フォルダ単位でできるからOK

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?