Files
voidraft/internal/services/translation_service.go

134 lines
3.9 KiB
Go

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)
}