apiValidator.go 2.8 KB

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