import json import hashlib from scripts.physton_prompt.get_lang import get_lang from scripts.physton_prompt.get_translate_apis import get_translate_apis, unprotected_translate_api_config from scripts.physton_prompt.translator.alibaba_translator import AlibabaTranslator from scripts.physton_prompt.translator.amazon_translator import AmazonTranslator from scripts.physton_prompt.translator.baidu_translator import BaiduTranslator from scripts.physton_prompt.translator.deepl_translator import DeeplTranslator from scripts.physton_prompt.translator.google_tanslator import GoogleTranslator from scripts.physton_prompt.translator.microsoft_translator import MicrosoftTranslator from scripts.physton_prompt.translator.openai_translator import OpenaiTranslator from scripts.physton_prompt.translator.tencent_translator import TencentTranslator from scripts.physton_prompt.translator.translators_translator import TranslatorsTranslator from scripts.physton_prompt.translator.yandex_translator import YandexTranslator from scripts.physton_prompt.translator.youdao_translator import YoudaoTranslator from scripts.physton_prompt.translator.mymemory_translator import MyMemoryTranslator from scripts.physton_prompt.translator.niutrans_translator import NiutransTranslator from scripts.physton_prompt.translator.caiyun_translator import CaiyunTranslator from scripts.physton_prompt.translator.volcengine_translator import VolcengineTranslator from scripts.physton_prompt.translator.iflytekV1_translator import IflytekV1Translator from scripts.physton_prompt.translator.iflytekV2_translator import IflytekV2Translator from scripts.physton_prompt.translator.mbart50_translator import MBart50Translator caches = {} def translate(text, from_lang, to_lang, api, api_config=None): if api_config is None: api_config = {} global caches def _translate_result(success, message, translated_text): return { "success": success, "message": message, "text": text, "translated_text": translated_text, "from_lang": from_lang, "to_lang": to_lang, "api": api } def _cache_name(text): cache_name = f'{api}.{from_lang}.{to_lang}.{text}.' + json.dumps(api_config) cache_name = hashlib.md5(cache_name.encode('utf-8')).hexdigest() return cache_name apis = get_translate_apis() find = False for group in apis['apis']: for item in group['children']: if item['key'] == api: find = item break if not find: return _translate_result(False, get_lang('translate_api_not_found'), '') try: texts = [] if isinstance(text, list): if len(text) < 1: return _translate_result(False, get_lang('translate_text_is_empty'), '') for item in text: texts.append(None) for index in range(len(text)): item = text[index] item = item.strip() if item == '': texts[index] = '' continue cache_name = _cache_name(item) if cache_name in caches: texts[index] = caches[cache_name] else: texts[index] = None else: text = text.strip() if text == '': return _translate_result(False, get_lang('translate_text_is_empty'), '') cache_name = _cache_name(text) if cache_name in caches: return _translate_result(True, '', caches[cache_name]) if api == 'google': translator = GoogleTranslator() elif api == 'microsoft': translator = MicrosoftTranslator() elif api == 'openai': translator = OpenaiTranslator() elif api == 'amazon': translator = AmazonTranslator() elif api == 'deepl': translator = DeeplTranslator() elif api == 'baidu': translator = BaiduTranslator() elif api == 'alibaba': translator = AlibabaTranslator() elif api == 'yandex': translator = YandexTranslator() elif api == 'youdao': translator = YoudaoTranslator() elif api == 'tencent': translator = TencentTranslator() elif api == 'myMemory_free' or api == 'myMemory': translator = MyMemoryTranslator() elif api == 'niutrans': translator = NiutransTranslator() elif api == 'caiyun': translator = CaiyunTranslator() elif api == 'volcengine': translator = VolcengineTranslator() elif api == 'iflytekV1': translator = IflytekV1Translator() elif api == 'iflytekV2': translator = IflytekV2Translator() elif api == 'mbart50': translator = MBart50Translator() elif 'type' in find and find['type'] == 'translators': translator = TranslatorsTranslator(api) translator.set_translator(find['translator']) else: return _translate_result(False, get_lang('translate_api_not_support'), '') translator.set_from_lang(from_lang) translator.set_to_lang(to_lang) translator.set_api_config(unprotected_translate_api_config('translate_api.' + api, api_config)) if isinstance(text, list): translate_texts = [] translate_indexes = [] for index in range(len(texts)): item = texts[index] if item is None: translate_indexes.append(index) translate_texts.append(text[index]) if len(translate_texts) < 1: return _translate_result(True, '', texts) result = translator.translate_batch(translate_texts) for index in range(len(result)): item = result[index] texts[translate_indexes[index]] = item caches[_cache_name(translate_texts[index])] = item return _translate_result(True, '', texts) else: translated_text = translator.translate(text).strip() caches[_cache_name(text)] = translated_text return _translate_result(True, '', translated_text) except Exception as e: # print(e) return _translate_result(False, str(e), '')