diff --git a/validator_instance.go b/validator_instance.go index 779f689a..b40fc32f 100644 --- a/validator_instance.go +++ b/validator_instance.go @@ -89,6 +89,7 @@ type Validate struct { aliases map[string]string validations map[string]internalValidationFuncWrapper transTagFunc map[ut.Translator]map[string]TranslationFunc // map[]map[]TranslationFunc + translator map[string]ut.Translator rules map[reflect.Type]map[string]string tagCache *tagCache structCache *structCache @@ -115,6 +116,7 @@ func New(options ...Option) *Validate { tagName: defaultTagName, aliases: make(map[string]string, len(bakedInAliases)), validations: make(map[string]internalValidationFuncWrapper, len(bakedInValidators)), + translator: make(map[string]ut.Translator), tagCache: tc, structCache: sc, } @@ -361,6 +363,14 @@ func (v *Validate) RegisterTranslation(tag string, trans ut.Translator, register return } +func (v *Validate) RegisterTranslator(trans ut.Translator, locale string) { + v.translator[locale] = trans +} + +func (v *Validate) Translator(locale string) ut.Translator { + return v.translator[locale] +} + // 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. diff --git a/validator_test.go b/validator_test.go index 11013bc0..6d246a07 100644 --- a/validator_test.go +++ b/validator_test.go @@ -9489,7 +9489,9 @@ func TestTranslations(t *testing.T) { fr, _ := uni.GetTranslator("fr") validate := New() - err := validate.RegisterTranslation("required", trans, + validate.RegisterTranslator(trans, "en") + validate.RegisterTranslator(fr, "fr") + err := validate.RegisterTranslation("required", validate.Translator("en"), func(ut ut.Translator) (err error) { // using this stype because multiple translation may have to be added for the full translation if err = ut.Add("required", "{0} is a required field", false); err != nil { @@ -9508,7 +9510,7 @@ func TestTranslations(t *testing.T) { }) Equal(t, err, nil) - err = validate.RegisterTranslation("required", fr, + err = validate.RegisterTranslation("required", validate.Translator("fr"), func(ut ut.Translator) (err error) { // using this stype because multiple translation may have to be added for the full translation if err = ut.Add("required", "{0} est un champ obligatoire", false); err != nil { @@ -9543,7 +9545,7 @@ func TestTranslations(t *testing.T) { fe := errs[0] Equal(t, fe.Tag(), "required") Equal(t, fe.Namespace(), "Test.Value") - Equal(t, fe.Translate(trans), fmt.Sprintf("%s is a required field", fe.Field())) + Equal(t, fe.Translate(validate.Translator("en")), fmt.Sprintf("%s is a required field", fe.Field())) Equal(t, fe.Translate(fr), fmt.Sprintf("%s est un champ obligatoire", fe.Field())) nl := nl.New() @@ -9551,14 +9553,14 @@ func TestTranslations(t *testing.T) { trans2, _ := uni2.GetTranslator("nl") Equal(t, fe.Translate(trans2), "Key: 'Test.Value' Error:Field validation for 'Value' failed on the 'required' tag") - terrs := errs.Translate(trans) + terrs := errs.Translate(validate.Translator("en")) Equal(t, len(terrs), 1) v, ok := terrs["Test.Value"] Equal(t, ok, true) Equal(t, v, fmt.Sprintf("%s is a required field", fe.Field())) - terrs = errs.Translate(fr) + terrs = errs.Translate(validate.Translator("fr")) Equal(t, len(terrs), 1) v, ok = terrs["Test.Value"] @@ -9580,7 +9582,7 @@ func TestTranslations(t *testing.T) { fe = errs[0] Equal(t, fe.Tag(), "gt") Equal(t, fe.Namespace(), "Test2.Value") - Equal(t, fe.Translate(trans), "Key: 'Test2.Value' Error:Field validation for 'Value' failed on the 'gt' tag") + Equal(t, fe.Translate(validate.Translator("en")), "Key: 'Test2.Value' Error:Field validation for 'Value' failed on the 'gt' tag") } func TestTranslationErrors(t *testing.T) {