apiValidator.go 3.5 KB

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