[Traduction automatique] Outil d'aide à la saisie en anglais Translation-chan [Python]

L'anglais est faible, donc l'anglais ...

Bonjour. C'est merveilleux de dire que j'ai étudié l'anglais parce que mon anglais est faible. Dans mon cas, "je suis faible en anglais, alors j'ai pensé à un moyen d'échapper à l'anglais." C'est pourquoi je l'ai fait. (Brusque) ** Pour ceux qui veulent "copier le code source rapidement!" Ou qui recherchent une histoire technique [Il est temps pour une histoire technique](https://qiita.com/branch/items/5f5cf4be81980074431b#%E3 % 81% 9D% E3% 82% 8D% E3% 81% 9D% E3% 82% 8D% E6% 8A% 80% E8% A1% 93% E7% 9A% 84% E3% 81% AA% E8% A9 Veuillez aller à% B1)! ** ** ** Si vous êtes pressé, tant que vous disposez de win10 (64 bits), voici [Annexe: Simple installer (.bat)](https://qiita.com/branch/items/5f5cf4be81980074431b#%E4%BB%98% E9% 8C% B2win10-64bit% E7% 94% A8% E7% B0% A1% E6% 98% 93% E3% 82% A4% E3% 83% B3% E3% 82% B9% E3% 83% 88% Si vous utilisez E3% 83% BC% E3% 83% A9), vous pouvez l'installer en 10 minutes environ. ** **

Comme prérequis, Python 3.X doit être installé, donc référez-vous à Télécharger et installer Python 3.7.3 - Programmation de programmes. Veuillez essayer de le présenter. Bien sûr, il n'est pas nécessaire que ce soit la version 3.7.3, ni la dernière version.

Premier fond

Je communique avec des partenaires commerciaux étrangers en anglais. En d'autres termes, il existe relativement de nombreuses possibilités de communiquer en anglais, pas seulement par e-mail, mais que se passe-t-il si vous demandez à un homme qui ne parle pas anglais de communiquer en anglais? Oui, vous devez vous fier à la traduction de Google. Vous pourrez faire ce genre de chose.

1.Pensez au contenu en japonais
2.Lancer vers Google Traduction
3.Obtenez l'anglais
4.Retraduisez le texte anglais que vous avez obtenu sur Google
5.Examen du japonais retraduit
→ En cas de divergence entre le texte original et le sens, revenez à 1 et retravaillez le texte si nécessaire.

** N'est-ce pas impossible! ?? ** ** C'est vraiment agaçant. Non, je parle de devenir capable de parler anglais. Si vous n'êtes pas bon en anglais, vous n'avez pas d'autre choix que de faire ce travail. N'est-ce pas particulièrement vrai pour les personnes dans la quarantaine et la cinquantaine qui doivent soudainement utiliser l'anglais?

Peut-être parce que cela prend du temps, les heures supplémentaires du département sont censées être doerai, alors je l'ai fait.

Ensuite, je présenterai Kas,

Si vous commencez cette traduction avec l'entrée japonaise copiée dans le presse-papiers, elle sera divisée en phrases par "." ~~ A la fin de la phrase et traduite. ** Mise à jour le 3 août: le délimiteur a été remplacé par un saut. ** Lorsque la traduction est terminée, vous pouvez appuyer sur le bouton et copier l'anglais traduit dans le presse-papiers. Vous trouverez ci-dessous une capture d'écran des instructions et des préréglages d'essai au démarrage initial. カス

** Il a l'air complètement lie. ** Surtout les trois boutons du bas sont terribles. Je ne pouvais faire quelque chose comme ça parce que je n'avais pas assez de compétences techniques, J'ai conçu l'interface graphique avec wxpython pour la première fois, donc s'il vous plaît, pardonnez-moi Sai,

Il s'agit de discussions techniques

Merci d'être resté avec nous jusqu'à présent. Ci-dessous, nous présenterons le code d'introduction tout en montrant l'environnement.

Environnement prérequis

win10 64bit ** python3.8.4 ** En supposant que le PATH de python est en place Seulement ça. Si vous utilisez la version 32 bits de win10, lisez-la bien et continuez avec l'introduction.

Installez un navigateur appelé Chromium dans cet environnement et installez un package pour le gérer.

Installation des packages requis pour python

Démarrez l'invite de commande et appuyez sur la commande suivante.

pip install chromedriver_binary==84.0.4147.30.0
pip install wxpython
pip install pyperclip
pip install selenium
pip install beautifulsoup4

Je pense que cela se terminera bientôt de manière inattendue.

Installation de chrome

[Site Web officiel de Chromium pour Win10 64 bits](https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win_x64%2F768952%2Fchrome-win.zip?generation=1589490546798193&alt= DL à partir du support) et décompressez. Un dossier appelé «chrome-win» sera probablement créé, alors déplacez-le directement sous «C: \ Program Files». Si vous pouvez le déplacer, Chromium est prêt. Si vous n'êtes pas Win10 64bit et que vous souhaitez télécharger à partir du référentiel officiel, veuillez vous assurer que la version Chromium est 84.0.4147.0. À proprement parler, la version majeure devrait être 84, mais je n'ai pas confirmé l'opération, donc ...

Qu'est-ce que le chrome?

Il s'agit d'un navigateur Web open source et constitue la base de Google Chrome, comme vous pouvez le voir sur l'icône ci-dessous. En outre, à partir de juillet 2020, Opera et Microsoft Edge sont également en cours de développement sur la base de Chromium. chromium_logo

-Wikipwdia Le nom du projet Chromium vient de l'élément métallique chrome (chrome en anglais), qui est connu pour être utilisé pour le placage de fer et autres. Puisque le métal chromé est appelé chrome en anglais, il est venu à ce nom dans le sens de "choses utilisées pour faire (Google) Chrome".

Cependant, dans la gamme d'utilisation quotidienne, cela ressemble presque à Google Chrome, et vous pouvez utiliser Chromium sans réfléchir profondément (du moins pour moi).

Avantages de l'utilisation de Chrome

Les trois points suivants visent à choisir Chromium comme navigateur contrôlé au lieu de Google Chrome.

  1. Google Chrome a des mises à jour automatiques
  2. Il y a peu de personnes qui l'exploitent dans le
  3. Néanmoins, il peut être utilisé avec la même convivialité que Google Chrome

Tout d'abord, en ce qui concerne 1, il est gênant non seulement pour les navigateurs, mais également pour les applications qui ne disposent pas de mises à jour automatiques en raison de diverses restrictions, y compris des problèmes de sécurité. Cependant, dans cette application, c'est plutôt avantageux car il faut "faire correspondre la version principale du pilote et de l'application". De plus, cette fois, il démarre en mode sans tête, mais dans ce cas, l'utilisateur a tendance à le reconnaître comme "juste une application d'arrière-plan", donc Chromium ne se connecte pas intentionnellement au Web. En d'autres termes, il n'y a presque pas de souci de sécurité (bien sûr, ce n'est pas nul).

Concernant 2, ce translation-chan était à l'origine censé être déployé au sein du département, il y avait donc une possibilité que "des inconvénients surviennent si le navigateur que vous utilisez normalement est contrôlé". Je ne suis pas très doué pour les navigateurs, alors je voulais éviter IE, MS Edge, Google Chrome, FireFox, Opera et Sleipnir au cas où.

En ce qui concerne ** 3, honnêtement, c'est le plus gros développeur. ** Parce qu'il fonctionne avec le même pilote que Google Chrome, il a été facile à développer avec Google Chrome, à mettre en œuvre avec Chromium → tester dans une situation proche de l'environnement de production. Ça monte.

C'est pourquoi Chromium était si pratique.

Traduction-chan

C'est finalement le code source du corps principal. Traduisez le chrome installé ci-dessus avec le contrôle de Selenium.

import wx
import wx.lib.scrolledpanel
import pyperclip
import time
import urllib.parse
import chromedriver_binary
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
from time import sleep


class Translator:       #Classe qui définit la traduction par le sélénium
    def __init__(self):
        self.options = Options()
        self.options.binary_location =  "C:\\Program Files\\chrome-win\\chrome.exe"
        self.options.add_argument("--headless")          #Commencez en mode sans tête
        self.browser = webdriver.Chrome(options=self.options)
        #self.browser.minimize_window()                   #Si le proxy est activé, réduisez-le.
        self.browser.implicitly_wait(2)

    def trans(self, txt , lg1 , lg2):      #Fonction pour traduire de lg1 à lg2
        if txt == "":                      #Renvoie vide si l'entrée est vide
            return txt
        #Accédez après avoir incorporé la phrase que vous souhaitez traduire dans l'URL
        text_for_url = urllib.parse.quote_plus(txt, safe='')
        url = "https://translate.google.co.jp/#{1}/{2}/{0}".format(text_for_url , lg1 , lg2)
        self.browser.get(url)

        #attends un peu
        wait_time = len(txt) / 1000
        if wait_time < 0.5:
            wait_time = 0.5
        time.sleep(wait_time)

        #Extraire les résultats de la traduction
        soup = BeautifulSoup(self.browser.page_source, "html.parser")
        ret =  soup.find(class_="tlid-translation translation")

        return ret.text    

    def quit(self):
        self.browser.quit()


def main():
    #Obtenir le contenu du presse-papiers
    orig = str(pyperclip.paste())

    #Détecte les pauses et les divisions. À ce stade, les informations de saut de ligne"\r\n"Sera perdu
    orignal_elements = orig.splitlines()
    print(orignal_elements)

    #Variable qui stocke les chaînes de caractères liées à la traduction
    origs = []
    en_txt = []
    jp_txt = []

    #Variable globale pour obtenir une ligne vide
    global blank_row
    blank_row = []
    count = 0
    while count < len(orignal_elements):
        buf = orignal_elements[count]           #"   "Éliminez les éléments vides uniquement tels que
        buf = buf.replace(" " , "")             #Puisqu'il n'est pas possible de correspondre à une langue étrangère simplement en effaçant l'espace, faites la différence
        if buf != "":                           #S'il n'est pas vide, ajoutez-le à la cible de traduction
            origs.append(orignal_elements[count])
        else:
            blank_row.append(count)             #S'il est vide, il s'agissait à l'origine d'une ligne vide, alors obtenez l'emplacement de l'élément avec int
        count += 1
    
    #Définir 2 langues à traduire[Langue maternelle,Une langue étrangère]Nous prévoyons de le construire afin que la langue puisse être sélectionnée à partir du menu déroulant à l'avenir.
    global lg
    lg = ["ja" , "en"]

    #Définir deux langues pour la traduction inversée[Une langue étrangère,Japonais]
    global rev_lg
    rev_lg = list(reversed(lg))

    #Préparation de l'interface graphique
    app = wx.App()

    #Affichage pendant le chargement
    read_frame = wx.Frame(None, wx.ID_ANY, "En traduction...", size=(250,0))
    read_frame.Centre() #Affiché au centre
    read_frame.Show()

    global rows
    rows = len(origs)           #Notez le nombre de lignes car len contient 0

    for row in range(rows):     #Traduire d'abord en fonction du texte d'origine
        #Original
        txt = origs[row]
        #print("Original:",txt)

        #Anglais
        en_txt.append(translator.trans(origs[row], *lg))
        #print("Anglais:",en_txt)

        #Retraduction
        jp_txt.append(translator.trans(en_txt[row], *rev_lg))

    size = (900,600)
    global frame
    frame = wx.Frame(None, wx.ID_ANY, 'Traduction-chan', size=size)
    panel = wx.lib.scrolledpanel.ScrolledPanel(frame,-1, size=size, pos=(0,28), style=wx.SIMPLE_BORDER)
    panel.SetupScrolling()
    panel.SetBackgroundColour('#AFAFAF')

    global text
    global en_text
    global jp_text
    global btn
    layout = wx.FlexGridSizer(rows+1,4,0,0)

    text = [""]*rows            #Préparation du widget de texte d'origine
    en_text = [""]*rows         #Préparation du widget de texte anglais
    jp_text = [""]*rows         #Préparation du widget de traduction de texte
    btn = [""]*rows             #Préparation du widget du bouton de traduction

    cellsize = (270,90)
    for row in range(rows):
        #Original
        txt = origs[row]
        text[row] = wx.TextCtrl(panel, row , txt, style = wx.TE_MULTILINE,size=cellsize)
        #print("Original:",txt)

        #Anglais
        en_text[row] = wx.TextCtrl(panel, row , en_txt[row], style = wx.TE_MULTILINE,size=cellsize)
        en_text[row].Disable()      #Protégé en écriture
        #print("Anglais:",en_txt)

        #Retraduction
        jp_text[row] = wx.TextCtrl(panel, row , jp_txt[row], style = wx.TE_MULTILINE,size=cellsize)
        jp_text[row].Disable()      #Protégé en écriture
        #print("Retraduction:",jp_txt)

        #Bouton Traduire
        btn[row] = wx.Button(panel, row, "Traduction", size=(60, 40))
        btn[row].Bind(wx.EVT_BUTTON, OnClickBtn)            #Lier le bouton à l'événement


        #Disposition des widgets
        #layout.Add(text[row], flag=wx.ALIGN_LEFT | wx.GROW)         #Original
        layout.Add(text[row], flag=wx.SHAPED)         #Original
        layout.Add(jp_text[row], flag=wx.SHAPED)      #Retraduction
        layout.Add(en_text[row], flag=wx.SHAPED)      #Anglais
        layout.Add(btn[row],flag=wx.SHAPED | 
            wx.ALIGN_CENTER_VERTICAL | wx.TE_MULTILINE)             #Bouton Traduire
    
    copy_btn = wx.Button(panel, wx.ID_ANY, "Traduction terminée", size=(80, 40))
    copy_btn.Bind(wx.EVT_BUTTON, OnClickCopyBtn)
    layout.Add(copy_btn,flag=wx.SHAPED | 
        wx.ALIGN_CENTER_VERTICAL | wx.TE_MULTILINE)

    retrans_btn = wx.Button(panel, wx.ID_ANY, "Réinitialiser chaque cellule et retraduire", size=(200, 40))
    retrans_btn.Bind(wx.EVT_BUTTON, OnClickRetransBtn)
    layout.Add(retrans_btn,flag=wx.SHAPED | 
        wx.ALIGN_CENTER_VERTICAL | wx.TE_MULTILINE)
    
    exit_btn = wx.Button(panel, wx.ID_ANY, "Terminer la traduction", size=(120, 40))
    exit_btn.Bind(wx.EVT_BUTTON, OnClickExitBtn)
    layout.Add(exit_btn,flag=wx.SHAPED | 
        wx.ALIGN_CENTER_VERTICAL | wx.TE_MULTILINE)

    #Placement des boutons
    layout.AddGrowableCol(0, 3)
    layout.AddGrowableCol(1, 3)
    layout.AddGrowableCol(2, 3)
    layout.AddGrowableCol(3, 1)

    #Mise à jour de la mise en page
    panel.SetSizer(layout)

    #Définir la barre d'état
    frame.CreateStatusBar()
    frame.SetStatusText("Veuillez respecter l'obligation de confidentialité avant d'utiliser le service en ligne.")
    
    read_frame.Close()
    frame.Centre() #Affiché au centre
    frame.Show()
    app.MainLoop()


def OnClickBtn(event):
    num = event.GetId()

    btn[num].Disable()
    
    n_txt = text[num].GetValue()
    n_en_txt = translator.trans(n_txt, *lg)
    n_jp_txt = translator.trans(n_en_txt, *rev_lg)
    
    en_text[num].SetValue(n_en_txt)
    jp_text[num].SetValue(n_jp_txt)

    btn[num].Enable()

def copy_all():         #Une fonction qui copie le texte anglais du résultat de la traduction dans le presse-papiers

    fin_txt = ""        #Chaîne de caractères à copier dans le presse-papiers
    fin_txts = []       #Une chaîne de caractères qui stocke le texte anglais traduit pour chaque cellule

    for row in range(rows):
        fin_txts.append(en_text[row].GetValue()+"\r\n")     #Restaurer les informations de saut de ligne perdues avec la méthode des lignes fractionnées

    for blank in blank_row:
        fin_txts.insert(blank,"\r\n")                       #L'emplacement de la ligne vide est vide_Comme il est stocké en ligne, ajoutez une ligne vide

    for element in fin_txts:
        fin_txt += element                                  #Puisque les informations de saut de ligne ont été restaurées, elles sont combinées en tant que chaîne de caractères de sortie.

    return fin_txt

def OnClickCopyBtn(event):          #Lorsque le bouton [Traduction terminée] est enfoncé
    pyperclip.copy(copy_all())

def OnClickRetransBtn(event):       #Lorsque le bouton [Réinitialiser chaque cellule et retranslate] est enfoncé
    frame.Close()
    main()

def OnClickExitBtn(event):          #Lorsque le bouton [Quitter la traduction] est enfoncé
    pyperclip.copy(copy_all())
    frame.Close()
    translator.quit()


if __name__ == "__main__":
    translator=Translator()
main()

Enregistrez-le en tant que fichier de script python (.py) avec un nom approprié. Cliquez avec le bouton droit de la souris et exécutez-le pour démarrer Translation-chan. Essayez de commencer avec une copie du japonais approprié dans le presse-papiers.

Concernant le sélénium [Python] Mémo d'utilisation de Selenium (@ motoki1990) Toutes les opérations automatiques de Chrome avec Python + Selenium (@ mekakura),

Concernant l'utilisation de wxpthon Essayez d'utiliser wxPython (@ Kenta-Han),

Concernant la traduction automatique Automatiser la traduction de Google avec Selenium --Haruko Ameyomi,

J'ai fait référence à chacun. Je l'ai arrangé en combinaison, mais comme il s'agit d'un code créé par un travail urgent, je pense qu'il est structurellement étrange de différentes manières. Surtout la structure autour de la fonction principale est suspecte. N'est-ce pas suspect? À l'origine, il a été rendu principal en texte brut, il y a donc une partie qui a été rendue globale à la hâte pour que cela fonctionne. La partie étrange ici est que je suis encore un débutant, alors j'attends un professeur d'un expert.

Aussi, pour la personne merveilleuse qui fait une utilisation intensive de cette traduction, je vous dirai qu'il est possible de la démarrer avec une touche de raccourci (touche de raccourci). Veuillez essayer de le créer en vous référant ici. Vous n'avez pas besoin d'installer quoi que ce soit de nouveau à cet égard. Créer un raccourci pour le programme Python (Windows10)-@ Odanny

Dans les futures mises à jour, nous prévoyons de prendre en charge non seulement l'anglais mais également d'autres langues, nous allons donc procéder à l'apprentissage afin qu'il puisse être géré avec une seule fonction.

Annexe: programme d'installation simple pour win10 64 bits

Enfin, je voudrais vous présenter un installeur simple. ** Assurez-vous de l'exécuter avec les privilèges d'administrateur **


@echo off
Vérifier le codage des caractères rem
chcp 65001
setlocal

start https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win_x64%%2F768952%%2Fchrome-win.zip?generation=1589490546798193^&alt=media
Lorsque l'écho DL est terminé[Enter]appuyez sur la touche&& pause
Powershell -command "Expand-Archive -Path $env:USERPROFILE\Downloads\Win_x64_768952_chrome-win.zip -DestinationPath C:\Program` Files"
del %USERPROFILE%\Downloads\Win_x64_768952_chrome-win.zip

py -m pip install chromedriver_binary==84.0.4147.30.0
py -m pip install wxpython
py -m pip install pyperclip
py -m pip install selenium
py -m pip install beautifulsoup4

endlocal
exit

Tout va bien, alors enregistrez-le en tant que fichier batch (.bat) et exécutez-le avec ** les privilèges d'administrateur. ** **

Les perspectives de Translation-chan

Cette traduction manque beaucoup de fonctions. Pour l'instant, nous prévoyons de mettre en œuvre les fonctions suivantes.

  1. Sophistication GUI / UX 1-1. Fonction de redimensionnement de chaque cellule 1-2. Bouton Ajouter une cellule 1-3. Affichage séquentiel à partir des cellules traduites
  2. Sélectionnez une langue avec la liste déroulante ~~ 3. Réglez le délimiteur sur [. ] À [. (Période pleine largeur)] [? ] Etc. ~~ → 29/07: Amélioration de la prise en charge de la conservation des informations de saut de ligne.
  3. Wordbook avec fonction dictionnaire (correspond aux termes de l'industrie et aux termes internes) Exemple: confidentiel
  4. Mode résident
  5. Fonction de conversion de mot

Liste de références

C'est un article très utile que j'ai visité plusieurs fois. Nous aimerions profiter de cette occasion pour vous remercier. De plus, s'il y a un problème avec cet article, nous le supprimerons immédiatement.

[Python] Mémo d'utilisation du sélénium-@ motoki1990 ・ Toutes les opérations automatiques de Chrome avec Python + Selenium-@ mekakura ・ Essayez d'utiliser wxPython-@ Kenta-Han ・ Automatisation de la traduction Google avec Selenium --Haruko Ameyomi

Ce n'est pas grave si vous le copiez, alors j'espère que diverses personnes seront intéressées par Python.

mettre à jour les informations

7/29 Mettre à jour le code source ・ Accélération de l'opération ・ Prend en charge la conservation des informations de saut de ligne → Modifier le délimiteur en conséquence (ponctuation → saut de ligne) Cela a été reflété dans le code source. Depuis que j'ai changé les spécifications, j'ai mis à jour l'image de Translate-chan (une image comme une lie).

Recommended Posts

[Traduction automatique] Outil d'aide à la saisie en anglais Translation-chan [Python]
[Python] Japonais simple ⇒ J'ai essayé de créer un outil de traduction en anglais
Outil de vérification orthographique du mot anglais (fabriqué par python)
[Python] Entrée standard