Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions translations/en/en.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,19 @@ import (
// RegisterDefaultTranslations registers a set of default translations
// for all built in tag's in validator; you may add your own as desired.
func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {
tf, err := RegisterDefaultTranslationsFunc(trans)
if err != nil {
return err
}

return v.RegisterTranslationsFunc(trans, tf)
}

// RegisterDefaultTranslationsFunc registers a set of default translations
// for all built in tag's in validator; you may add your own as desired.
// This version returns a map[tag]validator.TranslationFunc, which can be set on a validator using
// validator.Validate.RegisterTranslationsFunc.
func RegisterDefaultTranslationsFunc(trans ut.Translator) (map[string]validator.TranslationFunc, error) {
translations := []struct {
tag string
translation string
Expand Down Expand Up @@ -1363,24 +1376,31 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
},
}

var err error
ret := map[string]validator.TranslationFunc{}

for _, t := range translations {

if t.customTransFunc != nil && t.customRegisFunc != nil {
err = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)
ret[t.tag] = t.customTransFunc
err = t.customRegisFunc(trans)
} else if t.customTransFunc != nil && t.customRegisFunc == nil {
err = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)
ret[t.tag] = t.customTransFunc
err = registrationFunc(t.tag, t.translation, t.override)(trans)
} else if t.customTransFunc == nil && t.customRegisFunc != nil {
err = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)
ret[t.tag] = translateFunc
err = t.customRegisFunc(trans)
} else {
err = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)
ret[t.tag] = translateFunc
err = registrationFunc(t.tag, t.translation, t.override)(trans)
}

if err != nil {
return
return nil, err
}
}

return
return ret, nil
}

func registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {
Expand Down
37 changes: 29 additions & 8 deletions validator_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,14 +190,14 @@ func (v *Validate) ValidateMap(data map[string]interface{}, rules map[string]int
//
// eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names:
//
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
// // skip if tag key says it should be ignored
// if name == "-" {
// return ""
// }
// return name
// })
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
// // skip if tag key says it should be ignored
// if name == "-" {
// return ""
// }
// return name
// })
func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {
v.tagNameFunc = fn
v.hasTagNameFunc = true
Expand Down Expand Up @@ -350,6 +350,27 @@ func (v *Validate) RegisterTranslation(tag string, trans ut.Translator, register
return
}

// RegisterTranslationsFunc registers translations against the provided tag.
// This assumes that the tag translations have already been added to the Translator.
func (v *Validate) RegisterTranslationsFunc(trans ut.Translator, translationsFn map[string]TranslationFunc) (err error) {

if v.transTagFunc == nil {
v.transTagFunc = make(map[ut.Translator]map[string]TranslationFunc)
}

m, ok := v.transTagFunc[trans]
if !ok {
m = make(map[string]TranslationFunc)
v.transTagFunc[trans] = m
}

for tag, fn := range translationsFn {
m[tag] = fn
}

return
}

// Struct validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified.
//
// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
Expand Down