package services import ( "sync" "time" "voidraft/internal/common/translator" "github.com/wailsapp/wails/v3/pkg/services/log" ) // TranslationService 翻译服务 type TranslationService struct { logger *log.Service factory *translator.TranslatorFactory defaultTimeout time.Duration translators map[translator.TranslatorType]translator.Translator mutex sync.RWMutex } // NewTranslationService 创建翻译服务实例 func NewTranslationService(logger *log.Service) *TranslationService { service := &TranslationService{ logger: logger, factory: translator.NewTranslatorFactory(), defaultTimeout: 10 * time.Second, translators: make(map[translator.TranslatorType]translator.Translator), } return service } // getTranslator 获取指定类型的翻译器,如不存在则创建 func (s *TranslationService) getTranslator(translatorType translator.TranslatorType) (translator.Translator, error) { s.mutex.RLock() trans, exists := s.translators[translatorType] s.mutex.RUnlock() if exists { return trans, nil } // 创建新的翻译器实例 trans, err := s.factory.Create(translatorType) if err != nil { return nil, err } trans.SetTimeout(s.defaultTimeout) s.mutex.Lock() s.translators[translatorType] = trans s.mutex.Unlock() return trans, nil } // TranslateWith 使用指定翻译器进行翻译 // @param {string} text - 待翻译文本 // @param {string} from - 源语言代码 (如 "en", "zh", "auto") // @param {string} to - 目标语言代码 (如 "en", "zh") // @param {string} translatorType - 翻译器类型 ("google", "bing", "youdao", "deepl") // @returns {string} 翻译后的文本 // @returns {error} 可能的错误 func (s *TranslationService) TranslateWith(text string, from string, to string, translatorType string) (string, error) { // 空文本直接返回 if text == "" { return "", nil } if translatorType == "" { translatorType = string(translator.BingTranslatorType) } // 转换为翻译器类型 transType := translator.TranslatorType(translatorType) // 获取指定翻译器 trans, err := s.getTranslator(transType) if err != nil { return "", err } // 创建翻译参数 params := translator.TranslationParams{ From: from, To: to, Timeout: s.defaultTimeout, } // 执行翻译 return trans.TranslateWithParams(text, params) } // GetAvailableTranslators 获取所有可用翻译器类型 // @returns {[]string} 翻译器类型列表 func (s *TranslationService) GetAvailableTranslators() []string { return []string{ string(translator.GoogleTranslatorType), string(translator.BingTranslatorType), string(translator.YoudaoTranslatorType), string(translator.DeeplTranslatorType), } } // GetTranslatorLanguages 获取翻译器的语言列表 // @param {string} translatorType - 翻译器类型 ("google", "bing", "youdao", "deepl") // @returns {map[string]string} 语言代码到名称的映射 // @returns {error} 可能的错误 func (s *TranslationService) GetTranslatorLanguages(translatorType translator.TranslatorType) (map[string]translator.LanguageInfo, error) { translator, err := s.getTranslator(translatorType) if err != nil { return nil, err } // 获取语言列表 languages := translator.GetSupportedLanguages() return languages, nil } // IsLanguageSupported 检查指定的语言代码是否受支持 func (s *TranslationService) IsLanguageSupported(translatorType translator.TranslatorType, languageCode string) bool { translator, err := s.getTranslator(translatorType) if err != nil { return false } return translator.IsLanguageSupported(languageCode) } // GetStandardLanguageCode 获取标准化的语言代码 func (s *TranslationService) GetStandardLanguageCode(translatorType translator.TranslatorType, languageCode string) string { translator, err := s.getTranslator(translatorType) if err != nil { return "" } return translator.GetStandardLanguageCode(languageCode) }