async_translate/manager/
mod.rs

1//! 翻译管理器实现
2
3use crate::translator::Translator;
4use anyhow::Result;
5use std::collections::HashMap;
6use unic_langid::LanguageIdentifier;
7
8/// 翻译管理器,用于统一管理多个翻译器
9pub struct TranslationManager {
10    /// 翻译器映射表,键为翻译器名称,值为翻译器实例
11    translators: HashMap<String, Box<dyn Translator>>,
12}
13
14impl TranslationManager {
15    /// 创建新的翻译管理器实例
16    /// 
17    /// # 返回值
18    /// 
19    /// 返回翻译管理器实例
20    pub fn new() -> Self {
21        Self {
22            translators: HashMap::new(),
23        }
24    }
25    
26    /// 添加翻译器到管理器
27    /// 
28    /// # 参数
29    /// 
30    /// * `name` - 翻译器名称
31    /// * `translator` - 翻译器实例
32    pub fn add_translator(&mut self, name: &str, translator: Box<dyn Translator>) {
33        self.translators.insert(name.to_string(), translator);
34    }
35    
36    /// 使用指定的翻译器翻译文本
37    ///
38    /// # 参数
39    ///
40    /// * `translator_name` - 翻译器名称
41    /// * `text` - 需要翻译的文本
42    /// * `target_lang` - 目标语言代码
43    ///
44    /// # 返回值
45    ///
46    /// 返回翻译后的文本,如果出错则返回错误信息
47    pub async fn translate(&self, translator_name: &str, text: &str, target_lang: &str) -> Result<String> {
48        let translator = self.translators
49            .get(translator_name)
50            .ok_or_else(|| anyhow::anyhow!("Translator '{}' not found", translator_name))?;
51
52        translator.translate(text, target_lang).await
53    }
54
55    /// 使用指定的翻译器翻译文本 (使用 LanguageIdentifier)
56    ///
57    /// # 参数
58    ///
59    /// * `translator_name` - 翻译器名称
60    /// * `text` - 需要翻译的文本
61    /// * `target_lang` - 目标语言标识符
62    ///
63    /// # 返回值
64    ///
65    /// 返回翻译后的文本,如果出错则返回错误信息
66    pub async fn translate_langid(&self, translator_name: &str, text: &str, target_lang: &LanguageIdentifier) -> Result<String> {
67        let translator = self.translators
68            .get(translator_name)
69            .ok_or_else(|| anyhow::anyhow!("Translator '{}' not found", translator_name))?;
70
71        translator.translate_langid(text, target_lang).await
72    }
73
74    /// 使用指定的翻译器翻译文本 (指定源语言和目标语言)
75    ///
76    /// # 参数
77    ///
78    /// * `translator_name` - 翻译器名称
79    /// * `text` - 需要翻译的文本
80    /// * `source_lang` - 源语言标识符 (None表示自动检测)
81    /// * `target_lang` - 目标语言标识符
82    ///
83    /// # 返回值
84    ///
85    /// 返回翻译后的文本,如果出错则返回错误信息
86    pub async fn translate_with_langid(&self, translator_name: &str, text: &str, source_lang: Option<&LanguageIdentifier>, target_lang: &LanguageIdentifier) -> Result<String> {
87        let translator = self.translators
88            .get(translator_name)
89            .ok_or_else(|| anyhow::anyhow!("Translator '{}' not found", translator_name))?;
90
91        translator.translate_with_langid(text, source_lang, target_lang).await
92    }
93    
94    /// 检查指定的翻译器是否存在
95    /// 
96    /// # 参数
97    /// 
98    /// * `translator_name` - 翻译器名称
99    /// 
100    /// # 返回值
101    /// 
102    /// 如果翻译器存在返回true,否则返回false
103    pub fn has_translator(&self, translator_name: &str) -> bool {
104        self.translators.contains_key(translator_name)
105    }
106    
107    /// 获取所有翻译器名称
108    /// 
109    /// # 返回值
110    /// 
111    /// 返回所有翻译器名称的向量
112    pub fn list_translators(&self) -> Vec<String> {
113        self.translators.keys().cloned().collect()
114    }
115}
116
117#[cfg(test)]
118mod tests;