html-translation-lib 0.1.0

高性能HTML翻译库,专为网页本地化设计,提供智能缓存、并发批处理和内存优化功能
Documentation
//! Monolith集成示例
//! 
//! 演示如何将HTML翻译库与Monolith工具集成使用

use html_translation_lib::{TranslationConfig, translate_before_merge, TranslationResult};
use html5ever::parse_document;
use html5ever::tendril::TendrilSink;
use markup5ever_rcdom::RcDom;

#[tokio::main]
async fn main() -> TranslationResult<()> {
    tracing_subscriber::fmt::init();
    
    println!("HTML翻译库 - Monolith集成示例");
    println!("{}", "=".repeat(50));
    
    // 模拟从网络获取的HTML内容 - 避免前缀标识符冲突
    let html_content = format!(r##"
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Product Documentation</title>
        <link rel="stylesheet" href="styles.css">
    </head>
    <body>
        <header>
            <h1>Product Documentation</h1>
            <p>Comprehensive guide for our product</p>
        </header>
        
        <nav>
            <ul>
                <li><a href="{}getting-started">Getting Started</a></li>
                <li><a href="{}features">Features</a></li>
                <li><a href="{}api-reference">API Reference</a></li>
                <li><a href="{}troubleshooting">Troubleshooting</a></li>
            </ul>
        </nav>
        
        <main>
            <section id="getting-started">
                <h2>Getting Started</h2>
                <p>Follow these simple steps to begin using our product:</p>
                <ol>
                    <li>Download the latest version from our website</li>
                    <li>Install the software on your system</li>
                    <li>Run the initial configuration wizard</li>
                    <li>Start exploring the features</li>
                </ol>
            </section>
            
            <section id="features">
                <h2>Key Features</h2>
                <div class="feature-grid">
                    <div class="feature-card">
                        <h3>Easy to Use</h3>
                        <p>Intuitive interface designed for users of all skill levels.</p>
                    </div>
                    <div class="feature-card">
                        <h3>High Performance</h3>
                        <p>Optimized algorithms ensure fast processing times.</p>
                    </div>
                    <div class="feature-card">
                        <h3>Extensible</h3>
                        <p>Plugin architecture allows for custom functionality.</p>
                    </div>
                </div>
            </section>
            
            <section id="api-reference">
                <h2>API Reference</h2>
                <p>Complete documentation of all available functions and methods.</p>
                <code>
                function processData(input) {{
                    // Example function
                    return input.map(item => item * 2);
                }}
                </code>
            </section>
        </main>
        
        <footer>
            <p>© 2024 Company Name. All rights reserved.</p>
        </footer>
        
        <script src="script.js"></script>
    </body>
    </html>
    "##, "#", "#", "#", "#");
    
    println!("📄 原始HTML内容长度: {} 字符", html_content.len());
    
    // 步骤1: 解析HTML为DOM
    println!("\n🔍 步骤1: 解析HTML为DOM...");
    let dom = parse_document(RcDom::default(), Default::default())
        .from_utf8()
        .read_from(&mut html_content.as_bytes())?;
    
    println!("✅ HTML解析完成");
    
    // 步骤2: 配置翻译参数
    println!("\n⚙️  步骤2: 配置翻译参数...");
    let translation_config = TranslationConfig::new()
        .target_language("zh")
        .api_url("http://localhost:1188/translate")
        .enable_cache(true)
        .batch_size(15)
        .max_retries(3);
    
    println!("✅ 翻译配置完成");
    
    // 步骤3: 在合并资源前翻译内容
    println!("\n🔄 步骤3: 翻译DOM内容...");
    let start_time = std::time::Instant::now();
    
    let translated_dom = translate_before_merge(dom, translation_config).await?;
    
    let translation_time = start_time.elapsed();
    println!("✅ 翻译完成!耗时: {:?}", translation_time);
    
    // 步骤4: 将翻译后的DOM序列化为HTML
    println!("\n📝 步骤4: 序列化翻译后的DOM...");
    let translated_html = serialize_dom(&translated_dom)?;
    
    println!("✅ DOM序列化完成");
    
    // 步骤5: 保存翻译后的HTML(在实际使用中,这里会传给Monolith)
    println!("\n💾 步骤5: 保存翻译结果...");
    std::fs::write("translated_monolith_input.html", &translated_html)?;
    println!("✅ 翻译后的HTML已保存到: translated_monolith_input.html");
    
    // 现在这个文件可以作为Monolith的输入
    println!("\n🔧 集成说明:");
    println!("   1. 翻译后的HTML文件: translated_monolith_input.html");
    println!("   2. 现在可以使用Monolith处理此文件:");
    println!("      monolith translated_monolith_input.html > final_output.html");
    println!("   3. 最终输出将是翻译好的单文件HTML");
    
    // 显示处理统计
    println!("\n📊 处理统计:");
    println!("   - 原始内容长度: {} 字符", html_content.len());
    println!("   - 翻译后长度: {} 字符", translated_html.len());
    println!("   - 翻译用时: {:?}", translation_time);
    println!("   - 长度变化: {:.1}%", 
             (translated_html.len() as f32 / html_content.len() as f32 - 1.0) * 100.0);
    
    // 显示部分翻译结果预览
    let preview_length = 800;
    let preview = if translated_html.len() > preview_length {
        format!("{}...", &translated_html[..preview_length])
    } else {
        translated_html.clone()
    };
    
    println!("\n📝 翻译结果预览:");
    println!("{}", "=".repeat(60));
    println!("{}", preview);
    println!("{}", "=".repeat(60));
    
    println!("\n🎉 Monolith集成示例完成!");
    println!("   翻译后的文件现在可以用作Monolith的输入。");
    
    Ok(())
}

/// 序列化DOM为HTML字符串
fn serialize_dom(dom: &RcDom) -> TranslationResult<String> {
    use html5ever::serialize::{serialize, SerializeOpts};
    use markup5ever_rcdom::SerializableHandle;
    use std::io::Cursor;
    
    let mut buffer = Vec::new();
    let cursor = Cursor::new(&mut buffer);
    
    serialize(
        cursor, 
        &SerializableHandle::from(dom.document.clone()), 
        SerializeOpts::default()
    ).map_err(|e| html_translation_lib::TranslationError::ParseError(
        format!("HTML序列化失败: {:?}", e)
    ))?;
    
    String::from_utf8(buffer).map_err(|e| 
        html_translation_lib::TranslationError::ParseError(
            format!("UTF-8转换失败: {}", e)
        )
    )
}