package services import ( "app/commons/constant" "app/commons/model/entity" "errors" "strings" "gorm.io/gorm" ) var ( i18nService *I18nService prefix = "" i18nMap map[string]map[string]string // 语言数据 ) // I18nService 国际化服务 type I18nService struct { CommonService } func i18nInit() { i18nService = &I18nService{} _ = i18nService.refreshCache() } func GetI18nService() *I18nService { if i18nService == nil { i18nInit() } return i18nService } func (s *I18nService) refreshCache() error { // 查询所有国际化数据 var i18ns []*entity.SysI18n if err := s.DB().Find(&i18ns).Error; err != nil { // 如果表不存在,初始化空映射并返回nil(不报错) if errors.Is(err, gorm.ErrRecordNotFound) || isTableNotExistError(err) { i18nMap = make(map[string]map[string]string) return nil } return err } // 删除旧数据 i18nMap = make(map[string]map[string]string) // 按语言分组 for _, i18n := range i18ns { if _, ok := i18nMap[i18n.Lang]; !ok { i18nMap[i18n.Lang] = make(map[string]string) } i18nMap[i18n.Lang][i18n.Name] = i18n.Text } return nil } // 通过keyName 获取多语言场景 func (s *I18nService) Translate(lang string, i18nKey string) string { lang = s.langCompatibility(lang) if text, ok := i18nMap[lang][i18nKey]; ok { return text } // 如果表不存在,直接返回key,不尝试插入 if err := s.DB().Create(&entity.SysI18n{ Lang: lang, Name: i18nKey, Text: i18nKey, }).Error; err != nil { // 如果是表不存在错误,直接返回key,不刷新缓存 if isTableNotExistError(err) { return i18nKey } _ = s.refreshCache() } else { _ = s.refreshCache() } return i18nKey } func (s *I18nService) langCompatibility(lang string) string { return constant.LangCompatibility(lang) } // isTableNotExistError 检查是否是表不存在的错误 func isTableNotExistError(err error) bool { if err == nil { return false } errStr := err.Error() // MySQL 错误 1146 表示表不存在 return strings.Contains(errStr, "1146") || strings.Contains(errStr, "doesn't exist") }