You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
govalidator/validator.go

83 lines
2.0 KiB

package govalidator
import (
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
enTranslations "github.com/go-playground/validator/v10/translations/en"
chTranslations "github.com/go-playground/validator/v10/translations/zh"
"reflect"
"strings"
)
type Validator struct {
uni *ut.UniversalTranslator
validate *validator.Validate
trans ut.Translator
}
func NewValidator(local string) (*Validator, error) {
v := &Validator{}
// 获取gin的校验器
var ok bool
if v.validate, ok = binding.Validator.Engine().(*validator.Validate); ok {
v.validate.RegisterTagNameFunc(func(field reflect.StructField) string {
// 参数名称
paramsName := field.Tag.Get("params_name")
if paramsName == "-" {
// 将大写的User替换为json中定义的tag标签 -- "LoginForm.user": "user长度不能超过10个字符"
oldName := strings.SplitN(field.Tag.Get("json"), ",", 2)[0]
if oldName == "-" {
return ""
}
}
return paramsName
})
zhT := zh.New() // 中文
enT := en.New() // 英文
v.uni = ut.New(enT, zhT, enT)
var o bool
v.trans, o = v.uni.GetTranslator(local)
if !o {
return nil, nil
}
// 注册翻译器
var err error
switch local {
case "en":
err = enTranslations.RegisterDefaultTranslations(v.validate, v.trans)
case "zh":
err = chTranslations.RegisterDefaultTranslations(v.validate, v.trans)
default:
err = chTranslations.RegisterDefaultTranslations(v.validate, v.trans)
}
if err != nil {
return nil, err
}
return v, nil
}
return nil, nil
}
// Translate 翻译错误信息
// https://learnku.com/articles/59498
// https://www.cnblogs.com/silent-cxl/p/15181647.html
func (v *Validator) Translate(err error) (errMsg string) {
errs := err.(validator.ValidationErrors)
for _, err := range errs {
errMsg = err.Translate(v.trans)
break
}
return
}