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