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.
83 lines
2.0 KiB
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
|
|
}
|