Files
LangBot/web/translate_i18n_keys.py
T
2026-05-15 01:05:29 +08:00

266 lines
10 KiB
Python

#!/usr/bin/env python3
"""
将英文翻译键翻译成对应的目标语言
"""
from pathlib import Path
import re
# 翻译映射表
TRANSLATIONS = {
'ja-JP': { # 日文
'Sender': '送信者',
'Output': '出力',
'Result': '結果',
'Data': 'データ',
'Error Message': 'エラーメッセージ',
'Success Status': '成功ステータス',
'Event': 'イベント',
'Trigger Time': 'トリガー時刻',
'Logs': 'ログ',
'Scores': 'スコア',
'Missing Parameters': '不足パラメータ',
'Parsed Result': '解析結果',
'Text Chunks': 'テキストチャンク',
'Text Content': 'テキスト内容',
'Case 1 Output': 'ケース1出力',
'Case 2 Output': 'ケース2出力',
'Branch 1 Output': 'ブランチ1出力',
'Branch 2 Output': 'ブランチ2出力',
'Count': 'カウント',
'Execution ID': '実行ID',
'Notification ID': '通知ID',
'Suggestions': '提案',
'Embedding Vector': '埋め込みベクトル',
'Vector Dimensions': 'ベクトル次元',
'Intent': '意図',
'Entities': 'エンティティ',
'Payload': 'ペイロード',
'Input Value': '入力値',
'Conversation ID': '会話ID',
},
'zh-Hant': { # 繁体中文
'Sender': '發送者',
'Output': '輸出',
'Result': '結果',
'Data': '數據',
'Error Message': '錯誤訊息',
'Success Status': '成功狀態',
'Event': '事件',
'Trigger Time': '觸發時間',
'Logs': '日誌',
'Scores': '分數',
'Missing Parameters': '缺失參數',
'Parsed Result': '解析結果',
'Text Chunks': '文本塊',
'Text Content': '文本內容',
'Case 1 Output': '情況1輸出',
'Case 2 Output': '情況2輸出',
'Branch 1 Output': '分支1輸出',
'Branch 2 Output': '分支2輸出',
'Count': '計數',
'Execution ID': '執行ID',
'Notification ID': '通知ID',
'Suggestions': '建議',
'Embedding Vector': '嵌入向量',
'Vector Dimensions': '向量維度',
'Intent': '意圖',
'Entities': '實體',
'Payload': '負載',
'Input Value': '輸入值',
'Conversation ID': '對話ID',
},
'es-ES': { # 西班牙语
'Sender': 'Remitente',
'Output': 'Salida',
'Result': 'Resultado',
'Data': 'Datos',
'Error Message': 'Mensaje de Error',
'Success Status': 'Estado de Éxito',
'Event': 'Evento',
'Trigger Time': 'Hora de Activación',
'Logs': 'Registros',
'Scores': 'Puntuaciones',
'Missing Parameters': 'Parámetros Faltantes',
'Parsed Result': 'Resultado Analizado',
'Text Chunks': 'Fragmentos de Texto',
'Text Content': 'Contenido de Texto',
'Case 1 Output': 'Salida Caso 1',
'Case 2 Output': 'Salida Caso 2',
'Branch 1 Output': 'Salida Rama 1',
'Branch 2 Output': 'Salida Rama 2',
'Count': 'Conteo',
'Execution ID': 'ID de Ejecución',
'Notification ID': 'ID de Notificación',
'Suggestions': 'Sugerencias',
'Embedding Vector': 'Vector de Incrustación',
'Vector Dimensions': 'Dimensiones del Vector',
'Intent': 'Intención',
'Entities': 'Entidades',
'Payload': 'Carga Útil',
'Input Value': 'Valor de Entrada',
'Conversation ID': 'ID de Conversación',
},
'ru-RU': { # 俄语
'Sender': 'Отправитель',
'Output': 'Вывод',
'Result': 'Результат',
'Data': 'Данные',
'Error Message': 'Сообщение об Ошибке',
'Success Status': 'Статус Успеха',
'Event': 'Событие',
'Trigger Time': 'Время Триггера',
'Logs': 'Журналы',
'Scores': 'Оценки',
'Missing Parameters': 'Отсутствующие Параметры',
'Parsed Result': 'Разобранный Результат',
'Text Chunks': 'Фрагменты Текста',
'Text Content': 'Текстовое Содержимое',
'Case 1 Output': 'Вывод Случая 1',
'Case 2 Output': 'Вывод Случая 2',
'Branch 1 Output': 'Вывод Ветви 1',
'Branch 2 Output': 'Вывод Ветви 2',
'Count': 'Количество',
'Execution ID': 'ID Выполнения',
'Notification ID': 'ID Уведомления',
'Suggestions': 'Предложения',
'Embedding Vector': 'Вектор Встраивания',
'Vector Dimensions': 'Размерности Вектора',
'Intent': 'Намерение',
'Entities': 'Сущности',
'Payload': 'Полезная Нагрузка',
'Input Value': 'Входное Значение',
'Conversation ID': 'ID Разговора',
},
'th-TH': { # 泰语
'Sender': 'ผู้ส่ง',
'Output': 'ผลลัพธ์',
'Result': 'ผลลัพธ์',
'Data': 'ข้อมูล',
'Error Message': 'ข้อความข้อผิดพลาด',
'Success Status': 'สถานะความสำเร็จ',
'Event': 'เหตุการณ์',
'Trigger Time': 'เวลาทริกเกอร์',
'Logs': 'บันทึก',
'Scores': 'คะแนน',
'Missing Parameters': 'พารามิเตอร์ที่ขาดหายไป',
'Parsed Result': 'ผลการแยกวิเคราะห์',
'Text Chunks': 'ส่วนข้อความ',
'Text Content': 'เนื้อหาข้อความ',
'Case 1 Output': 'ผลลัพธ์กรณีที่ 1',
'Case 2 Output': 'ผลลัพธ์กรณีที่ 2',
'Branch 1 Output': 'ผลลัพธ์สาขา 1',
'Branch 2 Output': 'ผลลัพธ์สาขา 2',
'Count': 'จำนวน',
'Execution ID': 'ID การดำเนินการ',
'Notification ID': 'ID การแจ้งเตือน',
'Suggestions': 'คำแนะนำ',
'Embedding Vector': 'เวกเตอร์ฝังตัว',
'Vector Dimensions': 'มิติเวกเตอร์',
'Intent': 'เจตนา',
'Entities': 'เอนทิตี',
'Payload': 'เพย์โหลด',
'Input Value': 'ค่าอินพุต',
'Conversation ID': 'ID การสนทนา',
},
'vi-VN': { # 越南语
'Sender': 'Người gửi',
'Output': 'Đầu ra',
'Result': 'Kết quả',
'Data': 'Dữ liệu',
'Error Message': 'Thông báo Lỗi',
'Success Status': 'Trạng thái Thành công',
'Event': 'Sự kiện',
'Trigger Time': 'Thời gian Kích hoạt',
'Logs': 'Nhật ký',
'Scores': 'Điểm số',
'Missing Parameters': 'Tham số Thiếu',
'Parsed Result': 'Kết quả Phân tích',
'Text Chunks': 'Đoạn Văn bản',
'Text Content': 'Nội dung Văn bản',
'Case 1 Output': 'Đầu ra Trường hợp 1',
'Case 2 Output': 'Đầu ra Trường hợp 2',
'Branch 1 Output': 'Đầu ra Nhánh 1',
'Branch 2 Output': 'Đầu ra Nhánh 2',
'Count': 'Số lượng',
'Execution ID': 'ID Thực thi',
'Notification ID': 'ID Thông báo',
'Suggestions': 'Gợi ý',
'Embedding Vector': 'Vector Nhúng',
'Vector Dimensions': 'Kích thước Vector',
'Intent': 'Ý định',
'Entities': 'Thực thể',
'Payload': 'Tải trọng',
'Input Value': 'Giá trị Đầu vào',
'Conversation ID': 'ID Hội thoại',
},
}
def translate_file(file_path: Path, lang_code: str):
"""翻译指定语言文件"""
print(f"\n处理文件: {file_path.name}")
if lang_code not in TRANSLATIONS:
print(f" ⚠️ 没有 {lang_code} 的翻译映射")
return
translations = TRANSLATIONS[lang_code]
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
modified = False
translated_count = 0
# 替换翻译
for english, translated in translations.items():
# 匹配格式: key: 'English Text',
pattern = rf"(\s+\w+:\s+)'{re.escape(english)}',"
if re.search(pattern, content):
content = re.sub(pattern, rf"\1'{translated}',", content)
translated_count += 1
modified = True
print(f" ✓ 翻译: '{english}' -> '{translated}'")
if modified:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
print(f" ✅ 已更新 {file_path.name},共翻译 {translated_count} 个键")
else:
print(f" - {file_path.name} 无需翻译")
def main():
"""主函数"""
locales_dir = Path(__file__).parent / 'src' / 'i18n' / 'locales'
print("=" * 60)
print("开始翻译多语言 i18n 文件")
print("=" * 60)
language_files = {
'ja-JP.ts': 'ja-JP',
'zh-Hant.ts': 'zh-Hant',
'es-ES.ts': 'es-ES',
'ru-RU.ts': 'ru-RU',
'th-TH.ts': 'th-TH',
'vi-VN.ts': 'vi-VN',
}
total_translated = 0
for filename, lang_code in language_files.items():
file_path = locales_dir / filename
if file_path.exists():
translate_file(file_path, lang_code)
total_translated += 1
else:
print(f"\n警告: 文件不存在 - {filename}")
print("\n" + "=" * 60)
print("翻译完成!")
print("=" * 60)
print(f"\n已处理 {total_translated} 个语言文件")
print(f"每个文件最多翻译 {len(TRANSLATIONS['ja-JP'])} 个键")
if __name__ == '__main__':
main()