apiValidator.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package global
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/go-playground/locales/en"
  5. "github.com/go-playground/locales/zh_Hans_CN"
  6. ut "github.com/go-playground/universal-translator"
  7. "github.com/go-playground/validator/v10"
  8. en_translations "github.com/go-playground/validator/v10/translations/en"
  9. zh_translations "github.com/go-playground/validator/v10/translations/zh"
  10. "reflect"
  11. )
  12. func ApiInitValidator() {
  13. validate := validator.New()
  14. // 定义不同的语言翻译
  15. enT := en.New()
  16. cn := zh_Hans_CN.New()
  17. uni := ut.New(enT, cn)
  18. enTrans, _ := uni.GetTranslator("en")
  19. zhTrans, _ := uni.GetTranslator("zh_Hans_CN")
  20. err := zh_translations.RegisterDefaultTranslations(validate, zhTrans)
  21. if err != nil {
  22. panic(err)
  23. }
  24. err = en_translations.RegisterDefaultTranslations(validate, enTrans)
  25. if err != nil {
  26. panic(err)
  27. }
  28. validate.RegisterTagNameFunc(func(field reflect.StructField) string {
  29. label := field.Tag.Get("label")
  30. if label == "" {
  31. return field.Name
  32. }
  33. return label
  34. })
  35. Validator.Validate = validate
  36. Validator.UT = uni // 存储 Universal Translator
  37. Validator.VTrans = zhTrans
  38. Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string {
  39. err := Validator.Validate.Struct(i)
  40. lang := ctx.GetHeader("Accept-Language")
  41. if lang == "" {
  42. lang = Config.Lang
  43. }
  44. trans := getTranslatorForLang(lang)
  45. errList := make([]string, 0, 10)
  46. if err != nil {
  47. if _, ok := err.(*validator.InvalidValidationError); ok {
  48. errList = append(errList, err.Error())
  49. return errList
  50. }
  51. for _, err2 := range err.(validator.ValidationErrors) {
  52. errList = append(errList, err2.Translate(trans))
  53. }
  54. }
  55. return errList
  56. }
  57. Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string {
  58. err := Validator.Validate.Var(field, tag)
  59. lang := ctx.GetHeader("Accept-Language")
  60. if lang == "" {
  61. lang = Config.Lang
  62. }
  63. trans := getTranslatorForLang(lang)
  64. errList := make([]string, 0, 10)
  65. if err != nil {
  66. if _, ok := err.(*validator.InvalidValidationError); ok {
  67. errList = append(errList, err.Error())
  68. return errList
  69. }
  70. for _, err2 := range err.(validator.ValidationErrors) {
  71. errList = append(errList, err2.Translate(trans))
  72. }
  73. }
  74. return errList
  75. }
  76. }
  77. func getTranslatorForLang(lang string) ut.Translator {
  78. switch lang {
  79. case "zh_CN":
  80. fallthrough
  81. case "zh-CN":
  82. fallthrough
  83. case "zh":
  84. trans, _ := Validator.UT.GetTranslator("zh_Hans_CN")
  85. return trans
  86. case "en":
  87. fallthrough
  88. default:
  89. trans, _ := Validator.UT.GetTranslator("en")
  90. return trans
  91. }
  92. }