translate_before_merge

Function translate_before_merge 

Source
pub async fn translate_before_merge(
    dom: RcDom,
    config: TranslationConfig,
) -> TranslationResult<RcDom>
Expand description

在Monolith合并前翻译DOM内容

专门为与Monolith工具集成而设计的函数。在资源合并之前对HTML内容进行翻译, 确保翻译后的内容能够正确地被Monolith处理。

§参数

  • dom - 要翻译的HTML DOM树
  • config - 翻译配置

§返回值

返回翻译后的DOM树,可以直接传给Monolith进行后续处理

§示例

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

// 解析HTML文件
let html = std::fs::read_to_string("example.html")?;
let dom = parse_document(RcDom::default(), Default::default())
    .from_utf8()
    .read_from(&mut html.as_bytes())?;
     
let config = TranslationConfig::new()
    .target_language("zh")
    .enable_cache(true);

let translated_dom = translate_before_merge(dom, config).await?;
// 现在可以传给monolith进行资源合并
Examples found in repository?
examples/monolith_integration.rs (line 117)
11async fn main() -> TranslationResult<()> {
12    tracing_subscriber::fmt::init();
13    
14    println!("HTML翻译库 - Monolith集成示例");
15    println!("{}", "=".repeat(50));
16    
17    // 模拟从网络获取的HTML内容 - 避免前缀标识符冲突
18    let html_content = format!(r##"
19    <!DOCTYPE html>
20    <html lang="en">
21    <head>
22        <meta charset="UTF-8">
23        <title>Product Documentation</title>
24        <link rel="stylesheet" href="styles.css">
25    </head>
26    <body>
27        <header>
28            <h1>Product Documentation</h1>
29            <p>Comprehensive guide for our product</p>
30        </header>
31        
32        <nav>
33            <ul>
34                <li><a href="{}getting-started">Getting Started</a></li>
35                <li><a href="{}features">Features</a></li>
36                <li><a href="{}api-reference">API Reference</a></li>
37                <li><a href="{}troubleshooting">Troubleshooting</a></li>
38            </ul>
39        </nav>
40        
41        <main>
42            <section id="getting-started">
43                <h2>Getting Started</h2>
44                <p>Follow these simple steps to begin using our product:</p>
45                <ol>
46                    <li>Download the latest version from our website</li>
47                    <li>Install the software on your system</li>
48                    <li>Run the initial configuration wizard</li>
49                    <li>Start exploring the features</li>
50                </ol>
51            </section>
52            
53            <section id="features">
54                <h2>Key Features</h2>
55                <div class="feature-grid">
56                    <div class="feature-card">
57                        <h3>Easy to Use</h3>
58                        <p>Intuitive interface designed for users of all skill levels.</p>
59                    </div>
60                    <div class="feature-card">
61                        <h3>High Performance</h3>
62                        <p>Optimized algorithms ensure fast processing times.</p>
63                    </div>
64                    <div class="feature-card">
65                        <h3>Extensible</h3>
66                        <p>Plugin architecture allows for custom functionality.</p>
67                    </div>
68                </div>
69            </section>
70            
71            <section id="api-reference">
72                <h2>API Reference</h2>
73                <p>Complete documentation of all available functions and methods.</p>
74                <code>
75                function processData(input) {{
76                    // Example function
77                    return input.map(item => item * 2);
78                }}
79                </code>
80            </section>
81        </main>
82        
83        <footer>
84            <p>© 2024 Company Name. All rights reserved.</p>
85        </footer>
86        
87        <script src="script.js"></script>
88    </body>
89    </html>
90    "##, "#", "#", "#", "#");
91    
92    println!("📄 原始HTML内容长度: {} 字符", html_content.len());
93    
94    // 步骤1: 解析HTML为DOM
95    println!("\n🔍 步骤1: 解析HTML为DOM...");
96    let dom = parse_document(RcDom::default(), Default::default())
97        .from_utf8()
98        .read_from(&mut html_content.as_bytes())?;
99    
100    println!("✅ HTML解析完成");
101    
102    // 步骤2: 配置翻译参数
103    println!("\n⚙️  步骤2: 配置翻译参数...");
104    let translation_config = TranslationConfig::new()
105        .target_language("zh")
106        .api_url("http://localhost:1188/translate")
107        .enable_cache(true)
108        .batch_size(15)
109        .max_retries(3);
110    
111    println!("✅ 翻译配置完成");
112    
113    // 步骤3: 在合并资源前翻译内容
114    println!("\n🔄 步骤3: 翻译DOM内容...");
115    let start_time = std::time::Instant::now();
116    
117    let translated_dom = translate_before_merge(dom, translation_config).await?;
118    
119    let translation_time = start_time.elapsed();
120    println!("✅ 翻译完成!耗时: {:?}", translation_time);
121    
122    // 步骤4: 将翻译后的DOM序列化为HTML
123    println!("\n📝 步骤4: 序列化翻译后的DOM...");
124    let translated_html = serialize_dom(&translated_dom)?;
125    
126    println!("✅ DOM序列化完成");
127    
128    // 步骤5: 保存翻译后的HTML(在实际使用中,这里会传给Monolith)
129    println!("\n💾 步骤5: 保存翻译结果...");
130    std::fs::write("translated_monolith_input.html", &translated_html)?;
131    println!("✅ 翻译后的HTML已保存到: translated_monolith_input.html");
132    
133    // 现在这个文件可以作为Monolith的输入
134    println!("\n🔧 集成说明:");
135    println!("   1. 翻译后的HTML文件: translated_monolith_input.html");
136    println!("   2. 现在可以使用Monolith处理此文件:");
137    println!("      monolith translated_monolith_input.html > final_output.html");
138    println!("   3. 最终输出将是翻译好的单文件HTML");
139    
140    // 显示处理统计
141    println!("\n📊 处理统计:");
142    println!("   - 原始内容长度: {} 字符", html_content.len());
143    println!("   - 翻译后长度: {} 字符", translated_html.len());
144    println!("   - 翻译用时: {:?}", translation_time);
145    println!("   - 长度变化: {:.1}%", 
146             (translated_html.len() as f32 / html_content.len() as f32 - 1.0) * 100.0);
147    
148    // 显示部分翻译结果预览
149    let preview_length = 800;
150    let preview = if translated_html.len() > preview_length {
151        format!("{}...", &translated_html[..preview_length])
152    } else {
153        translated_html.clone()
154    };
155    
156    println!("\n📝 翻译结果预览:");
157    println!("{}", "=".repeat(60));
158    println!("{}", preview);
159    println!("{}", "=".repeat(60));
160    
161    println!("\n🎉 Monolith集成示例完成!");
162    println!("   翻译后的文件现在可以用作Monolith的输入。");
163    
164    Ok(())
165}