Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions deep_translator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
from deep_translator.deepl import DeeplTranslator
from deep_translator.detection import batch_detection, single_detection
from deep_translator.google import GoogleTranslator
from deep_translator.googleweb import GoogleTranslatorWeb
from deep_translator.libre import LibreTranslator
from deep_translator.linguee import LingueeTranslator
from deep_translator.microsoft import MicrosoftTranslator
from deep_translator.mymemory import MyMemoryTranslator
from deep_translator.papago import PapagoTranslator
from deep_translator.pons import PonsTranslator
from deep_translator.qcri import QcriTranslator
from deep_translator.tencent import TencentTranslator
from deep_translator.yandex import YandexTranslator

__author__ = """Nidhal Baccouri"""
Expand All @@ -23,6 +23,7 @@

__all__ = [
"GoogleTranslator",
"GoogleTranslatorWeb",
"PonsTranslator",
"LingueeTranslator",
"MyMemoryTranslator",
Expand All @@ -33,7 +34,6 @@
"LibreTranslator",
"PapagoTranslator",
"ChatGptTranslator",
"TencentTranslator",
"BaiduTranslator",
"single_detection",
"batch_detection",
Expand Down
3 changes: 2 additions & 1 deletion deep_translator/google.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ def __init__(
@param target: target language to translate to
"""
self.proxies = proxies
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}
super().__init__(
base_url=BASE_URLS.get("GOOGLE_TRANSLATE"),
source=source,
Expand Down Expand Up @@ -65,7 +66,7 @@ def translate(self, text: str, **kwargs) -> str:
self._url_params[self.payload_key] = text

response = requests.get(
self._base_url, params=self._url_params, proxies=self.proxies
self._base_url, params=self._url_params, proxies=self.proxies, headers=self.headers
)
if response.status_code == 429:
raise TooManyRequests()
Expand Down
70 changes: 70 additions & 0 deletions deep_translator/googleweb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Requirement: pip3 install setuptools selenium undetected-chromedriver
# xpz3

import undetected_chromedriver as uc
import urllib.parse
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

class GoogleTranslatorWeb:
"""
Google Translate scraper using headless Chrome by directly parsing the translation page.
"""

def __init__(self, headless: bool = True, driver_wait: int = 3):
"""
Initialize the translator.
:param headless: Run Chrome in headless mode.
"""
self.headless = headless
self.driver_wait = driver_wait
options = uc.ChromeOptions()
if self.headless:
options.headless = True
options.add_argument("--headless=new")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--window-size=1200,800")

self.driver = uc.Chrome(options=options)
self.wait = WebDriverWait(self.driver, self.driver_wait)

def translate(self, text: str, source_lang: str = "auto", target_lang: str = "en") -> str:
"""
Translate text using Google Translate by directly loading the translation page.
:param text: The text to translate.
:param source_lang: Source language (default: auto-detect).
:param target_lang: Target language.
:return: Full translated text.
"""
if not text.strip():
return ""

encoded_text = urllib.parse.quote(text)

translate_url = f"https://translate.google.com/?hl=en&q={encoded_text}&sl={source_lang}&tl={target_lang}&text={encoded_text}&op=translate"

self.driver.get(translate_url)
#sleep(3)

try:
output_box_xpath = '//span[@class="ryNqvb"]'
translated_elements = self.wait.until(EC.presence_of_all_elements_located((By.XPATH, output_box_xpath)))

translated_text = " ".join([elem.text.strip() for elem in translated_elements if elem.text.strip()])
return translated_text if translated_text else "Translation not found"

except Exception:
return "Translation not found"


def close(self):
"""Properly close the Selenium browser session."""
if self.driver:
try:
self.driver.quit()
del self.driver
self.driver = None
except Exception as e:
print(f"Warning: Issue while closing the browser: {e}")