196 lines
8.5 KiB
Python
196 lines
8.5 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
手動補充韓文翻譯快取並重新生成翻譯檔案
|
||
"""
|
||
|
||
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
|
||
from app import create_app
|
||
|
||
def add_korean_translations():
|
||
"""手動補充韓文翻譯快取"""
|
||
|
||
print("=" * 80)
|
||
print("手動補充韓文翻譯快取")
|
||
print("目標語言: 韓文 (ko)")
|
||
print("=" * 80)
|
||
|
||
# 關鍵的中文->韓文翻譯對照 (基於常見技術用語翻譯)
|
||
korean_translations = [
|
||
{
|
||
'source_text': '與 WB inline 串線(DB→WB)、時效快;支援 Sn/Au 晶片\n最小可支援9mil晶粒\n支援EAP管控',
|
||
'translated_text': 'WB 인라인 연결(DB→WB), 처리 시간 단축; Sn/Au 칩 지원\n최소 9mil 다이 지원\nEAP 제어 지원'
|
||
},
|
||
{
|
||
'source_text': '空洞表現穩定、尺寸/厚度範圍廣\n最小可支援9mil晶粒\n支援EAP管控',
|
||
'translated_text': '공극 표현 안정, 크기/두께 범위 넓음\n최소 9mil 다이 지원\nEAP 제어 지원'
|
||
},
|
||
{
|
||
'source_text': 'DB到焊接爐為串機、時效快,減少人員碰觸之風險\n支援Ag/Au晶片\n支援含氧量監控\n支援EAP',
|
||
'translated_text': 'DB에서 용접로까지 인라인 연결, 처리 시간 단축, 인적 접촉 위험 감소\nAg/Au 칩 지원\n산소 함량 모니터링 지원\nEAP 지원'
|
||
},
|
||
{
|
||
'source_text': '爐後氣孔少,提升焊接接縫均勻度、強度高、氣密性好\n支援Ag/Au晶片\n支援含氧量監控\n支援EAP',
|
||
'translated_text': '로 후 기공 적음, 용접 이음부 균일도 향상, 강도 높음, 기밀성 양호\nAg/Au 칩 지원\n산소 함량 모니터링 지원\nEAP 지원'
|
||
},
|
||
{
|
||
'source_text': 'Wire size: 0.8 mil ~ 2.4 mil(量產成熟)\n最薄 Al bond pad 1.3 μm;最小 bond pad size 55 × 55 μm\n支援EAP管控',
|
||
'translated_text': '와이어 크기: 0.8 mil ~ 2.4 mil(양산 성숙)\n최박 Al 본드 패드 1.3 μm; 최소 본드 패드 크기 55 × 55 μm\nEAP 제어 지원'
|
||
},
|
||
{
|
||
'source_text': '1.全自動貼片減少人為作業的風險\n2.機台封閉式設計及有HEPA機構能減少落塵造成的異常風險\n3.自動讀取晶片刻號及貼晶片條碼\n支援EAP管控',
|
||
'translated_text': '1.전자동 부착으로 인적 작업 위험 감소\n2.장비 밀폐식 설계 및 HEPA 기구로 낙진 이상 위험 감소\n3.칩 각인 및 칩 바코드 자동 판독\nEAP 제어 지원'
|
||
},
|
||
{
|
||
'source_text': '1.晶片切割後chipping的品質檢驗\n2.晶片上的缺點檢驗',
|
||
'translated_text': '1.칩 절단 후 치핑 품질 검사\n2.칩상 결함 검사'
|
||
},
|
||
# 單字元翻譯
|
||
{
|
||
'source_text': '高',
|
||
'translated_text': '높음'
|
||
},
|
||
{
|
||
'source_text': '低',
|
||
'translated_text': '낮음'
|
||
},
|
||
{
|
||
'source_text': '中',
|
||
'translated_text': '중간'
|
||
},
|
||
# 其他重要片段
|
||
{
|
||
'source_text': '自動串接:DB 後直上 WB,免批次搬運。\n快速交付:連線作業縮短 Cycle Time。',
|
||
'translated_text': '자동 연결: DB 후 직접 WB 연결, 배치 운반 생략.\n빠른 납품: 연결 작업으로 사이클 타임 단축.'
|
||
},
|
||
{
|
||
'source_text': 'Solder\nDB+WB',
|
||
'translated_text': '솔더\nDB+WB'
|
||
},
|
||
{
|
||
'source_text': '晶粒尺寸/pad尺寸需配合規格\n高溫製程,需確認晶片承受狀況',
|
||
'translated_text': '다이 크기/패드 크기는 사양에 맞춰야 함\n고온 공정, 칩 내성 확인 필요'
|
||
}
|
||
]
|
||
|
||
app = create_app()
|
||
|
||
with app.app_context():
|
||
from app.models.cache import TranslationCache
|
||
from app import db
|
||
|
||
source_language = 'zh'
|
||
target_language = 'ko'
|
||
|
||
print(f"準備添加 {len(korean_translations)} 筆韓文翻譯...")
|
||
print("-" * 60)
|
||
|
||
added_count = 0
|
||
updated_count = 0
|
||
|
||
for i, trans in enumerate(korean_translations, 1):
|
||
source_text = trans['source_text']
|
||
translated_text = trans['translated_text']
|
||
|
||
print(f"\n{i:2d}. 處理翻譯:")
|
||
print(f" 原文: {repr(source_text[:40])}...")
|
||
print(f" 韓文: {repr(translated_text[:40])}...")
|
||
|
||
# 檢查是否已存在
|
||
existing = TranslationCache.get_translation(source_text, source_language, target_language)
|
||
|
||
if existing:
|
||
if existing.strip() != translated_text.strip():
|
||
print(f" 🔄 更新現有翻譯")
|
||
TranslationCache.save_translation(source_text, source_language, target_language, translated_text)
|
||
updated_count += 1
|
||
else:
|
||
print(f" ⚠️ 翻譯已存在且相同")
|
||
else:
|
||
print(f" ✅ 新增翻譯記錄")
|
||
TranslationCache.save_translation(source_text, source_language, target_language, translated_text)
|
||
added_count += 1
|
||
|
||
print(f"\n" + "-" * 60)
|
||
print(f"韓文翻譯補充結果:")
|
||
print(f" 新增: {added_count}")
|
||
print(f" 更新: {updated_count}")
|
||
print(f" 總計: {added_count + updated_count}")
|
||
|
||
# 驗證結果
|
||
print(f"\n驗證補充結果:")
|
||
print("-" * 60)
|
||
|
||
success_count = 0
|
||
|
||
for i, trans in enumerate(korean_translations, 1):
|
||
source_text = trans['source_text']
|
||
|
||
cached_translation = TranslationCache.get_translation(source_text, source_language, target_language)
|
||
|
||
if cached_translation:
|
||
if cached_translation.strip() == trans['translated_text'].strip():
|
||
print(f"✅ {i:2d}: 驗證成功")
|
||
success_count += 1
|
||
else:
|
||
print(f"⚠️ {i:2d}: 驗證失敗 - 內容不一致")
|
||
else:
|
||
print(f"❌ {i:2d}: 驗證失敗 - 快取中沒有")
|
||
|
||
print(f"\n驗證結果: {success_count}/{len(korean_translations)} 成功")
|
||
|
||
# 測試整體韓文映射覆蓋率
|
||
print(f"\n測試整體韓文映射覆蓋率:")
|
||
print("-" * 60)
|
||
|
||
from app.services.translation_service import ExcelParser
|
||
from sqlalchemy import text as sql_text
|
||
|
||
original_file = Path(r"C:\Users\EGG\WORK\data\user_scrip\TOOL\Document_translator_V2\uploads\98158984-f335-44f5-a0b4-88fb8ccd5d78") / "original_panjit_98158984.xlsx"
|
||
|
||
if original_file.exists():
|
||
parser = ExcelParser(str(original_file))
|
||
segments = parser.extract_text_segments()
|
||
|
||
mapping_count = 0
|
||
|
||
for segment in segments:
|
||
result = db.session.execute(sql_text("""
|
||
SELECT translated_text
|
||
FROM dt_translation_cache
|
||
WHERE source_text = :text AND target_language = :lang
|
||
ORDER BY created_at DESC
|
||
LIMIT 1
|
||
"""), {'text': segment, 'lang': target_language})
|
||
|
||
row = result.fetchone()
|
||
if row:
|
||
mapping_count += 1
|
||
|
||
mapping_rate = mapping_count / len(segments) * 100 if segments else 0
|
||
print(f"韓文映射覆蓋率: {mapping_count}/{len(segments)} = {mapping_rate:.1f}%")
|
||
|
||
if mapping_rate >= 95:
|
||
print("🎉 韓文映射覆蓋率優秀!翻譯功能應該完美工作")
|
||
elif mapping_rate >= 90:
|
||
print("✅ 韓文映射覆蓋率良好,翻譯功能基本正常")
|
||
elif mapping_rate >= 80:
|
||
print("⚠️ 韓文映射覆蓋率普通,大部分內容可以翻譯")
|
||
else:
|
||
print("❌ 韓文映射覆蓋率不足,需要更多翻譯")
|
||
|
||
print(f"\n" + "=" * 80)
|
||
print("韓文翻譯快取補充完成!")
|
||
print("建議: 重新上傳Excel檔案測試韓文翻譯功能")
|
||
print("或者手動重新生成韓文翻譯檔案")
|
||
print("=" * 80)
|
||
|
||
if __name__ == "__main__":
|
||
add_korean_translations() |