-
Notifications
You must be signed in to change notification settings - Fork 52
/
Copy pathcore.py
189 lines (173 loc) · 8.79 KB
/
core.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# -*- coding: utf-8 -*-
"""
@Author : Xhunmon
@Time : 2023/4/22 22:29
@FileName: core.py
@desc:
"""
import translators as ts
from config import *
from ui import LoadingWin
class Language(object):
def __init__(self, id_name, full_name, zh_name=None, google=True, yandex=True, bing=True, baidu=True, alibaba=True,
tencent=True, youdao=True, sogou=True, deepl=True, caiyun=True, argos=True):
self.id_name = id_name
self.zh_name = zh_name if zh_name else full_name
self.full_name = full_name
self.google = google
self.yandex = yandex
self.bing = bing
self.baidu = baidu
self.alibaba = alibaba
self.tencent = tencent
self.youdao = youdao
self.sogou = sogou
self.deepl = deepl
self.caiyun = caiyun
self.argos = argos
def is_enable(self, translator: str):
return eval('self.' + translator)
class Translation(object):
def __init__(self):
self.is_full = get_cache(Key.FULL_TRANSLATE, False) # 显示所有翻译平台和语言,但是未校验
self.is_zh = is_zh_language() # 是否是中文
self.select_translator = 'baidu'
self.select_from_lang = '自动' if self.is_zh else 'auto'
self.select_to_lang = '英语' if self.is_zh else 'english'
self.languages = conf.translate()
# self.languages.append(Language('en', 'english', '英语'))
# self.languages.append(Language('zh', 'chinese', '中文'))
# self.languages.append(Language('ar', 'arabic', '阿拉伯语', deepl=False, caiyun=False))
# self.languages.append(Language('ru', 'russian', '俄语'))
# self.languages.append(Language('fr', 'french', '法语'))
# self.languages.append(Language('de', 'german', '德语', alibaba=False, caiyun=False))
# self.languages.append(Language('es', 'spanish', '西班牙语'))
# self.languages.append(Language('pt', 'portuguese', '葡萄牙语', caiyun=False))
# self.languages.append(Language('it', 'italian', '意大利语', caiyun=False))
# self.languages.append(Language('ja', 'japanese', '日本语', alibaba=False))
# self.languages.append(Language('ko', 'korean', '朝鲜语', alibaba=False, deepl=False, caiyun=False))
# self.languages.append(
# Language('el', 'greek', '希腊语', alibaba=False, tencent=False, youdao=False, caiyun=False, argos=False))
def set_to_lang(self, lang):
if lang:
self.select_to_lang = lang
def set_from_lang(self, lang):
if lang:
self.select_from_lang = lang
def check_select_language(self):
languages = self.get_languages()
has_from = False
has_to = False
for lg in languages: # lg为full_name
if lg == self.select_from_lang:
has_from = True
if lg == self.select_to_lang:
has_to = True
if not has_from:
self.select_from_lang = '自动' if self.is_zh else 'auto'
if not has_to:
self.select_to_lang = '英语' if self.is_zh else 'english'
def get_translators(self):
# 'google', 'yandex', 'bing', 'baidu', 'alibaba', 'tencent', 'youdao', 'sogou', 'deepl', 'caiyun', 'argos',
# 'apertium', 'cloudYi', 'elia', 'iciba', 'iflytek', 'iflyrec', 'itranslate', 'judic', 'languageWire',
# 'lingvanex', 'niutrans', 'mglip', 'modernMt', 'myMemory', 'papago', 'qqFanyi', 'qqTranSmart', 'reverso',
# 'sysTran', 'tilde', 'translateCom', 'translateMe', 'utibet', 'volcEngine', 'yeekit'
# {"en_name": "Chinese(简体)", "id_name": "zh-CHS", "zh_name": "简体", "google": "zh-CN", "yandex": "zh", "bing": "zh-Hans", "baidu": "zh", "alibaba": "zh", "tencent": "zh", "youdao": "Y", "sogou": "Y", "deepl": "zh", "caiyun": "zh", "argos": "zh"}
tors = list(self.languages[0].keys())
tors.remove('en_name')
tors.remove('id_name')
tors.remove('zh_name')
return tors
def get_languages(self):
support = []
for lg in self.languages: # 取出字典
if lg[self.select_translator] == '': # 不支持
continue
if self.is_zh:
support.append(lg['zh_name'])
else:
support.append(lg['en_name'])
return support
def choose_translator(self, tl):
self.select_translator = tl
def _search_id_name(self, is_from=True):
key = self.select_from_lang if is_from else self.select_to_lang
for lg in self.languages: # 取出字典
if self.is_zh: # 查找出 zh_name 对应的
if lg['zh_name'] == key:
if lg[self.select_translator] == '':
continue
elif lg[self.select_translator] == 'Y':
return lg['id_name']
else:
return lg[self.select_translator]
else:
if lg['en_name'] == key:
if lg[self.select_translator] == '':
continue
elif lg[self.select_translator] == 'Y':
return lg['id_name']
else:
return lg[self.select_translator]
return None
def get_id_name(self, is_from=True):
if is_from:
from_key = self.select_from_lang
if from_key == '自动' or from_key == 'auto':
return 'auto'
search = self._search_id_name(True)
return search if search else 'auto'
else: # to_ 目标
search = self._search_id_name(False)
return search if search else 'en' # 最后还是没有,默认英语
def translate(self, window, content, is_html=False, file_path: str = None):
try:
if file_path and file_path.endswith('.srt'):
from load_srt import Translator
import utils, os
filename, ext = os.path.splitext(file_path)
out_path = f'{filename}_output{ext}'
tl = Translator()
proxy = get_cache(Key.PROXY_INPUT, None) if get_cache(Key.PROXY_ENABLE, False) else None
if proxy:
proxy_real = proxy.replace(' ', '').replace('\n', '')
proxy_spit = proxy_real.split('://')
proxy_user = {proxy_spit[0]: proxy_real}
tl.proxy_user = proxy_user
else:
tl.proxy_user = None
tl.translators = {self.select_translator: 3}
tl.translate_file(file_path, out_path, self.get_id_name(is_from=True), self.get_id_name(is_from=False))
window['OUT_TEXT'].update(f'输出文件:{out_path}')
else:
# ts.preaccelerate()
# 是否使用了代理 export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
proxy = get_cache(Key.PROXY_INPUT, None) if get_cache(Key.PROXY_ENABLE, False) else None
proxy_user = None
if proxy:
proxy_real = proxy.replace(' ', '').replace('\n', '')
proxy_spit = proxy_real.split('://')
proxy_user = {proxy_spit[0]: proxy_real}
if is_html:
# result = ts.translate_html(content, translator=self.select_translator,
# from_language=self.get_id_name(is_from=True),
# to_language=self.get_id_name(is_from=False), proxies=proxy_user)
result = ts.translate_html(content, translator=self.select_translator,
from_language=self.get_id_name(is_from=True),
to_language=self.get_id_name(is_from=False), proxies=proxy_user,
if_ignore_empty_query=True, if_show_time_stat=True)
else:
result = ts.translate_text(content, translator=self.select_translator,
from_language=self.get_id_name(is_from=True),
to_language=self.get_id_name(is_from=False), proxies=proxy_user)
if file_path is not None:
import utils, os
filename, ext = os.path.splitext(file_path)
out_path = f'{filename}_output{ext}'
utils.write(result, out_path)
window['OUT_TEXT'].update(f'输出文件:{out_path}')
else:
window['OUT_TEXT'].update(result)
except Exception as e:
result = str(e)
LoadingWin.is_loading = False