220 lines
8.4 KiB
Python
220 lines
8.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
調試回寫問題 - 為什麼D2-D8有快取但沒有回寫到Excel
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
# 設定編碼
|
|
sys.stdout.reconfigure(encoding='utf-8')
|
|
|
|
from pathlib import Path
|
|
import openpyxl
|
|
from app.services.translation_service import ExcelParser
|
|
|
|
def debug_writeback_issue():
|
|
"""調試回寫問題的詳細分析"""
|
|
|
|
print("=" * 80)
|
|
print("調試回寫問題 - D2-D8有快取但沒有回寫")
|
|
print("使用上傳UUID: f8b0febc-c0df-4902-8dc3-c90f5634f3b3 (有日文翻譯)")
|
|
print("=" * 80)
|
|
|
|
# 使用有日文翻譯的檔案路徑
|
|
prod_dir = Path(r"C:\Users\EGG\WORK\data\user_scrip\TOOL\Document_translator_V2\uploads\f8b0febc-c0df-4902-8dc3-c90f5634f3b3")
|
|
original_file = prod_dir / "original_panjit_f8b0febc.xlsx"
|
|
translated_file = prod_dir / "original_panjit_f8b0febc_ja_translated.xlsx"
|
|
|
|
if not original_file.exists():
|
|
print(f"❌ 原始文件不存在: {original_file}")
|
|
return
|
|
|
|
if not translated_file.exists():
|
|
print(f"❌ 翻譯文件不存在: {translated_file}")
|
|
return
|
|
|
|
print(f"✅ 檔案確認:")
|
|
print(f" 原始: {original_file.name}")
|
|
print(f" 翻譯: {translated_file.name}")
|
|
|
|
# 1. 檢查問題儲存格的具體內容
|
|
print(f"\n1. 檢查問題儲存格內容")
|
|
print("-" * 60)
|
|
|
|
problem_cells = ['D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'F2', 'F3', 'F4', 'F5', 'F6']
|
|
|
|
wb_orig = openpyxl.load_workbook(str(original_file), data_only=False)
|
|
try:
|
|
wb_orig_vals = openpyxl.load_workbook(str(original_file), data_only=True)
|
|
except:
|
|
wb_orig_vals = None
|
|
|
|
wb_trans = openpyxl.load_workbook(str(translated_file), data_only=False)
|
|
|
|
cell_contents = {}
|
|
|
|
for cell_name in problem_cells:
|
|
orig_val = wb_orig.active[cell_name].value
|
|
orig_display = wb_orig_vals.active[cell_name].value if wb_orig_vals else None
|
|
trans_val = wb_trans.active[cell_name].value
|
|
|
|
if orig_val: # 只檢查有內容的儲存格
|
|
print(f"\n{cell_name}:")
|
|
print(f" 原始值: {repr(orig_val)}")
|
|
if wb_orig_vals and orig_display != orig_val:
|
|
print(f" 顯示值: {repr(orig_display)}")
|
|
print(f" 翻譯值: {repr(trans_val)}")
|
|
|
|
# 決定用於翻譯的文字
|
|
parser = ExcelParser(str(original_file))
|
|
if isinstance(orig_val, str) and orig_val.startswith("="):
|
|
display_text = orig_display if isinstance(orig_display, str) and orig_display.strip() else None
|
|
elif isinstance(orig_val, str) and orig_val.strip():
|
|
display_text = orig_val
|
|
else:
|
|
display_text = orig_display if wb_orig_vals and isinstance(orig_display, str) and orig_display.strip() else None
|
|
|
|
print(f" 用於翻譯: {repr(display_text)}")
|
|
|
|
if display_text:
|
|
should_translate = parser._should_translate(display_text, 'auto')
|
|
print(f" 應該翻譯: {should_translate}")
|
|
cell_contents[cell_name] = display_text
|
|
else:
|
|
print(f" ❌ 沒有可翻譯文字")
|
|
|
|
# 2. 檢查這些文字是否在提取列表中
|
|
print(f"\n2. 檢查文字提取狀況")
|
|
print("-" * 60)
|
|
|
|
segments = parser.extract_text_segments()
|
|
print(f"總共提取 {len(segments)} 個片段")
|
|
|
|
for cell_name, text in cell_contents.items():
|
|
if text in segments:
|
|
print(f"✅ {cell_name}='{text}' 已被提取 (位置: {segments.index(text)+1})")
|
|
else:
|
|
print(f"❌ {cell_name}='{text}' 未被提取")
|
|
|
|
# 3. 檢查MySQL快取中的翻譯
|
|
print(f"\n3. 檢查MySQL快取中的翻譯")
|
|
print("-" * 60)
|
|
|
|
from app import create_app
|
|
app = create_app()
|
|
|
|
with app.app_context():
|
|
from sqlalchemy import text as sql_text
|
|
from app import db
|
|
|
|
translation_map = {}
|
|
|
|
for cell_name, text in cell_contents.items():
|
|
result = db.session.execute(sql_text("""
|
|
SELECT id, translated_text, created_at
|
|
FROM dt_translation_cache
|
|
WHERE source_text = :text AND target_language = 'ja'
|
|
ORDER BY created_at DESC
|
|
LIMIT 1
|
|
"""), {'text': text})
|
|
|
|
row = result.fetchone()
|
|
if row:
|
|
translation_map[text] = row[1]
|
|
print(f"✅ {cell_name}='{text}' -> '{row[1]}' (ID:{row[0]}, 時間:{row[2]})")
|
|
else:
|
|
print(f"❌ {cell_name}='{text}' -> 快取中無翻譯")
|
|
|
|
print(f"\n快取命中率: {len(translation_map)}/{len(cell_contents)} = {len(translation_map)/len(cell_contents)*100:.1f}%")
|
|
|
|
# 4. 模擬generate_translated_document的映射邏輯
|
|
print(f"\n4. 模擬翻譯映射建立過程")
|
|
print("-" * 60)
|
|
|
|
# 建立翻譯映射 (模擬實際邏輯)
|
|
mapping_result = {}
|
|
|
|
for original_text in segments:
|
|
cache_result = db.session.execute(sql_text("""
|
|
SELECT translated_text
|
|
FROM dt_translation_cache
|
|
WHERE source_text = :text AND target_language = 'ja'
|
|
ORDER BY created_at DESC
|
|
LIMIT 1
|
|
"""), {'text': original_text, 'lang': 'ja'})
|
|
|
|
cache_row = cache_result.fetchone()
|
|
if cache_row and cache_row[0]:
|
|
mapping_result[original_text] = cache_row[0]
|
|
|
|
print(f"映射建立完成: {len(mapping_result)}/{len(segments)} = {len(mapping_result)/len(segments)*100:.1f}%")
|
|
|
|
# 檢查問題儲存格的映射狀況
|
|
print(f"\n映射檢查:")
|
|
for cell_name, text in cell_contents.items():
|
|
if text in mapping_result:
|
|
print(f"✅ {cell_name}='{text}' 在映射中: '{mapping_result[text]}'")
|
|
else:
|
|
print(f"❌ {cell_name}='{text}' 不在映射中")
|
|
|
|
# 5. 模擬實際的儲存格翻譯寫入邏輯
|
|
print(f"\n5. 模擬儲存格翻譯寫入邏輯")
|
|
print("-" * 60)
|
|
|
|
# 重新載入工作簿進行模擬
|
|
wb_test = openpyxl.load_workbook(str(original_file), data_only=False)
|
|
try:
|
|
wb_test_vals = openpyxl.load_workbook(str(original_file), data_only=True)
|
|
except:
|
|
wb_test_vals = None
|
|
|
|
ws = wb_test.active
|
|
ws_vals = wb_test_vals.active if wb_test_vals else None
|
|
|
|
for cell_name in problem_cells:
|
|
if cell_name in cell_contents:
|
|
text = cell_contents[cell_name]
|
|
|
|
# 模擬_get_display_text_for_translation邏輯
|
|
cell = ws[cell_name]
|
|
r, c = cell.row, cell.column
|
|
src_text = parser._get_display_text_for_translation(ws, ws_vals, r, c)
|
|
|
|
print(f"\n{cell_name} 寫入模擬:")
|
|
print(f" 提取文字: {repr(src_text)}")
|
|
print(f" 預期文字: {repr(text)}")
|
|
print(f" 文字一致: {src_text == text}")
|
|
|
|
if src_text and parser._should_translate(src_text, 'auto'):
|
|
if src_text in mapping_result:
|
|
translated = mapping_result[src_text]
|
|
new_value = f"{src_text}\n{translated}"
|
|
print(f" ✅ 應該寫入: {repr(new_value)}")
|
|
else:
|
|
print(f" ❌ 映射中找不到: '{src_text}'")
|
|
# 檢查映射鍵中是否有相似的
|
|
similar_keys = [key for key in mapping_result.keys() if key.strip() == src_text.strip()]
|
|
if similar_keys:
|
|
print(f" 相似鍵: {similar_keys}")
|
|
else:
|
|
print(f" ❌ 不應翻譯或無文字")
|
|
|
|
wb_test.close()
|
|
if wb_test_vals:
|
|
wb_test_vals.close()
|
|
|
|
wb_orig.close()
|
|
wb_trans.close()
|
|
if wb_orig_vals:
|
|
wb_orig_vals.close()
|
|
|
|
print(f"\n" + "=" * 80)
|
|
print("回寫問題調試完成!")
|
|
print("請檢查上述輸出找出問題原因。")
|
|
print("=" * 80)
|
|
|
|
if __name__ == "__main__":
|
|
debug_writeback_issue() |