修复docx工作流译文无法附加在原文后
This commit is contained in:
@@ -334,7 +334,6 @@ class DocxTranslator(AiTranslator):
|
|||||||
self.logger.debug(f"尝试删除一个不存在的run元素。这通常是安全的。")
|
self.logger.debug(f"尝试删除一个不存在的run元素。这通常是安全的。")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# ---------- 代码修改部分:重写 _after_translate 方法 ----------
|
|
||||||
def _after_translate(self, doc: DocumentObject, elements: List[Dict[str, Any]], translated: List[str],
|
def _after_translate(self, doc: DocumentObject, elements: List[Dict[str, Any]], translated: List[str],
|
||||||
originals: List[str]) -> bytes:
|
originals: List[str]) -> bytes:
|
||||||
if len(elements) != len(translated):
|
if len(elements) != len(translated):
|
||||||
@@ -367,13 +366,35 @@ class DocxTranslator(AiTranslator):
|
|||||||
translated_paragraph_obj = Paragraph(translated_p_element, paragraph._parent)
|
translated_paragraph_obj = Paragraph(translated_p_element, paragraph._parent)
|
||||||
segments_for_this_para = paragraph_segments[para_id]
|
segments_for_this_para = paragraph_segments[para_id]
|
||||||
|
|
||||||
|
# --- [BUG修复] ---
|
||||||
|
# 获取原始段落和副本段落中的所有 run 列表
|
||||||
|
original_runs = paragraph.runs
|
||||||
|
copied_runs = translated_paragraph_obj.runs
|
||||||
|
|
||||||
|
# 创建一个从原始 run 的 element ID 到 副本 run 对象的映射
|
||||||
|
# 这能保证我们能精确找到每个原始 run 在副本中的对应项
|
||||||
|
run_map = {
|
||||||
|
id(orig_run.element): copied_run
|
||||||
|
for orig_run, copied_run in zip(original_runs, copied_runs)
|
||||||
|
}
|
||||||
|
# --- [BUG修复结束] ---
|
||||||
|
|
||||||
for seg_info in segments_for_this_para:
|
for seg_info in segments_for_this_para:
|
||||||
element_index = seg_info["index"]
|
element_index = seg_info["index"]
|
||||||
translation = seg_info["translation"]
|
translation = seg_info["translation"]
|
||||||
original_element_info = elements[element_index]
|
original_element_info = elements[element_index]
|
||||||
|
|
||||||
|
# --- [BUG修复] 使用映射来获取正确的副本Runs ---
|
||||||
|
runs_from_copy = [run_map[id(r.element)] for r in original_element_info["runs"] if
|
||||||
|
id(r.element) in run_map]
|
||||||
|
|
||||||
|
if not runs_from_copy:
|
||||||
|
self.logger.warning("在副本段落中找不到对应的Runs,跳过翻译应用。")
|
||||||
|
continue
|
||||||
|
|
||||||
translated_element_info = {
|
translated_element_info = {
|
||||||
"type": "text_runs",
|
"type": "text_runs",
|
||||||
"runs": [Run(r.element, translated_paragraph_obj) for r in original_element_info["runs"]],
|
"runs": runs_from_copy, # 使用从副本中正确找到的Runs
|
||||||
"paragraph": translated_paragraph_obj
|
"paragraph": translated_paragraph_obj
|
||||||
}
|
}
|
||||||
self._apply_translation(translated_element_info, translation)
|
self._apply_translation(translated_element_info, translation)
|
||||||
@@ -421,8 +442,6 @@ class DocxTranslator(AiTranslator):
|
|||||||
doc.save(doc_output_stream)
|
doc.save(doc_output_stream)
|
||||||
return doc_output_stream.getvalue()
|
return doc_output_stream.getvalue()
|
||||||
|
|
||||||
# ---------------------- 修改结束 ----------------------
|
|
||||||
|
|
||||||
def translate(self, document: Document) -> Self:
|
def translate(self, document: Document) -> Self:
|
||||||
doc, elements, originals = self._pre_translate(document)
|
doc, elements, originals = self._pre_translate(document)
|
||||||
if not originals:
|
if not originals:
|
||||||
|
|||||||
Reference in New Issue
Block a user