| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- package global
- import (
- "github.com/gin-gonic/gin"
- "github.com/go-playground/locales/en"
- "github.com/go-playground/locales/es"
- "github.com/go-playground/locales/fr"
- "github.com/go-playground/locales/ko"
- "github.com/go-playground/locales/ru"
- "github.com/go-playground/locales/zh_Hans_CN"
- "github.com/go-playground/locales/zh_Hant"
- ut "github.com/go-playground/universal-translator"
- "github.com/go-playground/validator/v10"
- en_translations "github.com/go-playground/validator/v10/translations/en"
- es_translations "github.com/go-playground/validator/v10/translations/es"
- fr_translations "github.com/go-playground/validator/v10/translations/fr"
- ko_translations "github.com/go-playground/validator/v10/translations/ko"
- ru_translations "github.com/go-playground/validator/v10/translations/ru"
- zh_translations "github.com/go-playground/validator/v10/translations/zh"
- zh_tw_translations "github.com/go-playground/validator/v10/translations/zh_tw"
- "reflect"
- )
- func ApiInitValidator() {
- validate := validator.New()
- // 定义不同的语言翻译
- enT := en.New()
- cn := zh_Hans_CN.New()
- koT := ko.New()
- ruT := ru.New()
- esT := es.New()
- frT := fr.New()
- zhTwT := zh_Hant.New()
- uni := ut.New(enT, cn, koT, ruT, esT, frT, zhTwT)
- enTrans, _ := uni.GetTranslator("en")
- zhTrans, _ := uni.GetTranslator("zh_Hans_CN")
- koTrans, _ := uni.GetTranslator("ko")
- ruTrans, _ := uni.GetTranslator("ru")
- esTrans, _ := uni.GetTranslator("es")
- frTrans, _ := uni.GetTranslator("fr")
- zhTwTrans, _ := uni.GetTranslator("zh_Hant")
- err := zh_translations.RegisterDefaultTranslations(validate, zhTrans)
- if err != nil {
- panic(err)
- }
- err = en_translations.RegisterDefaultTranslations(validate, enTrans)
- if err != nil {
- panic(err)
- }
- err = ko_translations.RegisterDefaultTranslations(validate, koTrans)
- if err != nil {
- panic(err)
- }
- err = ru_translations.RegisterDefaultTranslations(validate, ruTrans)
- if err != nil {
- panic(err)
- }
- err = es_translations.RegisterDefaultTranslations(validate, esTrans)
- if err != nil {
- panic(err)
- }
- err = fr_translations.RegisterDefaultTranslations(validate, frTrans)
- if err != nil {
- panic(err)
- }
- err = zh_tw_translations.RegisterDefaultTranslations(validate, zhTwTrans)
- if err != nil {
- panic(err)
- }
- validate.RegisterTagNameFunc(func(field reflect.StructField) string {
- label := field.Tag.Get("label")
- if label == "" {
- return field.Name
- }
- return label
- })
- Validator.Validate = validate
- Validator.UT = uni // 存储 Universal Translator
- Validator.VTrans = zhTrans
- Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string {
- err := Validator.Validate.Struct(i)
- lang := ctx.GetHeader("Accept-Language")
- if lang == "" {
- lang = Config.Lang
- }
- trans := getTranslatorForLang(lang)
- errList := make([]string, 0, 10)
- if err != nil {
- if _, ok := err.(*validator.InvalidValidationError); ok {
- errList = append(errList, err.Error())
- return errList
- }
- for _, err2 := range err.(validator.ValidationErrors) {
- errList = append(errList, err2.Translate(trans))
- }
- }
- return errList
- }
- Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string {
- err := Validator.Validate.Var(field, tag)
- lang := ctx.GetHeader("Accept-Language")
- if lang == "" {
- lang = Config.Lang
- }
- trans := getTranslatorForLang(lang)
- errList := make([]string, 0, 10)
- if err != nil {
- if _, ok := err.(*validator.InvalidValidationError); ok {
- errList = append(errList, err.Error())
- return errList
- }
- for _, err2 := range err.(validator.ValidationErrors) {
- errList = append(errList, err2.Translate(trans))
- }
- }
- return errList
- }
- }
- func getTranslatorForLang(lang string) ut.Translator {
- switch lang {
- case "zh_CN":
- fallthrough
- case "zh-CN":
- fallthrough
- case "zh":
- trans, _ := Validator.UT.GetTranslator("zh_Hans_CN")
- return trans
- case "zh_TW":
- fallthrough
- case "zh-TW":
- fallthrough
- case "zh-tw":
- trans, _ := Validator.UT.GetTranslator("zh_Hant")
- return trans
- case "ko":
- trans, _ := Validator.UT.GetTranslator("ko")
- return trans
- case "ru":
- trans, _ := Validator.UT.GetTranslator("ru")
- return trans
- case "es":
- trans, _ := Validator.UT.GetTranslator("es")
- return trans
- case "fr":
- trans, _ := Validator.UT.GetTranslator("fr")
- return trans
- case "en":
- fallthrough
- default:
- trans, _ := Validator.UT.GetTranslator("en")
- return trans
- }
- }
|