111 lines
3.7 KiB
Python
111 lines
3.7 KiB
Python
import translators as ts
|
|
import re
|
|
|
|
# 输入长度限制
|
|
INPUT_LIMIT = 1000
|
|
|
|
def split_text_for_translation(text):
|
|
"""
|
|
按段落和完整句子拆分文本,返回句子列表(保持原有段落结构)。
|
|
"""
|
|
paragraphs = text.split('\n')
|
|
split_paragraphs = []
|
|
# 句子分隔符:句号、问号、感叹号(英文和中文)
|
|
sentence_pattern = re.compile(r'([^.!?。!?]+[.!?。!?])', re.M)
|
|
|
|
for para in paragraphs:
|
|
if not para.strip():
|
|
split_paragraphs.append([''])
|
|
continue
|
|
|
|
# 如果段落长度小于INPUT_LIMIT,直接添加
|
|
if len(para) < INPUT_LIMIT:
|
|
split_paragraphs.append([para])
|
|
continue
|
|
|
|
# 分割句子
|
|
sentences = sentence_pattern.findall(para)
|
|
|
|
# 若正则未能分出句子,则按照INPUT_LIMIT拆分
|
|
if not sentences:
|
|
sentences = [para[i:i+INPUT_LIMIT] for i in range(0, len(para), INPUT_LIMIT)]
|
|
|
|
# 组合句子的逻辑
|
|
optimized_sentences = []
|
|
current_group = []
|
|
current_length = 0
|
|
|
|
for sent in sentences:
|
|
# 计算当前句子长度
|
|
sent_length = len(sent)
|
|
|
|
# 如果加入这个句子后总长度小于INPUT_LIMIT,则加入
|
|
if current_length + sent_length < INPUT_LIMIT:
|
|
current_group.append(sent)
|
|
current_length += sent_length
|
|
else:
|
|
# 如果当前组不为空,先保存当前组
|
|
if current_group:
|
|
optimized_sentences.append(''.join(current_group))
|
|
|
|
# 重置组
|
|
current_group = [sent]
|
|
current_length = sent_length
|
|
|
|
# 添加最后一组
|
|
if current_group:
|
|
optimized_sentences.append(''.join(current_group))
|
|
|
|
split_paragraphs.append(optimized_sentences)
|
|
|
|
return split_paragraphs
|
|
|
|
def translate_text(text, from_lang='en', to_lang='zh'):
|
|
"""
|
|
自动处理长文本,按段落和句子拆分,逐句翻译,组合返回。
|
|
对于短文本,直接翻译。
|
|
"""
|
|
if not text:
|
|
return ""
|
|
|
|
try:
|
|
# 如果整个文本长度小于INPUT_LIMIT,直接翻译
|
|
if len(text) < INPUT_LIMIT:
|
|
return ts.translate_text(text, translator='bing', from_language=from_lang, to_language=to_lang)
|
|
|
|
# 拆分文本为段落和句子
|
|
split_paragraphs = split_text_for_translation(text)
|
|
|
|
translated_paragraphs = []
|
|
|
|
for sentences in split_paragraphs:
|
|
if sentences == ['']:
|
|
translated_paragraphs.append('')
|
|
continue
|
|
|
|
translated_sentences = []
|
|
for sent in sentences:
|
|
sent = sent.strip()
|
|
if not sent:
|
|
continue
|
|
# 逐句翻译
|
|
translated = ts.translate_text(sent, translator='bing', from_language=from_lang, to_language=to_lang)
|
|
translated_sentences.append(translated)
|
|
translated_paragraphs.append(''.join(translated_sentences))
|
|
|
|
return '\n'.join(translated_paragraphs)
|
|
except Exception as e:
|
|
return f"[翻译失败] {str(e)}"
|
|
|
|
|
|
def translate_texts(strings, target_language):
|
|
translated_strings = []
|
|
for text in strings:
|
|
try:
|
|
translated_string = translate_text(text, 'auto', target_language)
|
|
translated_strings.append(translated_string)
|
|
except Exception as e:
|
|
translated_strings.append(f"Translation error: {str(e)}")
|
|
|
|
return translated_strings
|