6 "github.com/go-playground/locales/en"
7 ut "github.com/go-playground/universal-translator"
8 "gopkg.in/go-playground/validator.v9"
9 en_translations "gopkg.in/go-playground/validator.v9/translations/en"
12 // User contains user information
14 FirstName string `validate:"required"`
15 LastName string `validate:"required"`
16 Age uint8 `validate:"gte=0,lte=130"`
17 Email string `validate:"required,email"`
18 FavouriteColor string `validate:"iscolor"` // alias for 'hexcolor|rgb|rgba|hsl|hsla'
19 Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage...
22 // Address houses a users address information
24 Street string `validate:"required"`
25 City string `validate:"required"`
26 Planet string `validate:"required"`
27 Phone string `validate:"required"`
30 // use a single instance , it caches struct info
32 uni *ut.UniversalTranslator
33 validate *validator.Validate
38 // NOTE: ommitting allot of error checking for brevity
43 // this is usually know or extracted from http 'Accept-Language' header
44 // also see uni.FindTranslator(...)
45 trans, _ := uni.GetTranslator("en")
47 validate = validator.New()
48 en_translations.RegisterDefaultTranslations(validate, trans)
51 translateIndividual(trans)
52 translateOverride(trans) // yep you can specify your own in whatever locale you want!
55 func translateAll(trans ut.Translator) {
58 Username string `validate:"required"`
59 Tagline string `validate:"required,lt=10"`
60 Tagline2 string `validate:"required,gt=1"`
64 Username: "Joeybloggs",
65 Tagline: "This tagline is way too long.",
69 err := validate.Struct(user)
72 // translate all error at once
73 errs := err.(validator.ValidationErrors)
75 // returns a map with key = namespace & value = translated error
76 // NOTICE: 2 errors are returned and you'll see something surprising
77 // translations are i18n aware!!!!
78 // eg. '10 characters' vs '1 character'
79 fmt.Println(errs.Translate(trans))
83 func translateIndividual(trans ut.Translator) {
86 Username string `validate:"required"`
91 err := validate.Struct(user)
94 errs := err.(validator.ValidationErrors)
96 for _, e := range errs {
97 // can translate each error one at a time.
98 fmt.Println(e.Translate(trans))
103 func translateOverride(trans ut.Translator) {
105 validate.RegisterTranslation("required", trans, func(ut ut.Translator) error {
106 return ut.Add("required", "{0} must have a value!", true) // see universal-translator for details
107 }, func(ut ut.Translator, fe validator.FieldError) string {
108 t, _ := ut.T("required", fe.Field())
114 Username string `validate:"required"`
119 err := validate.Struct(user)
122 errs := err.(validator.ValidationErrors)
124 for _, e := range errs {
125 // can translate each error one at a time.
126 fmt.Println(e.Translate(trans))