apiValidator.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package global
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/go-playground/locales/en"
  5. "github.com/go-playground/locales/es"
  6. "github.com/go-playground/locales/ko"
  7. "github.com/go-playground/locales/ru"
  8. "github.com/go-playground/locales/fr"
  9. "github.com/go-playground/locales/zh_Hans_CN"
  10. ut "github.com/go-playground/universal-translator"
  11. "github.com/go-playground/validator/v10"
  12. en_translations "github.com/go-playground/validator/v10/translations/en"
  13. es_translations "github.com/go-playground/validator/v10/translations/es"
  14. ru_translations "github.com/go-playground/validator/v10/translations/ru"
  15. zh_translations "github.com/go-playground/validator/v10/translations/zh"
  16. fr_translations "github.com/go-playground/validator/v10/translations/fr"
  17. "reflect"
  18. )
  19. func ApiInitValidator() {
  20. validate := validator.New()
  21. // 定义不同的语言翻译
  22. enT := en.New()
  23. cn := zh_Hans_CN.New()
  24. koT := ko.New()
  25. ruT := ru.New()
  26. esT := es.New()
  27. frT := fr.New()
  28. uni := ut.New(enT, cn, koT, ruT, esT, frT)
  29. enTrans, _ := uni.GetTranslator("en")
  30. zhTrans, _ := uni.GetTranslator("zh_Hans_CN")
  31. koTrans, _ := uni.GetTranslator("ko")
  32. ruTrans, _ := uni.GetTranslator("ru")
  33. esTrans, _ := uni.GetTranslator("es")
  34. frTrans, _ := uni.GetTranslator("fr")
  35. err := zh_translations.RegisterDefaultTranslations(validate, zhTrans)
  36. if err != nil {
  37. panic(err)
  38. }
  39. err = en_translations.RegisterDefaultTranslations(validate, enTrans)
  40. if err != nil {
  41. panic(err)
  42. }
  43. //validate没有ko的翻译,使用zh的翻译
  44. err = zh_translations.RegisterDefaultTranslations(validate, koTrans)
  45. if err != nil {
  46. panic(err)
  47. }
  48. err = ru_translations.RegisterDefaultTranslations(validate, ruTrans)
  49. if err != nil {
  50. panic(err)
  51. }
  52. err = es_translations.RegisterDefaultTranslations(validate, esTrans)
  53. if err != nil {
  54. panic(err)
  55. }
  56. err = fr_translations.RegisterDefaultTranslations(validate, frTrans)
  57. if err != nil {
  58. panic(err)
  59. }
  60. validate.RegisterTagNameFunc(func(field reflect.StructField) string {
  61. label := field.Tag.Get("label")
  62. if label == "" {
  63. return field.Name
  64. }
  65. return label
  66. })
  67. Validator.Validate = validate
  68. Validator.UT = uni // 存储 Universal Translator
  69. Validator.VTrans = zhTrans
  70. Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string {
  71. err := Validator.Validate.Struct(i)
  72. lang := ctx.GetHeader("Accept-Language")
  73. if lang == "" {
  74. lang = Config.Lang
  75. }
  76. trans := getTranslatorForLang(lang)
  77. errList := make([]string, 0, 10)
  78. if err != nil {
  79. if _, ok := err.(*validator.InvalidValidationError); ok {
  80. errList = append(errList, err.Error())
  81. return errList
  82. }
  83. for _, err2 := range err.(validator.ValidationErrors) {
  84. errList = append(errList, err2.Translate(trans))
  85. }
  86. }
  87. return errList
  88. }
  89. Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string {
  90. err := Validator.Validate.Var(field, tag)
  91. lang := ctx.GetHeader("Accept-Language")
  92. if lang == "" {
  93. lang = Config.Lang
  94. }
  95. trans := getTranslatorForLang(lang)
  96. errList := make([]string, 0, 10)
  97. if err != nil {
  98. if _, ok := err.(*validator.InvalidValidationError); ok {
  99. errList = append(errList, err.Error())
  100. return errList
  101. }
  102. for _, err2 := range err.(validator.ValidationErrors) {
  103. errList = append(errList, err2.Translate(trans))
  104. }
  105. }
  106. return errList
  107. }
  108. }
  109. func getTranslatorForLang(lang string) ut.Translator {
  110. switch lang {
  111. case "zh_CN":
  112. fallthrough
  113. case "zh-CN":
  114. fallthrough
  115. case "zh":
  116. trans, _ := Validator.UT.GetTranslator("zh_Hans_CN")
  117. return trans
  118. case "ko":
  119. trans, _ := Validator.UT.GetTranslator("ko")
  120. return trans
  121. case "ru":
  122. trans, _ := Validator.UT.GetTranslator("ru")
  123. return trans
  124. case "es":
  125. trans, _ := Validator.UT.GetTranslator("es")
  126. return trans
  127. case "fr":
  128. trans, _ := Validator.UT.GetTranslator("fr")
  129. return trans
  130. case "en":
  131. fallthrough
  132. default:
  133. trans, _ := Validator.UT.GetTranslator("en")
  134. return trans
  135. }
  136. }