server_i18n.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package services
  2. import (
  3. "app/commons/constant"
  4. "app/commons/model/entity"
  5. "errors"
  6. "strings"
  7. "gorm.io/gorm"
  8. )
  9. var (
  10. i18nService *I18nService
  11. prefix = ""
  12. i18nMap map[string]map[string]string // 语言数据
  13. )
  14. // I18nService 国际化服务
  15. type I18nService struct {
  16. CommonService
  17. }
  18. func i18nInit() {
  19. i18nService = &I18nService{}
  20. _ = i18nService.refreshCache()
  21. }
  22. func GetI18nService() *I18nService {
  23. if i18nService == nil {
  24. i18nInit()
  25. }
  26. return i18nService
  27. }
  28. func (s *I18nService) refreshCache() error {
  29. // 查询所有国际化数据
  30. var i18ns []*entity.SysI18n
  31. if err := s.DB().Find(&i18ns).Error; err != nil {
  32. // 如果表不存在,初始化空映射并返回nil(不报错)
  33. if errors.Is(err, gorm.ErrRecordNotFound) || isTableNotExistError(err) {
  34. i18nMap = make(map[string]map[string]string)
  35. return nil
  36. }
  37. return err
  38. }
  39. // 删除旧数据
  40. i18nMap = make(map[string]map[string]string)
  41. // 按语言分组
  42. for _, i18n := range i18ns {
  43. if _, ok := i18nMap[i18n.Lang]; !ok {
  44. i18nMap[i18n.Lang] = make(map[string]string)
  45. }
  46. i18nMap[i18n.Lang][i18n.Name] = i18n.Text
  47. }
  48. return nil
  49. }
  50. // 通过keyName 获取多语言场景
  51. func (s *I18nService) Translate(lang string, i18nKey string) string {
  52. lang = s.langCompatibility(lang)
  53. if text, ok := i18nMap[lang][i18nKey]; ok {
  54. return text
  55. }
  56. // 如果表不存在,直接返回key,不尝试插入
  57. if err := s.DB().Create(&entity.SysI18n{
  58. Lang: lang,
  59. Name: i18nKey,
  60. Text: i18nKey,
  61. }).Error; err != nil {
  62. // 如果是表不存在错误,直接返回key,不刷新缓存
  63. if isTableNotExistError(err) {
  64. return i18nKey
  65. }
  66. _ = s.refreshCache()
  67. } else {
  68. _ = s.refreshCache()
  69. }
  70. return i18nKey
  71. }
  72. func (s *I18nService) langCompatibility(lang string) string {
  73. return constant.LangCompatibility(lang)
  74. }
  75. // isTableNotExistError 检查是否是表不存在的错误
  76. func isTableNotExistError(err error) bool {
  77. if err == nil {
  78. return false
  79. }
  80. errStr := err.Error()
  81. // MySQL 错误 1146 表示表不存在
  82. return strings.Contains(errStr, "1146") || strings.Contains(errStr, "doesn't exist")
  83. }