#!/usr/bin/env python3 """ EPUB双语翻译程序 - 保守修复验证脚本 验证修复后的系统是否能正确处理EPUB构建 """ import asyncio import sys import json from pathlib import Path # 添加项目根目录到 Python 路径 project_root = Path(__file__).parent sys.path.insert(0, str(project_root)) from src.epub_parser import EPUBParser from src.translator import EPUBTranslator from src.utils import load_config from loguru import logger async def test_conservative_fix(): """测试保守修复方案""" print("🔧 开始验证保守修复方案...") try: # 加载配置 config = load_config() # 查找测试用的EPUB文件 test_files = list(Path(".").glob("*.epub")) if not test_files: print("❌ 未找到测试用的EPUB文件") return test_epub = test_files[0] print(f"📚 使用测试文件: {test_epub}") # 初始化翻译器 translator = EPUBTranslator(config) # 测试解析 print("\n📖 测试EPUB解析...") parser = EPUBParser(str(test_epub)) content_items = parser.extract_translatable_content() print(f"✅ 成功解析,找到 {len(content_items)} 个内容项目") for i, item in enumerate(content_items[:3], 1): # 只显示前3个 print(f" {i}. {item['title']} ({item['type']})") # 检查数据类型 print("\n🔍 检查数据类型...") for i, item in enumerate(content_items[:2], 1): original_item = item['item'] print(f" 项目 {i}: {type(original_item)} - {original_item.__class__.__name__}") # 检查是否有get_content方法 if hasattr(original_item, 'get_content'): print(f" ✅ 有 get_content 方法") else: print(f" ❌ 没有 get_content 方法") # 检查是否有get_name方法 if hasattr(original_item, 'get_name'): print(f" ✅ 有 get_name 方法: {original_item.get_name()}") else: print(f" ❌ 没有 get_name 方法") # 测试翻译(只翻译第一个项目) print("\n🚀 测试单个项目翻译...") if content_items: test_item = content_items[0] # 模拟翻译结果 mock_translations = [ "这是第一段的模拟翻译。", "这是第二段的模拟翻译。", "这是第三段的模拟翻译。" ] # 构造翻译数据 translated_content = [{ 'original_item': test_item['item'], 'translations': mock_translations, 'title': test_item['title'], 'type': test_item['type'], 'stats': { 'total_paragraphs': len(mock_translations), 'total_chunks': 1, 'cache_hits': 0, 'failed_translations': 0 } }] # 测试双语EPUB构建 print("\n📖 测试双语EPUB构建...") from src.bilingual_builder import BilingualEPUBBuilder builder = BilingualEPUBBuilder(parser.book, config) # 创建测试输出目录 test_output_dir = Path("test_output") test_output_dir.mkdir(exist_ok=True) try: result_file = builder.create_bilingual_epub(translated_content, str(test_output_dir)) print(f"✅ 双语EPUB构建成功: {result_file}") # 验证文件是否存在 if Path(result_file).exists(): file_size = Path(result_file).stat().st_size print(f" 文件大小: {file_size / 1024:.1f} KB") else: print("❌ 输出文件不存在") except Exception as e: print(f"❌ 双语EPUB构建失败: {e}") logger.error(f"构建失败详情: {e}") print("\n🎉 保守修复验证完成!") except Exception as e: print(f"❌ 验证过程出错: {e}") logger.error(f"验证失败: {e}") async def test_full_translation_flow(): """测试完整翻译流程(小规模)""" print("\n🧪 测试完整翻译流程...") try: # 查找测试用的EPUB文件 test_files = list(Path(".").glob("*.epub")) if not test_files: print("❌ 未找到测试用的EPUB文件") return test_epub = test_files[0] config = load_config() # 修改配置以进行小规模测试 config['translation']['chunk_size'] = 1000 # 更小的chunk config['translation']['concurrent_requests'] = 2 # 更少的并发 # 初始化翻译器 translator = EPUBTranslator(config) print(f"📚 开始测试翻译: {test_epub}") # 运行测试模式 result = await translator.translate_epub(str(test_epub), test_mode=True) if result.get('status') == 'success': print("✅ 测试模式成功完成") # 显示测试结果 preface_result = result.get('preface', {}) chapter_result = result.get('chapter', {}) if preface_result.get('status') == 'success': print(f" 序言翻译: ✅ (长度: {preface_result.get('translation_length', 0)})") if chapter_result.get('status') == 'success': print(f" 章节翻译: ✅ (段落数: {chapter_result.get('paragraph_count', 0)})") else: print(f"❌ 测试模式失败: {result.get('error', '未知错误')}") except Exception as e: print(f"❌ 完整流程测试失败: {e}") logger.error(f"完整流程测试失败: {e}") if __name__ == "__main__": # 配置日志 logger.remove() logger.add(sys.stdout, level="INFO", format="{time:HH:mm:ss} | {level} | {message}") print("🔧 EPUB翻译器 - 保守修复验证") print("=" * 50) # 运行保守修复测试 asyncio.run(test_conservative_fix()) # 运行完整流程测试 asyncio.run(test_full_translation_flow()) print("\n" + "=" * 50) print("🎯 修复总结:") print("1. ✅ 采用保守的EPUB构建策略") print("2. ✅ 深度复制原书结构,最大程度保持完整性") print("3. ✅ 修复了数据传递中的字段名错误") print("4. ✅ 增强了错误处理和类型检查") print("5. ✅ 保守地插入翻译,避免破坏原有格式") print("\n🚀 保守修复验证完成!")