93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package component
|
||
|
||
import (
|
||
"errors"
|
||
"gitee.ltd/lxh/logger/log"
|
||
"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"
|
||
zhTranslations "github.com/go-playground/validator/v10/translations/zh"
|
||
"reflect"
|
||
"strings"
|
||
)
|
||
|
||
var validatorTrans ut.Translator
|
||
|
||
func init() {
|
||
initValidatorTranslator()
|
||
}
|
||
|
||
func Error(err error) string {
|
||
var errs validator.ValidationErrors
|
||
ok := errors.As(err, &errs)
|
||
if !ok {
|
||
return err.Error()
|
||
}
|
||
|
||
errMap := errs.Translate(validatorTrans)
|
||
|
||
var errMsg string
|
||
for _, v := range errMap {
|
||
errMsg = v
|
||
}
|
||
|
||
return errMsg
|
||
}
|
||
|
||
// initValidatorTranslator
|
||
// @description: 初始化翻译机
|
||
// @receiver vli
|
||
func initValidatorTranslator() {
|
||
//修改gin框架中的Validator属性,实现自定制
|
||
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
|
||
// 注册一个获取json tag的自定义方法
|
||
v.RegisterTagNameFunc(func(fld reflect.StructField) string {
|
||
name := strings.SplitN(fld.Tag.Get("label"), ",", 2)[0]
|
||
if name == "-" {
|
||
return ""
|
||
}
|
||
return name
|
||
})
|
||
|
||
zhT := zh.New() //中文翻译器
|
||
enT := en.New() //英文翻译器
|
||
|
||
// 第一个参数是备用(fallback)的语言环境
|
||
// 后面的参数是应该支持的语言环境(支持多个)
|
||
// uni := ut.New(zhT, zhT) 也是可以的
|
||
uni := ut.New(enT, zhT, enT)
|
||
|
||
// locale 通常取决于 http 请求头的 'Accept-Language'
|
||
var ok bool
|
||
// 也可以使用 uni.FindTranslator(...) 传入多个locale进行查找
|
||
validatorTrans, ok = uni.GetTranslator("zh")
|
||
if !ok {
|
||
log.Errorf("获取翻译机失败")
|
||
return
|
||
}
|
||
|
||
err := overrideTranslator(v, validatorTrans)
|
||
if err != nil {
|
||
log.Errorf("覆盖原有翻译失败: %v", err.Error())
|
||
return
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
// overrideTranslator
|
||
// @description: 覆盖原有翻译
|
||
// @param v
|
||
// @param translator
|
||
// @return error
|
||
func overrideTranslator(v *validator.Validate, translator ut.Translator) error {
|
||
err := zhTranslations.RegisterDefaultTranslations(v, translator)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|