Skip to content

Commit

Permalink
feat(translation): add Bing translator support
Browse files Browse the repository at this point in the history
- import BingTranslator in main.py
- add --bing argument for command line
- update service validation to include Bing
- implement BingTranslator class in translator.py
- add necessary methods and attributes for Bing translation
  • Loading branch information
awwaawwa committed Jan 15, 2025
1 parent 4c94430 commit 6642c9a
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 6 deletions.
46 changes: 45 additions & 1 deletion yadt/document_il/translator/translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ def __init__(self, lang_in, lang_out, ignore_cache):
def __del__(self):
print(f"{self.name} translate call count: {self.translate_call_count}")
print(
f"{self.name} translate cache call count: {self.translate_cache_call_count}"
f"{self.name} translate cache call count: {
self.translate_cache_call_count}"
)

def add_cache_impact_parameters(self, k: str, v):
Expand Down Expand Up @@ -168,6 +169,49 @@ def do_translate(self, text):
return remove_control_characters(result)


class BingTranslator(BaseTranslator):
# https://github.com/immersive-translate/old-immersive-translate/blob/6df13da22664bea2f51efe5db64c63aca59c4e79/src/background/translationService.js
name = "bing"
lang_map = {"zh": "zh-Hans"}

def __init__(self, lang_in, lang_out, ignore_cache=False):
super().__init__(lang_in, lang_out, ignore_cache)
self.session = requests.Session()
self.endpoint = "https://www.bing.com/translator"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0", # noqa: E501
}

def find_sid(self):
response = self.session.get(self.endpoint)
response.raise_for_status()
url = response.url[:-10]
ig = re.findall(r"\"ig\":\"(.*?)\"", response.text)[0]
iid = re.findall(r"data-iid=\"(.*?)\"", response.text)[-1]
key, token = re.findall(
r"params_AbusePreventionHelper\s=\s\[(.*?),\"(.*?)\",",
response.text
)[0]
return url, ig, iid, key, token

def do_translate(self, text):
text = text[:1000] # bing translate max length
url, ig, iid, key, token = self.find_sid()
response = self.session.post(
f"{url}ttranslatev3?IG={ig}&IID={iid}",
data={
"fromLang": self.lang_in,
"to": self.lang_out,
"text": text,
"token": token,
"key": key,
},
headers=self.headers,
)
response.raise_for_status()
return response.json()[0]["translations"][0]["text"]


class OpenAITranslator(BaseTranslator):
# https://github.com/openai/openai-python
name = "openai"
Expand Down
20 changes: 15 additions & 5 deletions yadt/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import logging
import argparse
import httpx
from yadt.document_il.translator.translator import OpenAITranslator, GoogleTranslator
from yadt.document_il.translator.translator import OpenAITranslator, GoogleTranslator, BingTranslator
from yadt.document_il.translator.translator import set_translate_rate_limiter
from yadt.translation_config import TranslationConfig # noqa: E402

Expand Down Expand Up @@ -105,18 +105,22 @@ def create_parser():
service_params = translation_params.add_mutually_exclusive_group()
service_params.add_argument(
"--openai",
"-oai",
default=False,
action="store_true",
help="Use OpenAI translator.",
)
service_params.add_argument(
"--google",
"-g",
default=False,
action="store_true",
help="Use Google translator.",
)
service_params.add_argument(
"--bing",
default=False,
action="store_true",
help="Use Bing translator.",
)
openai_params = parser.add_argument_group(
"Translation - OpenAI Options", description="OpenAI specific options"
)
Expand Down Expand Up @@ -188,8 +192,8 @@ def main():
create_cache_folder()

# 验证翻译服务选择
if not (args.openai or args.google):
parser.error("必须选择一个翻译服务:--openai 或 --google")
if not (args.openai or args.google or args.bing):
parser.error("必须选择一个翻译服务:--openai、--google 或 --bing")

# 验证 OpenAI 参数
if args.openai and not args.openai_api_key:
Expand All @@ -205,6 +209,12 @@ def main():
api_key=args.openai_api_key,
ignore_cache=args.ignore_cache,
)
elif args.bing:
translator = BingTranslator(
lang_in=args.lang_in,
lang_out=args.lang_out,
ignore_cache=args.ignore_cache,
)
else:
translator = GoogleTranslator(
lang_in=args.lang_in,
Expand Down

0 comments on commit 6642c9a

Please sign in to comment.