apiValidator.go 3.2 KB

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