1package zh
2
3import (
4	"testing"
5	"time"
6
7	zhongwen "github.com/go-playground/locales/zh"
8	ut "github.com/go-playground/universal-translator"
9	. "github.com/go-playground/assert/v2"
10	"github.com/go-playground/validator/v10"
11)
12
13func TestTranslations(t *testing.T) {
14
15	zh := zhongwen.New()
16	uni := ut.New(zh, zh)
17	trans, _ := uni.GetTranslator("zh")
18
19	validate := validator.New()
20
21	err := RegisterDefaultTranslations(validate, trans)
22	Equal(t, err, nil)
23
24	type Inner struct {
25		EqCSFieldString  string
26		NeCSFieldString  string
27		GtCSFieldString  string
28		GteCSFieldString string
29		LtCSFieldString  string
30		LteCSFieldString string
31	}
32
33	type Test struct {
34		Inner             Inner
35		RequiredString    string    `validate:"required"`
36		RequiredNumber    int       `validate:"required"`
37		RequiredMultiple  []string  `validate:"required"`
38		LenString         string    `validate:"len=1"`
39		LenNumber         float64   `validate:"len=1113.00"`
40		LenMultiple       []string  `validate:"len=7"`
41		MinString         string    `validate:"min=1"`
42		MinNumber         float64   `validate:"min=1113.00"`
43		MinMultiple       []string  `validate:"min=7"`
44		MaxString         string    `validate:"max=3"`
45		MaxNumber         float64   `validate:"max=1113.00"`
46		MaxMultiple       []string  `validate:"max=7"`
47		EqString          string    `validate:"eq=3"`
48		EqNumber          float64   `validate:"eq=2.33"`
49		EqMultiple        []string  `validate:"eq=7"`
50		NeString          string    `validate:"ne="`
51		NeNumber          float64   `validate:"ne=0.00"`
52		NeMultiple        []string  `validate:"ne=0"`
53		LtString          string    `validate:"lt=3"`
54		LtNumber          float64   `validate:"lt=5.56"`
55		LtMultiple        []string  `validate:"lt=2"`
56		LtTime            time.Time `validate:"lt"`
57		LteString         string    `validate:"lte=3"`
58		LteNumber         float64   `validate:"lte=5.56"`
59		LteMultiple       []string  `validate:"lte=2"`
60		LteTime           time.Time `validate:"lte"`
61		GtString          string    `validate:"gt=3"`
62		GtNumber          float64   `validate:"gt=5.56"`
63		GtMultiple        []string  `validate:"gt=2"`
64		GtTime            time.Time `validate:"gt"`
65		GteString         string    `validate:"gte=3"`
66		GteNumber         float64   `validate:"gte=5.56"`
67		GteMultiple       []string  `validate:"gte=2"`
68		GteTime           time.Time `validate:"gte"`
69		EqFieldString     string    `validate:"eqfield=MaxString"`
70		EqCSFieldString   string    `validate:"eqcsfield=Inner.EqCSFieldString"`
71		NeCSFieldString   string    `validate:"necsfield=Inner.NeCSFieldString"`
72		GtCSFieldString   string    `validate:"gtcsfield=Inner.GtCSFieldString"`
73		GteCSFieldString  string    `validate:"gtecsfield=Inner.GteCSFieldString"`
74		LtCSFieldString   string    `validate:"ltcsfield=Inner.LtCSFieldString"`
75		LteCSFieldString  string    `validate:"ltecsfield=Inner.LteCSFieldString"`
76		NeFieldString     string    `validate:"nefield=EqFieldString"`
77		GtFieldString     string    `validate:"gtfield=MaxString"`
78		GteFieldString    string    `validate:"gtefield=MaxString"`
79		LtFieldString     string    `validate:"ltfield=MaxString"`
80		LteFieldString    string    `validate:"ltefield=MaxString"`
81		AlphaString       string    `validate:"alpha"`
82		AlphanumString    string    `validate:"alphanum"`
83		NumericString     string    `validate:"numeric"`
84		NumberString      string    `validate:"number"`
85		HexadecimalString string    `validate:"hexadecimal"`
86		HexColorString    string    `validate:"hexcolor"`
87		RGBColorString    string    `validate:"rgb"`
88		RGBAColorString   string    `validate:"rgba"`
89		HSLColorString    string    `validate:"hsl"`
90		HSLAColorString   string    `validate:"hsla"`
91		Email             string    `validate:"email"`
92		URL               string    `validate:"url"`
93		URI               string    `validate:"uri"`
94		Base64            string    `validate:"base64"`
95		Contains          string    `validate:"contains=purpose"`
96		ContainsAny       string    `validate:"containsany=!@#$"`
97		Excludes          string    `validate:"excludes=text"`
98		ExcludesAll       string    `validate:"excludesall=!@#$"`
99		ExcludesRune      string    `validate:"excludesrune=☻"`
100		ISBN              string    `validate:"isbn"`
101		ISBN10            string    `validate:"isbn10"`
102		ISBN13            string    `validate:"isbn13"`
103		UUID              string    `validate:"uuid"`
104		UUID3             string    `validate:"uuid3"`
105		UUID4             string    `validate:"uuid4"`
106		UUID5             string    `validate:"uuid5"`
107		ASCII             string    `validate:"ascii"`
108		PrintableASCII    string    `validate:"printascii"`
109		MultiByte         string    `validate:"multibyte"`
110		DataURI           string    `validate:"datauri"`
111		Latitude          string    `validate:"latitude"`
112		Longitude         string    `validate:"longitude"`
113		SSN               string    `validate:"ssn"`
114		IP                string    `validate:"ip"`
115		IPv4              string    `validate:"ipv4"`
116		IPv6              string    `validate:"ipv6"`
117		CIDR              string    `validate:"cidr"`
118		CIDRv4            string    `validate:"cidrv4"`
119		CIDRv6            string    `validate:"cidrv6"`
120		TCPAddr           string    `validate:"tcp_addr"`
121		TCPAddrv4         string    `validate:"tcp4_addr"`
122		TCPAddrv6         string    `validate:"tcp6_addr"`
123		UDPAddr           string    `validate:"udp_addr"`
124		UDPAddrv4         string    `validate:"udp4_addr"`
125		UDPAddrv6         string    `validate:"udp6_addr"`
126		IPAddr            string    `validate:"ip_addr"`
127		IPAddrv4          string    `validate:"ip4_addr"`
128		IPAddrv6          string    `validate:"ip6_addr"`
129		UinxAddr          string    `validate:"unix_addr"` // can't fail from within Go's net package currently, but maybe in the future
130		MAC               string    `validate:"mac"`
131		IsColor           string    `validate:"iscolor"`
132		StrPtrMinLen      *string   `validate:"min=10"`
133		StrPtrMaxLen      *string   `validate:"max=1"`
134		StrPtrLen         *string   `validate:"len=2"`
135		StrPtrLt          *string   `validate:"lt=1"`
136		StrPtrLte         *string   `validate:"lte=1"`
137		StrPtrGt          *string   `validate:"gt=10"`
138		StrPtrGte         *string   `validate:"gte=10"`
139		OneOfString       string    `validate:"oneof=red green"`
140		OneOfInt          int       `validate:"oneof=5 63"`
141	}
142
143	var test Test
144
145	test.Inner.EqCSFieldString = "1234"
146	test.Inner.GtCSFieldString = "1234"
147	test.Inner.GteCSFieldString = "1234"
148
149	test.MaxString = "1234"
150	test.MaxNumber = 2000
151	test.MaxMultiple = make([]string, 9)
152
153	test.LtString = "1234"
154	test.LtNumber = 6
155	test.LtMultiple = make([]string, 3)
156	test.LtTime = time.Now().Add(time.Hour * 24)
157
158	test.LteString = "1234"
159	test.LteNumber = 6
160	test.LteMultiple = make([]string, 3)
161	test.LteTime = time.Now().Add(time.Hour * 24)
162
163	test.LtFieldString = "12345"
164	test.LteFieldString = "12345"
165
166	test.LtCSFieldString = "1234"
167	test.LteCSFieldString = "1234"
168
169	test.AlphaString = "abc3"
170	test.AlphanumString = "abc3!"
171	test.NumericString = "12E.00"
172	test.NumberString = "12E"
173
174	test.Excludes = "this is some test text"
175	test.ExcludesAll = "This is Great!"
176	test.ExcludesRune = "Love it ☻"
177
178	test.ASCII = "カタカナ"
179	test.PrintableASCII = "カタカナ"
180
181	test.MultiByte = "1234feerf"
182
183	s := "toolong"
184	test.StrPtrMaxLen = &s
185	test.StrPtrLen = &s
186
187	err = validate.Struct(test)
188	NotEqual(t, err, nil)
189
190	errs, ok := err.(validator.ValidationErrors)
191	Equal(t, ok, true)
192
193	tests := []struct {
194		ns       string
195		expected string
196	}{
197		{
198			ns:       "Test.IsColor",
199			expected: "IsColor必须是一个有效的颜色",
200		},
201		{
202			ns:       "Test.MAC",
203			expected: "MAC必须是一个有效的MAC地址",
204		},
205		{
206			ns:       "Test.IPAddr",
207			expected: "IPAddr必须是一个有效的IP地址",
208		},
209		{
210			ns:       "Test.IPAddrv4",
211			expected: "IPAddrv4必须是一个有效的IPv4地址",
212		},
213		{
214			ns:       "Test.IPAddrv6",
215			expected: "IPAddrv6必须是一个有效的IPv6地址",
216		},
217		{
218			ns:       "Test.UDPAddr",
219			expected: "UDPAddr必须是一个有效的UDP地址",
220		},
221		{
222			ns:       "Test.UDPAddrv4",
223			expected: "UDPAddrv4必须是一个有效的IPv4 UDP地址",
224		},
225		{
226			ns:       "Test.UDPAddrv6",
227			expected: "UDPAddrv6必须是一个有效的IPv6 UDP地址",
228		},
229		{
230			ns:       "Test.TCPAddr",
231			expected: "TCPAddr必须是一个有效的TCP地址",
232		},
233		{
234			ns:       "Test.TCPAddrv4",
235			expected: "TCPAddrv4必须是一个有效的IPv4 TCP地址",
236		},
237		{
238			ns:       "Test.TCPAddrv6",
239			expected: "TCPAddrv6必须是一个有效的IPv6 TCP地址",
240		},
241		{
242			ns:       "Test.CIDR",
243			expected: "CIDR必须是一个有效的无类别域间路由(CIDR)",
244		},
245		{
246			ns:       "Test.CIDRv4",
247			expected: "CIDRv4必须是一个包含IPv4地址的有效无类别域间路由(CIDR)",
248		},
249		{
250			ns:       "Test.CIDRv6",
251			expected: "CIDRv6必须是一个包含IPv6地址的有效无类别域间路由(CIDR)",
252		},
253		{
254			ns:       "Test.SSN",
255			expected: "SSN必须是一个有效的社会安全号码(SSN)",
256		},
257		{
258			ns:       "Test.IP",
259			expected: "IP必须是一个有效的IP地址",
260		},
261		{
262			ns:       "Test.IPv4",
263			expected: "IPv4必须是一个有效的IPv4地址",
264		},
265		{
266			ns:       "Test.IPv6",
267			expected: "IPv6必须是一个有效的IPv6地址",
268		},
269		{
270			ns:       "Test.DataURI",
271			expected: "DataURI必须包含有效的数据URI",
272		},
273		{
274			ns:       "Test.Latitude",
275			expected: "Latitude必须包含有效的纬度坐标",
276		},
277		{
278			ns:       "Test.Longitude",
279			expected: "Longitude必须包含有效的经度坐标",
280		},
281		{
282			ns:       "Test.MultiByte",
283			expected: "MultiByte必须包含多字节字符",
284		},
285		{
286			ns:       "Test.ASCII",
287			expected: "ASCII必须只包含ascii字符",
288		},
289		{
290			ns:       "Test.PrintableASCII",
291			expected: "PrintableASCII必须只包含可打印的ascii字符",
292		},
293		{
294			ns:       "Test.UUID",
295			expected: "UUID必须是一个有效的UUID",
296		},
297		{
298			ns:       "Test.UUID3",
299			expected: "UUID3必须是一个有效的V3 UUID",
300		},
301		{
302			ns:       "Test.UUID4",
303			expected: "UUID4必须是一个有效的V4 UUID",
304		},
305		{
306			ns:       "Test.UUID5",
307			expected: "UUID5必须是一个有效的V5 UUID",
308		},
309		{
310			ns:       "Test.ISBN",
311			expected: "ISBN必须是一个有效的ISBN编号",
312		},
313		{
314			ns:       "Test.ISBN10",
315			expected: "ISBN10必须是一个有效的ISBN-10编号",
316		},
317		{
318			ns:       "Test.ISBN13",
319			expected: "ISBN13必须是一个有效的ISBN-13编号",
320		},
321		{
322			ns:       "Test.Excludes",
323			expected: "Excludes不能包含文本'text'",
324		},
325		{
326			ns:       "Test.ExcludesAll",
327			expected: "ExcludesAll不能包含以下任何字符'!@#$'",
328		},
329		{
330			ns:       "Test.ExcludesRune",
331			expected: "ExcludesRune不能包含'☻'",
332		},
333		{
334			ns:       "Test.ContainsAny",
335			expected: "ContainsAny必须包含至少一个以下字符'!@#$'",
336		},
337		{
338			ns:       "Test.Contains",
339			expected: "Contains必须包含文本'purpose'",
340		},
341		{
342			ns:       "Test.Base64",
343			expected: "Base64必须是一个有效的Base64字符串",
344		},
345		{
346			ns:       "Test.Email",
347			expected: "Email必须是一个有效的邮箱",
348		},
349		{
350			ns:       "Test.URL",
351			expected: "URL必须是一个有效的URL",
352		},
353		{
354			ns:       "Test.URI",
355			expected: "URI必须是一个有效的URI",
356		},
357		{
358			ns:       "Test.RGBColorString",
359			expected: "RGBColorString必须是一个有效的RGB颜色",
360		},
361		{
362			ns:       "Test.RGBAColorString",
363			expected: "RGBAColorString必须是一个有效的RGBA颜色",
364		},
365		{
366			ns:       "Test.HSLColorString",
367			expected: "HSLColorString必须是一个有效的HSL颜色",
368		},
369		{
370			ns:       "Test.HSLAColorString",
371			expected: "HSLAColorString必须是一个有效的HSLA颜色",
372		},
373		{
374			ns:       "Test.HexadecimalString",
375			expected: "HexadecimalString必须是一个有效的十六进制",
376		},
377		{
378			ns:       "Test.HexColorString",
379			expected: "HexColorString必须是一个有效的十六进制颜色",
380		},
381		{
382			ns:       "Test.NumberString",
383			expected: "NumberString必须是一个有效的数字",
384		},
385		{
386			ns:       "Test.NumericString",
387			expected: "NumericString必须是一个有效的数值",
388		},
389		{
390			ns:       "Test.AlphanumString",
391			expected: "AlphanumString只能包含字母和数字",
392		},
393		{
394			ns:       "Test.AlphaString",
395			expected: "AlphaString只能包含字母",
396		},
397		{
398			ns:       "Test.LtFieldString",
399			expected: "LtFieldString必须小于MaxString",
400		},
401		{
402			ns:       "Test.LteFieldString",
403			expected: "LteFieldString必须小于或等于MaxString",
404		},
405		{
406			ns:       "Test.GtFieldString",
407			expected: "GtFieldString必须大于MaxString",
408		},
409		{
410			ns:       "Test.GteFieldString",
411			expected: "GteFieldString必须大于或等于MaxString",
412		},
413		{
414			ns:       "Test.NeFieldString",
415			expected: "NeFieldString不能等于EqFieldString",
416		},
417		{
418			ns:       "Test.LtCSFieldString",
419			expected: "LtCSFieldString必须小于Inner.LtCSFieldString",
420		},
421		{
422			ns:       "Test.LteCSFieldString",
423			expected: "LteCSFieldString必须小于或等于Inner.LteCSFieldString",
424		},
425		{
426			ns:       "Test.GtCSFieldString",
427			expected: "GtCSFieldString必须大于Inner.GtCSFieldString",
428		},
429		{
430			ns:       "Test.GteCSFieldString",
431			expected: "GteCSFieldString必须大于或等于Inner.GteCSFieldString",
432		},
433		{
434			ns:       "Test.NeCSFieldString",
435			expected: "NeCSFieldString不能等于Inner.NeCSFieldString",
436		},
437		{
438			ns:       "Test.EqCSFieldString",
439			expected: "EqCSFieldString必须等于Inner.EqCSFieldString",
440		},
441		{
442			ns:       "Test.EqFieldString",
443			expected: "EqFieldString必须等于MaxString",
444		},
445		{
446			ns:       "Test.GteString",
447			expected: "GteString长度必须至少为3个字符",
448		},
449		{
450			ns:       "Test.GteNumber",
451			expected: "GteNumber必须大于或等于5.56",
452		},
453		{
454			ns:       "Test.GteMultiple",
455			expected: "GteMultiple必须至少包含2项",
456		},
457		{
458			ns:       "Test.GteTime",
459			expected: "GteTime必须大于或等于当前日期和时间",
460		},
461		{
462			ns:       "Test.GtString",
463			expected: "GtString长度必须大于3个字符",
464		},
465		{
466			ns:       "Test.GtNumber",
467			expected: "GtNumber必须大于5.56",
468		},
469		{
470			ns:       "Test.GtMultiple",
471			expected: "GtMultiple必须大于2项",
472		},
473		{
474			ns:       "Test.GtTime",
475			expected: "GtTime必须大于当前日期和时间",
476		},
477		{
478			ns:       "Test.LteString",
479			expected: "LteString长度不能超过3个字符",
480		},
481		{
482			ns:       "Test.LteNumber",
483			expected: "LteNumber必须小于或等于5.56",
484		},
485		{
486			ns:       "Test.LteMultiple",
487			expected: "LteMultiple最多只能包含2项",
488		},
489		{
490			ns:       "Test.LteTime",
491			expected: "LteTime必须小于或等于当前日期和时间",
492		},
493		{
494			ns:       "Test.LtString",
495			expected: "LtString长度必须小于3个字符",
496		},
497		{
498			ns:       "Test.LtNumber",
499			expected: "LtNumber必须小于5.56",
500		},
501		{
502			ns:       "Test.LtMultiple",
503			expected: "LtMultiple必须包含少于2项",
504		},
505		{
506			ns:       "Test.LtTime",
507			expected: "LtTime必须小于当前日期和时间",
508		},
509		{
510			ns:       "Test.NeString",
511			expected: "NeString不能等于",
512		},
513		{
514			ns:       "Test.NeNumber",
515			expected: "NeNumber不能等于0.00",
516		},
517		{
518			ns:       "Test.NeMultiple",
519			expected: "NeMultiple不能等于0",
520		},
521		{
522			ns:       "Test.EqString",
523			expected: "EqString不等于3",
524		},
525		{
526			ns:       "Test.EqNumber",
527			expected: "EqNumber不等于2.33",
528		},
529		{
530			ns:       "Test.EqMultiple",
531			expected: "EqMultiple不等于7",
532		},
533		{
534			ns:       "Test.MaxString",
535			expected: "MaxString长度不能超过3个字符",
536		},
537		{
538			ns:       "Test.MaxNumber",
539			expected: "MaxNumber必须小于或等于1,113.00",
540		},
541		{
542			ns:       "Test.MaxMultiple",
543			expected: "MaxMultiple最多只能包含7项",
544		},
545		{
546			ns:       "Test.MinString",
547			expected: "MinString长度必须至少为1个字符",
548		},
549		{
550			ns:       "Test.MinNumber",
551			expected: "MinNumber最小只能为1,113.00",
552		},
553		{
554			ns:       "Test.MinMultiple",
555			expected: "MinMultiple必须至少包含7项",
556		},
557		{
558			ns:       "Test.LenString",
559			expected: "LenString长度必须是1个字符",
560		},
561		{
562			ns:       "Test.LenNumber",
563			expected: "LenNumber必须等于1,113.00",
564		},
565		{
566			ns:       "Test.LenMultiple",
567			expected: "LenMultiple必须包含7项",
568		},
569		{
570			ns:       "Test.RequiredString",
571			expected: "RequiredString为必填字段",
572		},
573		{
574			ns:       "Test.RequiredNumber",
575			expected: "RequiredNumber为必填字段",
576		},
577		{
578			ns:       "Test.RequiredMultiple",
579			expected: "RequiredMultiple为必填字段",
580		},
581		{
582			ns:       "Test.StrPtrMinLen",
583			expected: "StrPtrMinLen长度必须至少为10个字符",
584		},
585		{
586			ns:       "Test.StrPtrMaxLen",
587			expected: "StrPtrMaxLen长度不能超过1个字符",
588		},
589		{
590			ns:       "Test.StrPtrLen",
591			expected: "StrPtrLen长度必须是2个字符",
592		},
593		{
594			ns:       "Test.StrPtrLt",
595			expected: "StrPtrLt长度必须小于1个字符",
596		},
597		{
598			ns:       "Test.StrPtrLte",
599			expected: "StrPtrLte长度不能超过1个字符",
600		},
601		{
602			ns:       "Test.StrPtrGt",
603			expected: "StrPtrGt长度必须大于10个字符",
604		},
605		{
606			ns:       "Test.StrPtrGte",
607			expected: "StrPtrGte长度必须至少为10个字符",
608		},
609		{
610			ns:       "Test.OneOfString",
611			expected: "OneOfString必须是[red green]中的一个",
612		},
613		{
614			ns:       "Test.OneOfInt",
615			expected: "OneOfInt必须是[5 63]中的一个",
616		},
617	}
618
619	for _, tt := range tests {
620
621		var fe validator.FieldError
622
623		for _, e := range errs {
624			if tt.ns == e.Namespace() {
625				fe = e
626				break
627			}
628		}
629
630		NotEqual(t, fe, nil)
631		Equal(t, tt.expected, fe.Translate(trans))
632	}
633
634}
635