translator_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. package ut
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/go-playground/locales"
  6. "github.com/go-playground/locales/en"
  7. "github.com/go-playground/locales/en_CA"
  8. "github.com/go-playground/locales/nl"
  9. )
  10. // NOTES:
  11. // - Run "go test" to run tests
  12. // - Run "gocov test | gocov report" to report on test converage by file
  13. // - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called
  14. //
  15. // or
  16. //
  17. // -- may be a good idea to change to output path to somewherelike /tmp
  18. // go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html
  19. //
  20. func TestBasicTranslation(t *testing.T) {
  21. e := en.New()
  22. uni := New(e, e)
  23. en, found := uni.GetTranslator("en") // or fallback if fails to find 'en'
  24. if !found {
  25. t.Fatalf("Expected '%t' Got '%t'", true, found)
  26. }
  27. translations := []struct {
  28. key interface{}
  29. trans string
  30. expected error
  31. expectedError bool
  32. override bool
  33. }{
  34. {
  35. key: "test_trans",
  36. trans: "Welcome {0}",
  37. expected: nil,
  38. },
  39. {
  40. key: -1,
  41. trans: "Welcome {0}",
  42. expected: nil,
  43. },
  44. {
  45. key: "test_trans2",
  46. trans: "{0} to the {1}.",
  47. expected: nil,
  48. },
  49. {
  50. key: "test_trans3",
  51. trans: "Welcome {0} to the {1}",
  52. expected: nil,
  53. },
  54. {
  55. key: "test_trans4",
  56. trans: "{0}{1}",
  57. expected: nil,
  58. },
  59. {
  60. key: "test_trans",
  61. trans: "{0}{1}",
  62. expected: &ErrConflictingTranslation{key: "test_trans", text: "{0}{1}"},
  63. expectedError: true,
  64. },
  65. {
  66. key: -1,
  67. trans: "{0}{1}",
  68. expected: &ErrConflictingTranslation{key: -1, text: "{0}{1}"},
  69. expectedError: true,
  70. },
  71. {
  72. key: "test_trans",
  73. trans: "Welcome {0} to the {1}.",
  74. expected: nil,
  75. override: true,
  76. },
  77. }
  78. for _, tt := range translations {
  79. err := en.Add(tt.key, tt.trans, tt.override)
  80. if err != tt.expected {
  81. if !tt.expectedError {
  82. t.Errorf("Expected '%s' Got '%s'", tt.expected, err)
  83. } else {
  84. if err.Error() != tt.expected.Error() {
  85. t.Errorf("Expected '%s' Got '%s'", tt.expected.Error(), err.Error())
  86. }
  87. }
  88. }
  89. }
  90. tests := []struct {
  91. key interface{}
  92. params []string
  93. expected string
  94. expectedError bool
  95. }{
  96. {
  97. key: "test_trans",
  98. params: []string{"Joeybloggs", "The Test"},
  99. expected: "Welcome Joeybloggs to the The Test.",
  100. },
  101. {
  102. key: "test_trans2",
  103. params: []string{"Joeybloggs", "The Test"},
  104. expected: "Joeybloggs to the The Test.",
  105. },
  106. {
  107. key: "test_trans3",
  108. params: []string{"Joeybloggs", "The Test"},
  109. expected: "Welcome Joeybloggs to the The Test",
  110. },
  111. {
  112. key: "test_trans4",
  113. params: []string{"Joeybloggs", "The Test"},
  114. expected: "JoeybloggsThe Test",
  115. },
  116. // bad translation
  117. {
  118. key: "non-existant-key",
  119. params: []string{"Joeybloggs", "The Test"},
  120. expected: "",
  121. expectedError: true,
  122. },
  123. }
  124. for _, tt := range tests {
  125. s, err := en.T(tt.key, tt.params...)
  126. if s != tt.expected {
  127. if !tt.expectedError && err != ErrUnknowTranslation {
  128. t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
  129. }
  130. }
  131. }
  132. }
  133. func TestCardinalTranslation(t *testing.T) {
  134. e := en.New()
  135. uni := New(e, e)
  136. en, found := uni.GetTranslator("en")
  137. if !found {
  138. t.Fatalf("Expected '%t' Got '%t'", true, found)
  139. }
  140. translations := []struct {
  141. key interface{}
  142. trans string
  143. rule locales.PluralRule
  144. expected error
  145. expectedError bool
  146. override bool
  147. }{
  148. // bad translation
  149. {
  150. key: "cardinal_test",
  151. trans: "You have a day left.",
  152. rule: locales.PluralRuleOne,
  153. expected: &ErrCardinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddCardinal'", paramZero)},
  154. expectedError: true,
  155. },
  156. {
  157. key: "cardinal_test",
  158. trans: "You have {0} day",
  159. rule: locales.PluralRuleOne,
  160. expected: nil,
  161. },
  162. {
  163. key: "cardinal_test",
  164. trans: "You have {0} days left.",
  165. rule: locales.PluralRuleOther,
  166. expected: nil,
  167. },
  168. {
  169. key: "cardinal_test",
  170. trans: "You have {0} days left.",
  171. rule: locales.PluralRuleOther,
  172. expected: &ErrConflictingTranslation{key: "cardinal_test", rule: locales.PluralRuleOther, text: "You have {0} days left."},
  173. expectedError: true,
  174. },
  175. {
  176. key: "cardinal_test",
  177. trans: "You have {0} day left.",
  178. rule: locales.PluralRuleOne,
  179. expected: nil,
  180. override: true,
  181. },
  182. }
  183. for _, tt := range translations {
  184. err := en.AddCardinal(tt.key, tt.trans, tt.rule, tt.override)
  185. if err != tt.expected {
  186. if !tt.expectedError || err.Error() != tt.expected.Error() {
  187. t.Errorf("Expected '<nil>' Got '%s'", err)
  188. }
  189. }
  190. }
  191. tests := []struct {
  192. key interface{}
  193. num float64
  194. digits uint64
  195. param string
  196. expected string
  197. expectedError bool
  198. }{
  199. {
  200. key: "cardinal_test",
  201. num: 1,
  202. digits: 0,
  203. param: string(en.FmtNumber(1, 0)),
  204. expected: "You have 1 day left.",
  205. },
  206. // bad translation key
  207. {
  208. key: "non-existant",
  209. num: 1,
  210. digits: 0,
  211. param: string(en.FmtNumber(1, 0)),
  212. expected: "",
  213. expectedError: true,
  214. },
  215. }
  216. for _, tt := range tests {
  217. s, err := en.C(tt.key, tt.num, tt.digits, tt.param)
  218. if err != nil {
  219. if !tt.expectedError && err != ErrUnknowTranslation {
  220. t.Errorf("Expected '<nil>' Got '%s'", err)
  221. }
  222. }
  223. if s != tt.expected {
  224. t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
  225. }
  226. }
  227. }
  228. func TestOrdinalTranslation(t *testing.T) {
  229. e := en.New()
  230. uni := New(e, e)
  231. en, found := uni.GetTranslator("en")
  232. if !found {
  233. t.Fatalf("Expected '%t' Got '%t'", true, found)
  234. }
  235. translations := []struct {
  236. key interface{}
  237. trans string
  238. rule locales.PluralRule
  239. expected error
  240. expectedError bool
  241. override bool
  242. }{
  243. // bad translation
  244. {
  245. key: "day",
  246. trans: "st",
  247. rule: locales.PluralRuleOne,
  248. expected: &ErrOrdinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddOrdinal'", paramZero)},
  249. expectedError: true,
  250. },
  251. {
  252. key: "day",
  253. trans: "{0}sfefewt",
  254. rule: locales.PluralRuleOne,
  255. expected: nil,
  256. },
  257. {
  258. key: "day",
  259. trans: "{0}nd",
  260. rule: locales.PluralRuleTwo,
  261. expected: nil,
  262. },
  263. {
  264. key: "day",
  265. trans: "{0}rd",
  266. rule: locales.PluralRuleFew,
  267. expected: nil,
  268. },
  269. {
  270. key: "day",
  271. trans: "{0}th",
  272. rule: locales.PluralRuleOther,
  273. expected: nil,
  274. },
  275. // bad translation
  276. {
  277. key: "day",
  278. trans: "{0}th",
  279. rule: locales.PluralRuleOther,
  280. expected: &ErrConflictingTranslation{key: "day", rule: locales.PluralRuleOther, text: "{0}th"},
  281. expectedError: true,
  282. },
  283. {
  284. key: "day",
  285. trans: "{0}st",
  286. rule: locales.PluralRuleOne,
  287. expected: nil,
  288. override: true,
  289. },
  290. }
  291. for _, tt := range translations {
  292. err := en.AddOrdinal(tt.key, tt.trans, tt.rule, tt.override)
  293. if err != tt.expected {
  294. if !tt.expectedError || err.Error() != tt.expected.Error() {
  295. t.Errorf("Expected '<nil>' Got '%s'", err)
  296. }
  297. }
  298. }
  299. tests := []struct {
  300. key interface{}
  301. num float64
  302. digits uint64
  303. param string
  304. expected string
  305. expectedError bool
  306. }{
  307. {
  308. key: "day",
  309. num: 1,
  310. digits: 0,
  311. param: string(en.FmtNumber(1, 0)),
  312. expected: "1st",
  313. },
  314. {
  315. key: "day",
  316. num: 2,
  317. digits: 0,
  318. param: string(en.FmtNumber(2, 0)),
  319. expected: "2nd",
  320. },
  321. {
  322. key: "day",
  323. num: 3,
  324. digits: 0,
  325. param: string(en.FmtNumber(3, 0)),
  326. expected: "3rd",
  327. },
  328. {
  329. key: "day",
  330. num: 4,
  331. digits: 0,
  332. param: string(en.FmtNumber(4, 0)),
  333. expected: "4th",
  334. },
  335. {
  336. key: "day",
  337. num: 10258.43,
  338. digits: 0,
  339. param: string(en.FmtNumber(10258.43, 0)),
  340. expected: "10,258th",
  341. },
  342. // bad translation
  343. {
  344. key: "d-day",
  345. num: 10258.43,
  346. digits: 0,
  347. param: string(en.FmtNumber(10258.43, 0)),
  348. expected: "",
  349. expectedError: true,
  350. },
  351. }
  352. for _, tt := range tests {
  353. s, err := en.O(tt.key, tt.num, tt.digits, tt.param)
  354. if err != nil {
  355. if !tt.expectedError && err != ErrUnknowTranslation {
  356. t.Errorf("Expected '<nil>' Got '%s'", err)
  357. }
  358. }
  359. if s != tt.expected {
  360. t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
  361. }
  362. }
  363. }
  364. func TestRangeTranslation(t *testing.T) {
  365. n := nl.New()
  366. uni := New(n, n)
  367. // dutch
  368. nl, found := uni.GetTranslator("nl")
  369. if !found {
  370. t.Fatalf("Expected '%t' Got '%t'", true, found)
  371. }
  372. translations := []struct {
  373. key interface{}
  374. trans string
  375. rule locales.PluralRule
  376. expected error
  377. expectedError bool
  378. override bool
  379. }{
  380. // bad translation
  381. {
  382. key: "day",
  383. trans: "er -{1} dag vertrokken",
  384. rule: locales.PluralRuleOne,
  385. expected: &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, are you sure you're adding a Range Translation?", paramZero)},
  386. expectedError: true,
  387. },
  388. // bad translation
  389. {
  390. key: "day",
  391. trans: "er {0}- dag vertrokken",
  392. rule: locales.PluralRuleOne,
  393. expected: &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, a Range Translation requires two parameters", paramOne)},
  394. expectedError: true,
  395. },
  396. {
  397. key: "day",
  398. trans: "er {0}-{1} dag",
  399. rule: locales.PluralRuleOne,
  400. expected: nil,
  401. },
  402. {
  403. key: "day",
  404. trans: "er zijn {0}-{1} dagen over",
  405. rule: locales.PluralRuleOther,
  406. expected: nil,
  407. },
  408. // bad translation
  409. {
  410. key: "day",
  411. trans: "er zijn {0}-{1} dagen over",
  412. rule: locales.PluralRuleOther,
  413. expected: &ErrConflictingTranslation{key: "day", rule: locales.PluralRuleOther, text: "er zijn {0}-{1} dagen over"},
  414. expectedError: true,
  415. },
  416. {
  417. key: "day",
  418. trans: "er {0}-{1} dag vertrokken",
  419. rule: locales.PluralRuleOne,
  420. expected: nil,
  421. override: true,
  422. },
  423. }
  424. for _, tt := range translations {
  425. err := nl.AddRange(tt.key, tt.trans, tt.rule, tt.override)
  426. if err != tt.expected {
  427. if !tt.expectedError || err.Error() != tt.expected.Error() {
  428. t.Errorf("Expected '%#v' Got '%s'", tt.expected, err)
  429. }
  430. }
  431. }
  432. tests := []struct {
  433. key interface{}
  434. num1 float64
  435. digits1 uint64
  436. num2 float64
  437. digits2 uint64
  438. param1 string
  439. param2 string
  440. expected string
  441. expectedError bool
  442. }{
  443. {
  444. key: "day",
  445. num1: 1,
  446. digits1: 0,
  447. num2: 2,
  448. digits2: 0,
  449. param1: string(nl.FmtNumber(1, 0)),
  450. param2: string(nl.FmtNumber(2, 0)),
  451. expected: "er zijn 1-2 dagen over",
  452. },
  453. {
  454. key: "day",
  455. num1: 0,
  456. digits1: 0,
  457. num2: 1,
  458. digits2: 0,
  459. param1: string(nl.FmtNumber(0, 0)),
  460. param2: string(nl.FmtNumber(1, 0)),
  461. expected: "er 0-1 dag vertrokken",
  462. },
  463. {
  464. key: "day",
  465. num1: 0,
  466. digits1: 0,
  467. num2: 2,
  468. digits2: 0,
  469. param1: string(nl.FmtNumber(0, 0)),
  470. param2: string(nl.FmtNumber(2, 0)),
  471. expected: "er zijn 0-2 dagen over",
  472. },
  473. // bad translations from here
  474. {
  475. key: "d-day",
  476. num1: 0,
  477. digits1: 0,
  478. num2: 2,
  479. digits2: 0,
  480. param1: string(nl.FmtNumber(0, 0)),
  481. param2: string(nl.FmtNumber(2, 0)),
  482. expected: "",
  483. expectedError: true,
  484. },
  485. }
  486. for _, tt := range tests {
  487. s, err := nl.R(tt.key, tt.num1, tt.digits1, tt.num2, tt.digits2, tt.param1, tt.param2)
  488. if err != nil {
  489. if !tt.expectedError && err != ErrUnknowTranslation {
  490. t.Errorf("Expected '<nil>' Got '%s'", err)
  491. }
  492. }
  493. if s != tt.expected {
  494. t.Errorf("Expected '%s' Got '%s'", tt.expected, s)
  495. }
  496. }
  497. }
  498. func TestFallbackTranslator(t *testing.T) {
  499. e := en.New()
  500. uni := New(e, e)
  501. en, found := uni.GetTranslator("en")
  502. if !found {
  503. t.Fatalf("Expected '%t' Got '%t'", true, found)
  504. }
  505. if en.Locale() != "en" {
  506. t.Errorf("Expected '%s' Got '%s'", "en", en.Locale())
  507. }
  508. fallback, _ := uni.GetTranslator("nl")
  509. if fallback.Locale() != "en" {
  510. t.Errorf("Expected '%s' Got '%s'", "en", fallback.Locale())
  511. }
  512. en, _ = uni.FindTranslator("nl", "en")
  513. if en.Locale() != "en" {
  514. t.Errorf("Expected '%s' Got '%s'", "en", en.Locale())
  515. }
  516. fallback, _ = uni.FindTranslator("nl")
  517. if fallback.Locale() != "en" {
  518. t.Errorf("Expected '%s' Got '%s'", "en", fallback.Locale())
  519. }
  520. }
  521. func TestAddTranslator(t *testing.T) {
  522. e := en.New()
  523. n := nl.New()
  524. uni := New(e, n)
  525. tests := []struct {
  526. trans locales.Translator
  527. expected error
  528. expectedError bool
  529. override bool
  530. }{
  531. {
  532. trans: en_CA.New(),
  533. expected: nil,
  534. override: false,
  535. },
  536. {
  537. trans: n,
  538. expected: &ErrExistingTranslator{locale: n.Locale()},
  539. expectedError: true,
  540. override: false,
  541. },
  542. {
  543. trans: e,
  544. expected: &ErrExistingTranslator{locale: e.Locale()},
  545. expectedError: true,
  546. override: false,
  547. },
  548. {
  549. trans: e,
  550. expected: nil,
  551. override: true,
  552. },
  553. }
  554. for _, tt := range tests {
  555. err := uni.AddTranslator(tt.trans, tt.override)
  556. if err != tt.expected {
  557. if !tt.expectedError || err.Error() != tt.expected.Error() {
  558. t.Errorf("Expected '%s' Got '%s'", tt.expected, err)
  559. }
  560. }
  561. }
  562. }
  563. func TestVerifyTranslations(t *testing.T) {
  564. n := nl.New()
  565. // dutch
  566. uni := New(n, n)
  567. loc, _ := uni.GetTranslator("nl")
  568. if loc.Locale() != "nl" {
  569. t.Errorf("Expected '%s' Got '%s'", "nl", loc.Locale())
  570. }
  571. // cardinal checks
  572. err := loc.AddCardinal("day", "je {0} dag hebben verlaten", locales.PluralRuleOne, false)
  573. if err != nil {
  574. t.Fatalf("Expected '<nil>' Got '%s'", err)
  575. }
  576. // fail cardinal rules
  577. expected := &ErrMissingPluralTranslation{translationType: "plural", rule: locales.PluralRuleOther, key: "day"}
  578. err = loc.VerifyTranslations()
  579. if err == nil || err.Error() != expected.Error() {
  580. t.Errorf("Expected '%s' Got '%s'", expected, err)
  581. }
  582. // success cardinal
  583. err = loc.AddCardinal("day", "je {0} dagen hebben verlaten", locales.PluralRuleOther, false)
  584. if err != nil {
  585. t.Fatalf("Expected '<nil>' Got '%s'", err)
  586. }
  587. err = loc.VerifyTranslations()
  588. if err != nil {
  589. t.Fatalf("Expected '<nil>' Got '%s'", err)
  590. }
  591. // range checks
  592. err = loc.AddRange("day", "je {0}-{1} dagen hebben verlaten", locales.PluralRuleOther, false)
  593. if err != nil {
  594. t.Fatalf("Expected '<nil>' Got '%s'", err)
  595. }
  596. // fail range rules
  597. expected = &ErrMissingPluralTranslation{translationType: "range", rule: locales.PluralRuleOne, key: "day"}
  598. err = loc.VerifyTranslations()
  599. if err == nil || err.Error() != expected.Error() {
  600. t.Errorf("Expected '%s' Got '%s'", expected, err)
  601. }
  602. // success range
  603. err = loc.AddRange("day", "je {0}-{1} dag hebben verlaten", locales.PluralRuleOne, false)
  604. if err != nil {
  605. t.Fatalf("Expected '<nil>' Got '%s'", err)
  606. }
  607. err = loc.VerifyTranslations()
  608. if err != nil {
  609. t.Fatalf("Expected '<nil>' Got '%s'", err)
  610. }
  611. // ok so 'nl' aka dutch, ony has one plural rule for ordinals, so going to switch to english from here which has 4
  612. err = uni.AddTranslator(en.New(), false)
  613. if err != nil {
  614. t.Fatalf("Expected '<nil>' Got '%s'", err)
  615. }
  616. loc, _ = uni.GetTranslator("en")
  617. if loc.Locale() != "en" {
  618. t.Errorf("Expected '%s' Got '%s'", "en", loc.Locale())
  619. }
  620. // ordinal checks
  621. err = loc.AddOrdinal("day", "{0}st", locales.PluralRuleOne, false)
  622. if err != nil {
  623. t.Fatalf("Expected '<nil>' Got '%s'", err)
  624. }
  625. err = loc.AddOrdinal("day", "{0}rd", locales.PluralRuleFew, false)
  626. if err != nil {
  627. t.Fatalf("Expected '<nil>' Got '%s'", err)
  628. }
  629. err = loc.AddOrdinal("day", "{0}th", locales.PluralRuleOther, false)
  630. if err != nil {
  631. t.Fatalf("Expected '<nil>' Got '%s'", err)
  632. }
  633. // fail ordinal rules
  634. expected = &ErrMissingPluralTranslation{translationType: "ordinal", rule: locales.PluralRuleTwo, key: "day"}
  635. err = loc.VerifyTranslations()
  636. if err == nil || err.Error() != expected.Error() {
  637. t.Errorf("Expected '%s' Got '%s'", expected, err)
  638. }
  639. // success ordinal
  640. err = loc.AddOrdinal("day", "{0}nd", locales.PluralRuleTwo, false)
  641. if err != nil {
  642. t.Fatalf("Expected '<nil>' Got '%s'", err)
  643. }
  644. err = loc.VerifyTranslations()
  645. if err != nil {
  646. t.Fatalf("Expected '<nil>' Got '%s'", err)
  647. }
  648. }
  649. func TestVerifyTranslationsWithNonStringKeys(t *testing.T) {
  650. n := nl.New()
  651. // dutch
  652. uni := New(n, n)
  653. loc, _ := uni.GetTranslator("nl")
  654. if loc.Locale() != "nl" {
  655. t.Errorf("Expected '%s' Got '%s'", "nl", loc.Locale())
  656. }
  657. // cardinal checks
  658. err := loc.AddCardinal(-1, "je {0} dag hebben verlaten", locales.PluralRuleOne, false)
  659. if err != nil {
  660. t.Fatalf("Expected '<nil>' Got '%s'", err)
  661. }
  662. // fail cardinal rules
  663. expected := &ErrMissingPluralTranslation{translationType: "plural", rule: locales.PluralRuleOther, key: -1}
  664. err = loc.VerifyTranslations()
  665. if err == nil || err.Error() != expected.Error() {
  666. t.Errorf("Expected '%s' Got '%s'", expected, err)
  667. }
  668. }
  669. func TestGetFallback(t *testing.T) {
  670. // dutch
  671. n := nl.New()
  672. e := en.New()
  673. uni := New(e, n)
  674. trans := uni.GetFallback()
  675. expected := "en"
  676. if trans.Locale() != expected {
  677. t.Errorf("Expected '%s' Got '%s'", expected, trans.Locale())
  678. }
  679. }