Files
2025-05-11 00:12:03 +08:00

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