1package zh_tw 2 3import ( 4 "testing" 5 "time" 6 7 . "github.com/go-playground/assert/v2" 8 zhongwen "github.com/go-playground/locales/zh_Hant_TW" 9 ut "github.com/go-playground/universal-translator" 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 Datetime string `validate:"datetime=2006-01-02"` 142 } 143 144 var test Test 145 146 test.Inner.EqCSFieldString = "1234" 147 test.Inner.GtCSFieldString = "1234" 148 test.Inner.GteCSFieldString = "1234" 149 150 test.MaxString = "1234" 151 test.MaxNumber = 2000 152 test.MaxMultiple = make([]string, 9) 153 154 test.LtString = "1234" 155 test.LtNumber = 6 156 test.LtMultiple = make([]string, 3) 157 test.LtTime = time.Now().Add(time.Hour * 24) 158 159 test.LteString = "1234" 160 test.LteNumber = 6 161 test.LteMultiple = make([]string, 3) 162 test.LteTime = time.Now().Add(time.Hour * 24) 163 164 test.LtFieldString = "12345" 165 test.LteFieldString = "12345" 166 167 test.LtCSFieldString = "1234" 168 test.LteCSFieldString = "1234" 169 170 test.AlphaString = "abc3" 171 test.AlphanumString = "abc3!" 172 test.NumericString = "12E.00" 173 test.NumberString = "12E" 174 175 test.Excludes = "this is some test text" 176 test.ExcludesAll = "This is Great!" 177 test.ExcludesRune = "Love it ☻" 178 179 test.ASCII = "カタカナ" 180 test.PrintableASCII = "カタカナ" 181 182 test.MultiByte = "1234feerf" 183 184 s := "toolong" 185 test.StrPtrMaxLen = &s 186 test.StrPtrLen = &s 187 188 test.Datetime = "2008-Feb-01" 189 190 err = validate.Struct(test) 191 NotEqual(t, err, nil) 192 193 errs, ok := err.(validator.ValidationErrors) 194 Equal(t, ok, true) 195 196 tests := []struct { 197 ns string 198 expected string 199 }{ 200 { 201 ns: "Test.IsColor", 202 expected: "IsColor必須是一個有效的顏色", 203 }, 204 { 205 ns: "Test.MAC", 206 expected: "MAC必須是一個有效的MAC地址", 207 }, 208 { 209 ns: "Test.IPAddr", 210 expected: "IPAddr必須是一個有效的IP地址", 211 }, 212 { 213 ns: "Test.IPAddrv4", 214 expected: "IPAddrv4必須是一個有效的IPv4地址", 215 }, 216 { 217 ns: "Test.IPAddrv6", 218 expected: "IPAddrv6必須是一個有效的IPv6地址", 219 }, 220 { 221 ns: "Test.UDPAddr", 222 expected: "UDPAddr必須是一個有效的UDP地址", 223 }, 224 { 225 ns: "Test.UDPAddrv4", 226 expected: "UDPAddrv4必須是一個有效的IPv4 UDP地址", 227 }, 228 { 229 ns: "Test.UDPAddrv6", 230 expected: "UDPAddrv6必須是一個有效的IPv6 UDP地址", 231 }, 232 { 233 ns: "Test.TCPAddr", 234 expected: "TCPAddr必須是一個有效的TCP地址", 235 }, 236 { 237 ns: "Test.TCPAddrv4", 238 expected: "TCPAddrv4必須是一個有效的IPv4 TCP地址", 239 }, 240 { 241 ns: "Test.TCPAddrv6", 242 expected: "TCPAddrv6必須是一個有效的IPv6 TCP地址", 243 }, 244 { 245 ns: "Test.CIDR", 246 expected: "CIDR必須是一個有效的無類別域間路由(CIDR)", 247 }, 248 { 249 ns: "Test.CIDRv4", 250 expected: "CIDRv4必須是一个包含IPv4地址的有效無類別域間路由(CIDR)", 251 }, 252 { 253 ns: "Test.CIDRv6", 254 expected: "CIDRv6必須是一个包含IPv6地址的有效無類別域間路由(CIDR)", 255 }, 256 { 257 ns: "Test.SSN", 258 expected: "SSN必須是一個有效的社會安全編號(SSN)", 259 }, 260 { 261 ns: "Test.IP", 262 expected: "IP必須是一個有效的IP地址", 263 }, 264 { 265 ns: "Test.IPv4", 266 expected: "IPv4必須是一個有效的IPv4地址", 267 }, 268 { 269 ns: "Test.IPv6", 270 expected: "IPv6必須是一個有效的IPv6地址", 271 }, 272 { 273 ns: "Test.DataURI", 274 expected: "DataURI必須包含有效的數據URI", 275 }, 276 { 277 ns: "Test.Latitude", 278 expected: "Latitude必須包含有效的緯度座標", 279 }, 280 { 281 ns: "Test.Longitude", 282 expected: "Longitude必須包含有效的經度座標", 283 }, 284 { 285 ns: "Test.MultiByte", 286 expected: "MultiByte必須包含多個字元", 287 }, 288 { 289 ns: "Test.ASCII", 290 expected: "ASCII必須只包含ascii字元", 291 }, 292 { 293 ns: "Test.PrintableASCII", 294 expected: "PrintableASCII必須只包含可輸出的ascii字元", 295 }, 296 { 297 ns: "Test.UUID", 298 expected: "UUID必須是一個有效的UUID", 299 }, 300 { 301 ns: "Test.UUID3", 302 expected: "UUID3必須是一個有效的V3 UUID", 303 }, 304 { 305 ns: "Test.UUID4", 306 expected: "UUID4必須是一個有效的V4 UUID", 307 }, 308 { 309 ns: "Test.UUID5", 310 expected: "UUID5必須是一個有效的V5 UUID", 311 }, 312 { 313 ns: "Test.ISBN", 314 expected: "ISBN必須是一個有效的ISBN編號", 315 }, 316 { 317 ns: "Test.ISBN10", 318 expected: "ISBN10必須是一個有效的ISBN-10編號", 319 }, 320 { 321 ns: "Test.ISBN13", 322 expected: "ISBN13必須是一個有效的ISBN-13編號", 323 }, 324 { 325 ns: "Test.Excludes", 326 expected: "Excludes不能包含文字'text'", 327 }, 328 { 329 ns: "Test.ExcludesAll", 330 expected: "ExcludesAll不能包含以下任何字元'!@#$'", 331 }, 332 { 333 ns: "Test.ExcludesRune", 334 expected: "ExcludesRune不能包含'☻'", 335 }, 336 { 337 ns: "Test.ContainsAny", 338 expected: "ContainsAny必須包含至少一個以下字元'!@#$'", 339 }, 340 { 341 ns: "Test.Contains", 342 expected: "Contains必須包含文字'purpose'", 343 }, 344 { 345 ns: "Test.Base64", 346 expected: "Base64必須是一個有效的Base64字元串", 347 }, 348 { 349 ns: "Test.Email", 350 expected: "Email必須是一個有效的信箱", 351 }, 352 { 353 ns: "Test.URL", 354 expected: "URL必須是一個有效的URL", 355 }, 356 { 357 ns: "Test.URI", 358 expected: "URI必須是一個有效的URI", 359 }, 360 { 361 ns: "Test.RGBColorString", 362 expected: "RGBColorString必須是一個有效的RGB顏色", 363 }, 364 { 365 ns: "Test.RGBAColorString", 366 expected: "RGBAColorString必須是一個有效的RGBA顏色", 367 }, 368 { 369 ns: "Test.HSLColorString", 370 expected: "HSLColorString必須是一個有效的HSL顏色", 371 }, 372 { 373 ns: "Test.HSLAColorString", 374 expected: "HSLAColorString必須是一個有效的HSLA顏色", 375 }, 376 { 377 ns: "Test.HexadecimalString", 378 expected: "HexadecimalString必須是一個有效的十六進制", 379 }, 380 { 381 ns: "Test.HexColorString", 382 expected: "HexColorString必須是一個有效的十六進制顏色", 383 }, 384 { 385 ns: "Test.NumberString", 386 expected: "NumberString必須是一個有效的數字", 387 }, 388 { 389 ns: "Test.NumericString", 390 expected: "NumericString必須是一個有效的數值", 391 }, 392 { 393 ns: "Test.AlphanumString", 394 expected: "AlphanumString只能包含字母和數字", 395 }, 396 { 397 ns: "Test.AlphaString", 398 expected: "AlphaString只能包含字母", 399 }, 400 { 401 ns: "Test.LtFieldString", 402 expected: "LtFieldString必須小於MaxString", 403 }, 404 { 405 ns: "Test.LteFieldString", 406 expected: "LteFieldString必須小於或等於MaxString", 407 }, 408 { 409 ns: "Test.GtFieldString", 410 expected: "GtFieldString必須大於MaxString", 411 }, 412 { 413 ns: "Test.GteFieldString", 414 expected: "GteFieldString必須大於或等於MaxString", 415 }, 416 { 417 ns: "Test.NeFieldString", 418 expected: "NeFieldString不能等於EqFieldString", 419 }, 420 { 421 ns: "Test.LtCSFieldString", 422 expected: "LtCSFieldString必須小於Inner.LtCSFieldString", 423 }, 424 { 425 ns: "Test.LteCSFieldString", 426 expected: "LteCSFieldString必須小於或等於Inner.LteCSFieldString", 427 }, 428 { 429 ns: "Test.GtCSFieldString", 430 expected: "GtCSFieldString必須大於Inner.GtCSFieldString", 431 }, 432 { 433 ns: "Test.GteCSFieldString", 434 expected: "GteCSFieldString必須大於或等於Inner.GteCSFieldString", 435 }, 436 { 437 ns: "Test.NeCSFieldString", 438 expected: "NeCSFieldString不能等於Inner.NeCSFieldString", 439 }, 440 { 441 ns: "Test.EqCSFieldString", 442 expected: "EqCSFieldString必須等於Inner.EqCSFieldString", 443 }, 444 { 445 ns: "Test.EqFieldString", 446 expected: "EqFieldString必須等於MaxString", 447 }, 448 { 449 ns: "Test.GteString", 450 expected: "GteString長度必須至少為3個字元", 451 }, 452 { 453 ns: "Test.GteNumber", 454 expected: "GteNumber必須大於或等於5.56", 455 }, 456 { 457 ns: "Test.GteMultiple", 458 expected: "GteMultiple必須至少包含2項", 459 }, 460 { 461 ns: "Test.GteTime", 462 expected: "GteTime必須大於或等於目前日期和時間", 463 }, 464 { 465 ns: "Test.GtString", 466 expected: "GtString長度必須大於3個字元", 467 }, 468 { 469 ns: "Test.GtNumber", 470 expected: "GtNumber必須大於5.56", 471 }, 472 { 473 ns: "Test.GtMultiple", 474 expected: "GtMultiple必須大於2項", 475 }, 476 { 477 ns: "Test.GtTime", 478 expected: "GtTime必須大於目前日期和時間", 479 }, 480 { 481 ns: "Test.LteString", 482 expected: "LteString長度不能超過3個字元", 483 }, 484 { 485 ns: "Test.LteNumber", 486 expected: "LteNumber必須小於或等於5.56", 487 }, 488 { 489 ns: "Test.LteMultiple", 490 expected: "LteMultiple最多只能包含2項", 491 }, 492 { 493 ns: "Test.LteTime", 494 expected: "LteTime必須小於或等於目前日期和時間", 495 }, 496 { 497 ns: "Test.LtString", 498 expected: "LtString長度必須小於3個字元", 499 }, 500 { 501 ns: "Test.LtNumber", 502 expected: "LtNumber必須小於5.56", 503 }, 504 { 505 ns: "Test.LtMultiple", 506 expected: "LtMultiple必須包含少於2項", 507 }, 508 { 509 ns: "Test.LtTime", 510 expected: "LtTime必須小於目前日期和時間", 511 }, 512 { 513 ns: "Test.NeString", 514 expected: "NeString不能等於", 515 }, 516 { 517 ns: "Test.NeNumber", 518 expected: "NeNumber不能等於0.00", 519 }, 520 { 521 ns: "Test.NeMultiple", 522 expected: "NeMultiple不能等於0", 523 }, 524 { 525 ns: "Test.EqString", 526 expected: "EqString不等於3", 527 }, 528 { 529 ns: "Test.EqNumber", 530 expected: "EqNumber不等於2.33", 531 }, 532 { 533 ns: "Test.EqMultiple", 534 expected: "EqMultiple不等於7", 535 }, 536 { 537 ns: "Test.MaxString", 538 expected: "MaxString長度不能超過3個字元", 539 }, 540 { 541 ns: "Test.MaxNumber", 542 expected: "MaxNumber必須小於或等於1,113.00", 543 }, 544 { 545 ns: "Test.MaxMultiple", 546 expected: "MaxMultiple最多只能包含7項", 547 }, 548 { 549 ns: "Test.MinString", 550 expected: "MinString長度必須至少為1個字元", 551 }, 552 { 553 ns: "Test.MinNumber", 554 expected: "MinNumber最小只能為1,113.00", 555 }, 556 { 557 ns: "Test.MinMultiple", 558 expected: "MinMultiple必須至少包含7項", 559 }, 560 { 561 ns: "Test.LenString", 562 expected: "LenString長度必須為1個字元", 563 }, 564 { 565 ns: "Test.LenNumber", 566 expected: "LenNumber必須等於1,113.00", 567 }, 568 { 569 ns: "Test.LenMultiple", 570 expected: "LenMultiple必須包含7項", 571 }, 572 { 573 ns: "Test.RequiredString", 574 expected: "RequiredString為必填欄位", 575 }, 576 { 577 ns: "Test.RequiredNumber", 578 expected: "RequiredNumber為必填欄位", 579 }, 580 { 581 ns: "Test.RequiredMultiple", 582 expected: "RequiredMultiple為必填欄位", 583 }, 584 { 585 ns: "Test.StrPtrMinLen", 586 expected: "StrPtrMinLen長度必須至少為10個字元", 587 }, 588 { 589 ns: "Test.StrPtrMaxLen", 590 expected: "StrPtrMaxLen長度不能超過1個字元", 591 }, 592 { 593 ns: "Test.StrPtrLen", 594 expected: "StrPtrLen長度必須為2個字元", 595 }, 596 { 597 ns: "Test.StrPtrLt", 598 expected: "StrPtrLt長度必須小於1個字元", 599 }, 600 { 601 ns: "Test.StrPtrLte", 602 expected: "StrPtrLte長度不能超過1個字元", 603 }, 604 { 605 ns: "Test.StrPtrGt", 606 expected: "StrPtrGt長度必須大於10個字元", 607 }, 608 { 609 ns: "Test.StrPtrGte", 610 expected: "StrPtrGte長度必須至少為10個字元", 611 }, 612 { 613 ns: "Test.OneOfString", 614 expected: "OneOfString必須是[red green]中的一個", 615 }, 616 { 617 ns: "Test.OneOfInt", 618 expected: "OneOfInt必須是[5 63]中的一個", 619 }, 620 { 621 ns: "Test.Datetime", 622 expected: "Datetime與2006-01-02格式不匹配", 623 }, 624 } 625 626 for _, tt := range tests { 627 628 var fe validator.FieldError 629 630 for _, e := range errs { 631 if tt.ns == e.Namespace() { 632 fe = e 633 break 634 } 635 } 636 637 NotEqual(t, fe, nil) 638 Equal(t, tt.expected, fe.Translate(trans)) 639 } 640 641} 642