apiValidator.go 4.3 KB

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