server_i18n.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package services
  2. import (
  3. "app/commons/constant"
  4. "app/commons/model/entity"
  5. )
  6. var (
  7. i18nService *I18nService
  8. prefix = ""
  9. i18nMap map[string]map[string]string // 语言数据
  10. )
  11. // I18nService 国际化服务
  12. type I18nService struct {
  13. CommonService
  14. }
  15. func i18nInit() {
  16. i18nService = &I18nService{}
  17. _ = i18nService.refreshCache()
  18. }
  19. func GetI18nService() *I18nService {
  20. if i18nService == nil {
  21. i18nInit()
  22. }
  23. return i18nService
  24. }
  25. func (s *I18nService) refreshCache() error {
  26. // 查询所有国际化数据
  27. var i18ns []*entity.SysI18n
  28. if err := s.DB().Find(&i18ns).Error; err != nil {
  29. return err
  30. }
  31. // 删除旧数据
  32. i18nMap = make(map[string]map[string]string)
  33. // 按语言分组
  34. for _, i18n := range i18ns {
  35. if _, ok := i18nMap[i18n.Lang]; !ok {
  36. i18nMap[i18n.Lang] = make(map[string]string)
  37. }
  38. i18nMap[i18n.Lang][i18n.Name] = i18n.Text
  39. }
  40. return nil
  41. }
  42. // 通过keyName 获取多语言场景
  43. func (s *I18nService) Translate(lang string, i18nKey string) string {
  44. lang = s.langCompatibility(lang)
  45. if text, ok := i18nMap[lang][i18nKey]; ok {
  46. return text
  47. }
  48. _ = s.DB().Create(&entity.SysI18n{
  49. Lang: lang,
  50. Name: i18nKey,
  51. Text: i18nKey,
  52. }).Error
  53. _ = s.refreshCache()
  54. return i18nKey
  55. }
  56. func (s *I18nService) langCompatibility(lang string) string {
  57. return constant.LangCompatibility(lang)
  58. }