@@ -11,6 +11,11 @@ import (
1111 "time"
1212
1313 . "gopkg.in/go-playground/assert.v1"
14+
15+ "github.com/go-playground/locales/en"
16+ "github.com/go-playground/locales/fr"
17+ "github.com/go-playground/locales/nl"
18+ "github.com/go-playground/universal-translator"
1419)
1520
1621// NOTES:
@@ -6413,3 +6418,145 @@ func TestRequired(t *testing.T) {
64136418 NotEqual (t , err , nil )
64146419 AssertError (t , err .(ValidationErrors ), "Test.Value" , "Test.Value" , "Value" , "Value" , "required" )
64156420}
6421+
6422+ func TestTranslations (t * testing.T ) {
6423+ en := en .New ()
6424+ uni := ut .New (en , en , fr .New ())
6425+
6426+ trans , _ := uni .GetTranslator ("en" )
6427+ fr , _ := uni .GetTranslator ("fr" )
6428+
6429+ validate := New ()
6430+ err := validate .RegisterTranslation ("required" , trans ,
6431+ func (ut ut.Translator ) (err error ) {
6432+
6433+ // using this stype because multiple translation may have to be added for the full translation
6434+ if err = ut .Add ("required" , "{0} is a required field" , false ); err != nil {
6435+ return
6436+ }
6437+
6438+ return
6439+
6440+ }, func (ut ut.Translator , fe FieldError ) string {
6441+
6442+ t , err := ut .T (fe .Tag (), fe .Field ())
6443+ if err != nil {
6444+ fmt .Printf ("warning: error translating FieldError: %#v" , fe .(* fieldError ))
6445+ return fe .(* fieldError ).Error ()
6446+ }
6447+
6448+ return t
6449+ })
6450+ Equal (t , err , nil )
6451+
6452+ err = validate .RegisterTranslation ("required" , fr ,
6453+ func (ut ut.Translator ) (err error ) {
6454+
6455+ // using this stype because multiple translation may have to be added for the full translation
6456+ if err = ut .Add ("required" , "{0} est un champ obligatoire" , false ); err != nil {
6457+ return
6458+ }
6459+
6460+ return
6461+
6462+ }, func (ut ut.Translator , fe FieldError ) string {
6463+
6464+ t , err := ut .T (fe .Tag (), fe .Field ())
6465+ if err != nil {
6466+ fmt .Printf ("warning: error translating FieldError: %#v" , fe .(* fieldError ))
6467+ return fe .(* fieldError ).Error ()
6468+ }
6469+
6470+ return t
6471+ })
6472+
6473+ Equal (t , err , nil )
6474+
6475+ type Test struct {
6476+ Value interface {} `validate:"required"`
6477+ }
6478+
6479+ var test Test
6480+
6481+ err = validate .Struct (test )
6482+ NotEqual (t , err , nil )
6483+
6484+ errs := err .(ValidationErrors )
6485+ Equal (t , len (errs ), 1 )
6486+
6487+ fe := errs [0 ]
6488+ Equal (t , fe .Tag (), "required" )
6489+ Equal (t , fe .Namespace (), "Test.Value" )
6490+ Equal (t , fe .Translate (trans ), fmt .Sprintf ("%s is a required field" , fe .Field ()))
6491+ Equal (t , fe .Translate (fr ), fmt .Sprintf ("%s est un champ obligatoire" , fe .Field ()))
6492+
6493+ nl := nl .New ()
6494+ uni2 := ut .New (nl , nl )
6495+ trans2 , _ := uni2 .GetTranslator ("nl" )
6496+ Equal (t , fe .Translate (trans2 ), "Key: 'Test.Value' Error:Field validation for 'Value' failed on the 'required' tag" )
6497+
6498+ terrs := errs .Translate (trans )
6499+ Equal (t , len (terrs ), 1 )
6500+
6501+ v , ok := terrs ["Test.Value" ]
6502+ Equal (t , ok , true )
6503+ Equal (t , v , fmt .Sprintf ("%s is a required field" , fe .Field ()))
6504+
6505+ terrs = errs .Translate (fr )
6506+ Equal (t , len (terrs ), 1 )
6507+
6508+ v , ok = terrs ["Test.Value" ]
6509+ Equal (t , ok , true )
6510+ Equal (t , v , fmt .Sprintf ("%s est un champ obligatoire" , fe .Field ()))
6511+
6512+ type Test2 struct {
6513+ Value string `validate:"gt=1"`
6514+ }
6515+
6516+ var t2 Test2
6517+
6518+ err = validate .Struct (t2 )
6519+ NotEqual (t , err , nil )
6520+
6521+ errs = err .(ValidationErrors )
6522+ Equal (t , len (errs ), 1 )
6523+
6524+ fe = errs [0 ]
6525+ Equal (t , fe .Tag (), "gt" )
6526+ Equal (t , fe .Namespace (), "Test2.Value" )
6527+ Equal (t , fe .Translate (trans ), "Key: 'Test2.Value' Error:Field validation for 'Value' failed on the 'gt' tag" )
6528+ }
6529+
6530+ func TestTranslationErrors (t * testing.T ) {
6531+
6532+ en := en .New ()
6533+ uni := ut .New (en , en , fr .New ())
6534+
6535+ trans , _ := uni .GetTranslator ("en" )
6536+ trans .Add ("required" , "{0} is a required field" , false ) // using translator outside of validator also
6537+
6538+ validate := New ()
6539+ err := validate .RegisterTranslation ("required" , trans ,
6540+ func (ut ut.Translator ) (err error ) {
6541+
6542+ // using this stype because multiple translation may have to be added for the full translation
6543+ if err = ut .Add ("required" , "{0} is a required field" , false ); err != nil {
6544+ return
6545+ }
6546+
6547+ return
6548+
6549+ }, func (ut ut.Translator , fe FieldError ) string {
6550+
6551+ t , err := ut .T (fe .Tag (), fe .Field ())
6552+ if err != nil {
6553+ fmt .Printf ("warning: error translating FieldError: %#v" , fe .(* fieldError ))
6554+ return fe .(* fieldError ).Error ()
6555+ }
6556+
6557+ return t
6558+ })
6559+
6560+ NotEqual (t , err , nil )
6561+ Equal (t , err .Error (), "error: conflicting key 'required' rule 'Unknown' with text '{0} is a required field', value being ignored" )
6562+ }
0 commit comments