mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-07 22:36:02 +00:00
203 lines
6.0 KiB
Python
203 lines
6.0 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
检查workflows翻译进度
|
||
|
||
使用方法:
|
||
python3 check_translation_progress.py
|
||
|
||
显示:
|
||
- 每种语言的翻译进度
|
||
- 已完成和待完成的键数量
|
||
- 翻译完成百分比
|
||
- 最近翻译的键(如果有)
|
||
"""
|
||
|
||
import json
|
||
from pathlib import Path
|
||
from typing import Dict, List, Tuple
|
||
|
||
|
||
def load_translations() -> Dict:
|
||
"""加载翻译JSON文件"""
|
||
json_path = Path(__file__).parent / 'workflows_translations.json'
|
||
|
||
if not json_path.exists():
|
||
raise FileNotFoundError(f"找不到翻译文件: {json_path}")
|
||
|
||
with open(json_path, 'r', encoding='utf-8') as f:
|
||
return json.load(f)
|
||
|
||
|
||
def analyze_progress(translations_data: Dict) -> Dict[str, Dict]:
|
||
"""
|
||
分析每种语言的翻译进度
|
||
|
||
返回格式:
|
||
{
|
||
'ja-JP': {
|
||
'completed': 50,
|
||
'total': 627,
|
||
'percentage': 7.97,
|
||
'completed_keys': ['title', 'description', ...],
|
||
'pending_keys': ['...', ...]
|
||
},
|
||
...
|
||
}
|
||
"""
|
||
translations = translations_data.get('translations', {})
|
||
languages = ['ja-JP', 'zh-Hant', 'es-ES', 'ru-RU', 'th-TH', 'vi-VN']
|
||
|
||
progress = {}
|
||
|
||
for lang in languages:
|
||
completed_keys = []
|
||
pending_keys = []
|
||
|
||
for key, values in translations.items():
|
||
translation = values.get(lang, 'TODO')
|
||
if translation != 'TODO' and translation.strip():
|
||
completed_keys.append(key)
|
||
else:
|
||
pending_keys.append(key)
|
||
|
||
total = len(translations)
|
||
completed = len(completed_keys)
|
||
percentage = (completed / total * 100) if total > 0 else 0
|
||
|
||
progress[lang] = {
|
||
'completed': completed,
|
||
'total': total,
|
||
'percentage': percentage,
|
||
'completed_keys': completed_keys,
|
||
'pending_keys': pending_keys
|
||
}
|
||
|
||
return progress
|
||
|
||
|
||
def get_language_name(lang_code: str) -> str:
|
||
"""获取语言的中文名称"""
|
||
names = {
|
||
'ja-JP': '日语',
|
||
'zh-Hant': '繁体中文',
|
||
'es-ES': '西班牙语',
|
||
'ru-RU': '俄语',
|
||
'th-TH': '泰语',
|
||
'vi-VN': '越南语'
|
||
}
|
||
return names.get(lang_code, lang_code)
|
||
|
||
|
||
def print_progress_bar(percentage: float, width: int = 40) -> str:
|
||
"""生成进度条"""
|
||
filled = int(width * percentage / 100)
|
||
bar = '█' * filled + '░' * (width - filled)
|
||
return f"[{bar}] {percentage:.1f}%"
|
||
|
||
|
||
def display_progress(progress: Dict[str, Dict]):
|
||
"""显示翻译进度"""
|
||
print("\n" + "="*80)
|
||
print("📊 Workflows翻译进度报告")
|
||
print("="*80)
|
||
|
||
# 按完成度排序
|
||
sorted_langs = sorted(progress.items(), key=lambda x: x[1]['percentage'], reverse=True)
|
||
|
||
for lang, data in sorted_langs:
|
||
lang_name = get_language_name(lang)
|
||
completed = data['completed']
|
||
total = data['total']
|
||
percentage = data['percentage']
|
||
|
||
print(f"\n【{lang_name} ({lang})】")
|
||
print(f" {print_progress_bar(percentage)}")
|
||
print(f" ✅ 已完成: {completed}/{total}")
|
||
print(f" ⏳ 待翻译: {total - completed}")
|
||
|
||
# 显示最近完成的键(前5个)
|
||
if data['completed_keys']:
|
||
recent = data['completed_keys'][:5]
|
||
print(f" 📝 最近完成: {', '.join(recent)}")
|
||
if len(data['completed_keys']) > 5:
|
||
print(f" (还有 {len(data['completed_keys']) - 5} 个已完成)")
|
||
|
||
# 总体统计
|
||
print("\n" + "-"*80)
|
||
total_completed = sum(d['completed'] for d in progress.values())
|
||
total_items = sum(d['total'] for d in progress.values())
|
||
avg_percentage = (total_completed / total_items * 100) if total_items > 0 else 0
|
||
|
||
print(f"📈 总体进度: {total_completed}/{total_items} ({avg_percentage:.1f}%)")
|
||
print(f"📊 平均每种语言: {total_completed // len(progress)}/{progress[list(progress.keys())[0]]['total']}")
|
||
|
||
# 估算剩余工作量
|
||
remaining = total_items - total_completed
|
||
print(f"\n💡 剩余工作量: {remaining} 个翻译项")
|
||
|
||
if remaining > 0:
|
||
# 建议分批策略
|
||
batches_50 = (remaining + 49) // 50 # 向上取整
|
||
batches_100 = (remaining + 99) // 100
|
||
|
||
print(f" 建议分批策略:")
|
||
print(f" - 每批50个键: 需要 {batches_50} 批")
|
||
print(f" - 每批100个键: 需要 {batches_100} 批")
|
||
|
||
print("="*80)
|
||
|
||
|
||
def suggest_next_keys(progress: Dict[str, Dict], batch_size: int = 50) -> List[str]:
|
||
"""建议下一批要翻译的键"""
|
||
# 找出所有语言都还没翻译的键
|
||
all_pending = set()
|
||
|
||
for lang, data in progress.items():
|
||
if not all_pending:
|
||
all_pending = set(data['pending_keys'])
|
||
else:
|
||
all_pending &= set(data['pending_keys'])
|
||
|
||
return list(all_pending)[:batch_size]
|
||
|
||
|
||
def main():
|
||
print("🔍 正在检查翻译进度...")
|
||
|
||
try:
|
||
# 加载翻译数据
|
||
translations_data = load_translations()
|
||
|
||
# 分析进度
|
||
progress = analyze_progress(translations_data)
|
||
|
||
# 显示进度
|
||
display_progress(progress)
|
||
|
||
# 建议下一批翻译的键
|
||
next_keys = suggest_next_keys(progress, batch_size=50)
|
||
|
||
if next_keys:
|
||
print(f"\n💡 建议下一批翻译的键(前10个):")
|
||
for i, key in enumerate(next_keys[:10], 1):
|
||
print(f" {i}. {key}")
|
||
|
||
if len(next_keys) > 10:
|
||
print(f" ... 还有 {len(next_keys) - 10} 个键")
|
||
else:
|
||
print("\n🎉 恭喜!所有翻译已完成!")
|
||
|
||
print("\n✅ 进度检查完成")
|
||
|
||
except FileNotFoundError as e:
|
||
print(f"\n❌ 错误: {e}")
|
||
print("💡 请确保 workflows_translations.json 文件存在")
|
||
except Exception as e:
|
||
print(f"\n❌ 发生错误: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|