async_translate/manager/
mod.rs

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