ro  fr  en  es  pt  ar  zh  hi  de  ru
ART 2.0 ART 3.0 ART 4.0 ART 5.0 ART 6.0 Pinterest

Example of Python code that translates the website into other languages, with the DeepL library + API Key şi BeautifulSoup

June 20, 2021, in Leadership and Attitude, by Neculai Fantanaru

You can view the full code here: https://pastebin.com/KMduu6HV

Install Python. Then install the following two libraries using the Command Prompt (cmd) interpreter in Windows10:

py- m pip install pydeepl
py -m pip install beautifulsoup4

Python will automatically translate the following html tags with DeepL library:

<title>Your Text</title>
<meta name="description" content="Your Text"/>

Also, Python code will also automatically translate the contents of the following tags (Your Text), but only if these tags are framed by <!-- ARTICOL START --> and <!-- ARTICOL START --> html comments. Of course, you will need to replace these tags with your own tags.

<!-- ARTICOL START -->

<h1 class="den_articol" itemprop="name">Your Text</h1>
<p class="text_obisnuit">Your Text</p>
<p class="text_obisnuit2">Your Text</p>
<span class="text_obisnuit2">Your Text</span>
<span class="text_obisnuit">Your Text</span>
<li class="text_obisnuit">Your Text</li>
<a class="linkMare" href="https://neculaifantanaru.com/en/">Your Text</a>
<h4 class="text_obisnuit2>Your Text</h4>
<h3 class="text_obisnuit2>Your Text</h3>
<h5 class="text_obisnuit2>Your Text</h5>

<!-- ARTICOL FINAL -->

THE CODE: Copy and run the code below in any interpreter program (I use pyScripter) . Don't forget to change the path in the "files_from_folder" line. Don't forget to change the API Key (found 3 times in the code) And here is the list of languages that can be translated: LANG. Register on DeepL as to get API Key.

from bs4 import BeautifulSoup
from bs4.formatter import HTMLFormatter
from googletrans import Translator
import requests
import json

if False:
    test = requests.post('https://api-free.deepl.com/v2/translate',
                    data={'auth_key':'PUT HERE YOUR API KEY:fx',
                          'text':'hello',
                          'source_lang':'EN',
                          'target_lang':'ZH'  #translates into Chinesse
                          }).content

    print(json.loads(test)['translations'][0]['text'])

translator = Translator()

class UnsortedAttributes(HTMLFormatter):
    def attributes(self, tag):
        for k, v in tag.attrs.items():
            yield k, v

files_from_folder = r"c:\test" #Change with your basic Path, for example a Folder with your website written in English
source_language = 'EN'  #translates from English

use_translate_folder = False

destination_language = 'ZH'  #translates into Chinesse

extension_file = ".html"

import os

directory = os.fsencode(files_from_folder)

def recursively_translate(node):
    for x in range(len(node.contents)):
        if isinstance(node.contents[x], str):
            if node.contents[x].strip() != '':
                try:
                    newtext = requests.post('https://api-free.deepl.com/v2/translate',
                    data={'auth_key':'PUT HERE YOUR API KEY:fx',
                          'text':node.contents[x],
                          'source_lang':source_language,
                          'target_lang':destination_language
                          }).content
                    node.contents[x].replaceWith(json.loads(newtext)['translations'][0]['text'])
                except:
                    pass
        elif node.contents[x] != None:
            recursively_translate(node.contents[x])
    
for file in os.listdir(directory):
    filename = os.fsdecode(file)
    print(filename)
    if filename == 'y_key_e479323ce281e459.html' or filename == 'TS_4fg4_tr78.html':
        continue
    if filename.endswith(extension_file): 
        with open(os.path.join(files_from_folder, filename), encoding='utf-8') as html:
            soup = BeautifulSoup('<pre>' + html.read() + '</pre>', 'html.parser')
            for title in soup.findAll('title'):
                recursively_translate(title)
                
            for meta in soup.findAll('meta', {'name':'description'}):
                try:
                    newtext = requests.post('https://api-free.deepl.com/v2/translate',
                    data={'auth_key':'PUT HERE YOUR API KEY:fx',
                          'text':meta['content'],
                          'source_lang':source_language,
                          'target_lang':destination_language
                          }).content
                    meta['content'] = json.loads(newtext)['translations'][0]['text']
                except:
                    pass

            for h1 in soup.findAll('h1', {'itemprop':'name'}, class_='den_articol'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(h1)) < end_comment:
                    recursively_translate(h1)

            for p in soup.findAll('p', class_='text_obisnuit'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(p)) < end_comment:
                    recursively_translate(p)
                
            for p in soup.findAll('p', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(p)) < end_comment:
                    recursively_translate(p)

            for span in soup.findAll('span', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(span)) < end_comment:
                    recursively_translate(span)

            for li in soup.findAll('li', class_='text_obisnuit'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(li)) < end_comment:
                    recursively_translate(li)

            for a in soup.findAll('a', class_='linkMare'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(a)) < end_comment:
                    recursively_translate(a)

            for h4 in soup.findAll('h4', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(h4)) < end_comment:
                    recursively_translate(h4)

            for h5 in soup.findAll('h5', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(h5)) < end_comment:
                    recursively_translate(h5)

        print(f'{filename} translated')
        soup = soup.encode(formatter=UnsortedAttributes()).decode('utf-8')
        new_filename = f'{filename.split(".")[0]}_{destination_language}.html'
        if use_translate_folder:
            try:
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
            except:
                os.mkdir(files_from_folder+r'\translated')
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
        else:
            with open(os.path.join(files_from_folder, new_filename), 'w', encoding='utf-8') as html:
                html.write(soup[5:-6])

That's all folks.

If you like my code, then make me a favor: translate your website into Romanian, "ro".

See also another version of Python Translate: BeautifulSoup Library or at this code: Google Translate API Key

 


Latest articles accessed by readers:

  1. An Eye To See And A Mind To Understand
  2. Turn Towards Me With An Eye Full Of Your Own Gaze
  3. The Snapshot Of Magic In God's Universe
  4. Rhythm Of My Heart

Donate via Paypal

Alternate Text

RECURRENT DONATION

Donate monthly to support
the NeculaiFantanaru.com project

SINGLE DONATION

Donate the desired amount to support
the NeculaiFantanaru.com project

Donate by Bank Transfer

Account Ron: RO34INGB0000999900448439

Open account at ING Bank

Join The Neculai Fantanaru Community



* Note: If you want to read all my articles in real time, please check the romanian version !
decoration
About | Site Map | Partners | Feedback | Terms & Conditions | Privacy | RSS Feeds
© Neculai Fântânaru - All rights reserved