ja.go 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423
  1. package ja
  2. import (
  3. "fmt"
  4. "log"
  5. "reflect"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "github.com/go-playground/locales"
  10. ut "github.com/go-playground/universal-translator"
  11. "gopkg.in/go-playground/validator.v9"
  12. )
  13. // RegisterDefaultTranslations registers a set of default translations
  14. // for all built in tag's in validator; you may add your own as desired.
  15. func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {
  16. translations := []struct {
  17. tag string
  18. translation string
  19. override bool
  20. customRegisFunc validator.RegisterTranslationsFunc
  21. customTransFunc validator.TranslationFunc
  22. }{
  23. {
  24. tag: "required",
  25. translation: "{0}は必須フィールドです",
  26. override: false,
  27. },
  28. {
  29. tag: "len",
  30. customRegisFunc: func(ut ut.Translator) (err error) {
  31. if err = ut.Add("len-string", "{0}の長さは{1}でなければなりません", false); err != nil {
  32. return
  33. }
  34. // if err = ut.AddCardinal("len-string-character", "{0}文字", locales.PluralRuleOne, false); err != nil {
  35. // return
  36. // }
  37. if err = ut.AddCardinal("len-string-character", "{0}文字", locales.PluralRuleOther, false); err != nil {
  38. return
  39. }
  40. if err = ut.Add("len-number", "{0}は{1}と等しくなければなりません", false); err != nil {
  41. return
  42. }
  43. if err = ut.Add("len-items", "{0}は{1}を含まなければなりません", false); err != nil {
  44. return
  45. }
  46. // if err = ut.AddCardinal("len-items-item", "{0}つの項目", locales.PluralRuleOne, false); err != nil {
  47. // return
  48. // }
  49. if err = ut.AddCardinal("len-items-item", "{0}つの項目", locales.PluralRuleOther, false); err != nil {
  50. return
  51. }
  52. return
  53. },
  54. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  55. var err error
  56. var t string
  57. var digits uint64
  58. var kind reflect.Kind
  59. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  60. digits = uint64(len(fe.Param()[idx+1:]))
  61. }
  62. f64, err := strconv.ParseFloat(fe.Param(), 64)
  63. if err != nil {
  64. goto END
  65. }
  66. kind = fe.Kind()
  67. if kind == reflect.Ptr {
  68. kind = fe.Type().Elem().Kind()
  69. }
  70. switch kind {
  71. case reflect.String:
  72. var c string
  73. c, err = ut.C("len-string-character", f64, digits, ut.FmtNumber(f64, digits))
  74. if err != nil {
  75. goto END
  76. }
  77. t, err = ut.T("len-string", fe.Field(), c)
  78. case reflect.Slice, reflect.Map, reflect.Array:
  79. var c string
  80. c, err = ut.C("len-items-item", f64, digits, ut.FmtNumber(f64, digits))
  81. if err != nil {
  82. goto END
  83. }
  84. t, err = ut.T("len-items", fe.Field(), c)
  85. default:
  86. t, err = ut.T("len-number", fe.Field(), ut.FmtNumber(f64, digits))
  87. }
  88. END:
  89. if err != nil {
  90. fmt.Printf("warning: error translating FieldError: %s", err)
  91. return fe.(error).Error()
  92. }
  93. return t
  94. },
  95. },
  96. {
  97. tag: "min",
  98. customRegisFunc: func(ut ut.Translator) (err error) {
  99. if err = ut.Add("min-string", "{0}の長さは少なくとも{1}はなければなりません", false); err != nil {
  100. return
  101. }
  102. // if err = ut.AddCardinal("min-string-character", "{0}文字", locales.PluralRuleOne, false); err != nil {
  103. // return
  104. // }
  105. if err = ut.AddCardinal("min-string-character", "{0}文字", locales.PluralRuleOther, false); err != nil {
  106. return
  107. }
  108. if err = ut.Add("min-number", "{0}は{1}かより大きくなければなりません", false); err != nil {
  109. return
  110. }
  111. if err = ut.Add("min-items", "{0}は少なくとも{1}を含まなければなりません", false); err != nil {
  112. return
  113. }
  114. // if err = ut.AddCardinal("min-items-item", "{0}つの項目", locales.PluralRuleOne, false); err != nil {
  115. // return
  116. // }
  117. if err = ut.AddCardinal("min-items-item", "{0}つの項目", locales.PluralRuleOther, false); err != nil {
  118. return
  119. }
  120. return
  121. },
  122. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  123. var err error
  124. var t string
  125. var digits uint64
  126. var kind reflect.Kind
  127. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  128. digits = uint64(len(fe.Param()[idx+1:]))
  129. }
  130. f64, err := strconv.ParseFloat(fe.Param(), 64)
  131. if err != nil {
  132. goto END
  133. }
  134. kind = fe.Kind()
  135. if kind == reflect.Ptr {
  136. kind = fe.Type().Elem().Kind()
  137. }
  138. switch kind {
  139. case reflect.String:
  140. var c string
  141. c, err = ut.C("min-string-character", f64, digits, ut.FmtNumber(f64, digits))
  142. if err != nil {
  143. goto END
  144. }
  145. t, err = ut.T("min-string", fe.Field(), c)
  146. case reflect.Slice, reflect.Map, reflect.Array:
  147. var c string
  148. c, err = ut.C("min-items-item", f64, digits, ut.FmtNumber(f64, digits))
  149. if err != nil {
  150. goto END
  151. }
  152. t, err = ut.T("min-items", fe.Field(), c)
  153. default:
  154. t, err = ut.T("min-number", fe.Field(), ut.FmtNumber(f64, digits))
  155. }
  156. END:
  157. if err != nil {
  158. fmt.Printf("warning: error translating FieldError: %s", err)
  159. return fe.(error).Error()
  160. }
  161. return t
  162. },
  163. },
  164. {
  165. tag: "max",
  166. customRegisFunc: func(ut ut.Translator) (err error) {
  167. if err = ut.Add("max-string", "{0}の長さは最大でも{1}でなければなりません", false); err != nil {
  168. return
  169. }
  170. // if err = ut.AddCardinal("max-string-character", "{0}文字", locales.PluralRuleOne, false); err != nil {
  171. // return
  172. // }
  173. if err = ut.AddCardinal("max-string-character", "{0}文字", locales.PluralRuleOther, false); err != nil {
  174. return
  175. }
  176. if err = ut.Add("max-number", "{0}は{1}かより小さくなければなりません", false); err != nil {
  177. return
  178. }
  179. if err = ut.Add("max-items", "{0}は最大でも{1}を含まなければなりません", false); err != nil {
  180. return
  181. }
  182. // if err = ut.AddCardinal("max-items-item", "{0}つの項目", locales.PluralRuleOne, false); err != nil {
  183. // return
  184. // }
  185. if err = ut.AddCardinal("max-items-item", "{0}つの項目", locales.PluralRuleOther, false); err != nil {
  186. return
  187. }
  188. return
  189. },
  190. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  191. var err error
  192. var t string
  193. var digits uint64
  194. var kind reflect.Kind
  195. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  196. digits = uint64(len(fe.Param()[idx+1:]))
  197. }
  198. f64, err := strconv.ParseFloat(fe.Param(), 64)
  199. if err != nil {
  200. goto END
  201. }
  202. kind = fe.Kind()
  203. if kind == reflect.Ptr {
  204. kind = fe.Type().Elem().Kind()
  205. }
  206. switch kind {
  207. case reflect.String:
  208. var c string
  209. c, err = ut.C("max-string-character", f64, digits, ut.FmtNumber(f64, digits))
  210. if err != nil {
  211. goto END
  212. }
  213. t, err = ut.T("max-string", fe.Field(), c)
  214. case reflect.Slice, reflect.Map, reflect.Array:
  215. var c string
  216. c, err = ut.C("max-items-item", f64, digits, ut.FmtNumber(f64, digits))
  217. if err != nil {
  218. goto END
  219. }
  220. t, err = ut.T("max-items", fe.Field(), c)
  221. default:
  222. t, err = ut.T("max-number", fe.Field(), ut.FmtNumber(f64, digits))
  223. }
  224. END:
  225. if err != nil {
  226. fmt.Printf("warning: error translating FieldError: %s", err)
  227. return fe.(error).Error()
  228. }
  229. return t
  230. },
  231. },
  232. {
  233. tag: "eq",
  234. translation: "{0}は{1}と等しくありません",
  235. override: false,
  236. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  237. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  238. if err != nil {
  239. fmt.Printf("warning: error translating FieldError: %#v", fe)
  240. return fe.(error).Error()
  241. }
  242. return t
  243. },
  244. },
  245. {
  246. tag: "ne",
  247. customRegisFunc: func(ut ut.Translator) (err error) {
  248. if err = ut.Add("ne-items", "{0}の項目の数は{1}と異ならなければなりません", false); err != nil {
  249. fmt.Printf("ne customRegisFunc #1 error because of %v\n", err)
  250. return
  251. }
  252. // if err = ut.AddCardinal("ne-items-item", "{0}個", locales.PluralRuleOne, false); err != nil {
  253. // return
  254. // }
  255. if err = ut.AddCardinal("ne-items-item", "{0}個", locales.PluralRuleOther, false); err != nil {
  256. return
  257. }
  258. if err = ut.Add("ne", "{0}は{1}と異ならなければなりません", false); err != nil {
  259. fmt.Printf("ne customRegisFunc #2 error because of %v\n", err)
  260. return
  261. }
  262. return
  263. },
  264. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  265. var err error
  266. var t string
  267. var f64 float64
  268. var digits uint64
  269. var kind reflect.Kind
  270. fn := func() (err error) {
  271. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  272. digits = uint64(len(fe.Param()[idx+1:]))
  273. }
  274. f64, err = strconv.ParseFloat(fe.Param(), 64)
  275. return
  276. }
  277. kind = fe.Kind()
  278. if kind == reflect.Ptr {
  279. kind = fe.Type().Elem().Kind()
  280. }
  281. switch kind {
  282. case reflect.Slice:
  283. var c string
  284. err = fn()
  285. if err != nil {
  286. goto END
  287. }
  288. c, err = ut.C("ne-items-item", f64, digits, ut.FmtNumber(f64, digits))
  289. if err != nil {
  290. goto END
  291. }
  292. t, err = ut.T("ne-items", fe.Field(), c)
  293. break
  294. default:
  295. t, err = ut.T("ne", fe.Field(), fe.Param())
  296. }
  297. END:
  298. if err != nil {
  299. fmt.Printf("warning: error translating FieldError: %s", err)
  300. return fe.(error).Error()
  301. }
  302. return t
  303. },
  304. },
  305. {
  306. tag: "lt",
  307. customRegisFunc: func(ut ut.Translator) (err error) {
  308. if err = ut.Add("lt-string", "{0}の長さは{1}よりも少なくなければなりません", false); err != nil {
  309. return
  310. }
  311. // if err = ut.AddCardinal("lt-string-character", "{0}文字", locales.PluralRuleOne, false); err != nil {
  312. // return
  313. // }
  314. if err = ut.AddCardinal("lt-string-character", "{0}文字", locales.PluralRuleOther, false); err != nil {
  315. return
  316. }
  317. if err = ut.Add("lt-number", "{0}は{1}よりも小さくなければなりません", false); err != nil {
  318. return
  319. }
  320. if err = ut.Add("lt-items", "{0}は{1}よりも少ない項目を含まなければなりません", false); err != nil {
  321. return
  322. }
  323. // if err = ut.AddCardinal("lt-items-item", "{0}つの項目", locales.PluralRuleOne, false); err != nil {
  324. // return
  325. // }
  326. if err = ut.AddCardinal("lt-items-item", "{0}つの項目", locales.PluralRuleOther, false); err != nil {
  327. return
  328. }
  329. if err = ut.Add("lt-datetime", "{0}は現時刻よりも前でなければなりません", false); err != nil {
  330. return
  331. }
  332. return
  333. },
  334. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  335. var err error
  336. var t string
  337. var f64 float64
  338. var digits uint64
  339. var kind reflect.Kind
  340. fn := func() (err error) {
  341. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  342. digits = uint64(len(fe.Param()[idx+1:]))
  343. }
  344. f64, err = strconv.ParseFloat(fe.Param(), 64)
  345. return
  346. }
  347. kind = fe.Kind()
  348. if kind == reflect.Ptr {
  349. kind = fe.Type().Elem().Kind()
  350. }
  351. switch kind {
  352. case reflect.String:
  353. var c string
  354. err = fn()
  355. if err != nil {
  356. goto END
  357. }
  358. c, err = ut.C("lt-string-character", f64, digits, ut.FmtNumber(f64, digits))
  359. if err != nil {
  360. goto END
  361. }
  362. t, err = ut.T("lt-string", fe.Field(), c)
  363. case reflect.Slice, reflect.Map, reflect.Array:
  364. var c string
  365. err = fn()
  366. if err != nil {
  367. goto END
  368. }
  369. c, err = ut.C("lt-items-item", f64, digits, ut.FmtNumber(f64, digits))
  370. if err != nil {
  371. goto END
  372. }
  373. t, err = ut.T("lt-items", fe.Field(), c)
  374. case reflect.Struct:
  375. if fe.Type() != reflect.TypeOf(time.Time{}) {
  376. err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
  377. goto END
  378. }
  379. t, err = ut.T("lt-datetime", fe.Field())
  380. default:
  381. err = fn()
  382. if err != nil {
  383. goto END
  384. }
  385. t, err = ut.T("lt-number", fe.Field(), ut.FmtNumber(f64, digits))
  386. }
  387. END:
  388. if err != nil {
  389. fmt.Printf("warning: error translating FieldError: %s", err)
  390. return fe.(error).Error()
  391. }
  392. return t
  393. },
  394. },
  395. {
  396. tag: "lte",
  397. customRegisFunc: func(ut ut.Translator) (err error) {
  398. if err = ut.Add("lte-string", "{0}の長さは最大でも{1}でなければなりません", false); err != nil {
  399. return
  400. }
  401. // if err = ut.AddCardinal("lte-string-character", "{0}文字", locales.PluralRuleOne, false); err != nil {
  402. // return
  403. // }
  404. if err = ut.AddCardinal("lte-string-character", "{0}文字", locales.PluralRuleOther, false); err != nil {
  405. return
  406. }
  407. if err = ut.Add("lte-number", "{0}は{1}かより小さくなければなりません", false); err != nil {
  408. return
  409. }
  410. if err = ut.Add("lte-items", "{0}は最大でも{1}を含まなければなりません", false); err != nil {
  411. return
  412. }
  413. // if err = ut.AddCardinal("lte-items-item", "{0}つの項目", locales.PluralRuleOne, false); err != nil {
  414. // return
  415. // }
  416. if err = ut.AddCardinal("lte-items-item", "{0}つの項目", locales.PluralRuleOther, false); err != nil {
  417. return
  418. }
  419. if err = ut.Add("lte-datetime", "{0}は現時刻以前でなければなりません", false); err != nil {
  420. return
  421. }
  422. return
  423. },
  424. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  425. var err error
  426. var t string
  427. var f64 float64
  428. var digits uint64
  429. var kind reflect.Kind
  430. fn := func() (err error) {
  431. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  432. digits = uint64(len(fe.Param()[idx+1:]))
  433. }
  434. f64, err = strconv.ParseFloat(fe.Param(), 64)
  435. return
  436. }
  437. kind = fe.Kind()
  438. if kind == reflect.Ptr {
  439. kind = fe.Type().Elem().Kind()
  440. }
  441. switch kind {
  442. case reflect.String:
  443. var c string
  444. err = fn()
  445. if err != nil {
  446. goto END
  447. }
  448. c, err = ut.C("lte-string-character", f64, digits, ut.FmtNumber(f64, digits))
  449. if err != nil {
  450. goto END
  451. }
  452. t, err = ut.T("lte-string", fe.Field(), c)
  453. case reflect.Slice, reflect.Map, reflect.Array:
  454. var c string
  455. err = fn()
  456. if err != nil {
  457. goto END
  458. }
  459. c, err = ut.C("lte-items-item", f64, digits, ut.FmtNumber(f64, digits))
  460. if err != nil {
  461. goto END
  462. }
  463. t, err = ut.T("lte-items", fe.Field(), c)
  464. case reflect.Struct:
  465. if fe.Type() != reflect.TypeOf(time.Time{}) {
  466. err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
  467. goto END
  468. }
  469. t, err = ut.T("lte-datetime", fe.Field())
  470. default:
  471. err = fn()
  472. if err != nil {
  473. goto END
  474. }
  475. t, err = ut.T("lte-number", fe.Field(), ut.FmtNumber(f64, digits))
  476. }
  477. END:
  478. if err != nil {
  479. fmt.Printf("warning: error translating FieldError: %s", err)
  480. return fe.(error).Error()
  481. }
  482. return t
  483. },
  484. },
  485. {
  486. tag: "gt",
  487. customRegisFunc: func(ut ut.Translator) (err error) {
  488. if err = ut.Add("gt-string", "{0}の長さは{1}よりも多くなければなりません", false); err != nil {
  489. return
  490. }
  491. // if err = ut.AddCardinal("gt-string-character", "{0}文字", locales.PluralRuleOne, false); err != nil {
  492. // return
  493. // }
  494. if err = ut.AddCardinal("gt-string-character", "{0}文字", locales.PluralRuleOther, false); err != nil {
  495. return
  496. }
  497. if err = ut.Add("gt-number", "{0}は{1}よりも大きくなければなりません", false); err != nil {
  498. return
  499. }
  500. if err = ut.Add("gt-items", "{0}は{1}よりも多い項目を含まなければなりません", false); err != nil {
  501. return
  502. }
  503. // if err = ut.AddCardinal("gt-items-item", "{0}つの項目", locales.PluralRuleOne, false); err != nil {
  504. // return
  505. // }
  506. if err = ut.AddCardinal("gt-items-item", "{0}つの項目", locales.PluralRuleOther, false); err != nil {
  507. return
  508. }
  509. if err = ut.Add("gt-datetime", "{0}は現時刻よりも後でなければなりません", false); err != nil {
  510. return
  511. }
  512. return
  513. },
  514. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  515. var err error
  516. var t string
  517. var f64 float64
  518. var digits uint64
  519. var kind reflect.Kind
  520. fn := func() (err error) {
  521. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  522. digits = uint64(len(fe.Param()[idx+1:]))
  523. }
  524. f64, err = strconv.ParseFloat(fe.Param(), 64)
  525. return
  526. }
  527. kind = fe.Kind()
  528. if kind == reflect.Ptr {
  529. kind = fe.Type().Elem().Kind()
  530. }
  531. switch kind {
  532. case reflect.String:
  533. var c string
  534. err = fn()
  535. if err != nil {
  536. goto END
  537. }
  538. c, err = ut.C("gt-string-character", f64, digits, ut.FmtNumber(f64, digits))
  539. if err != nil {
  540. goto END
  541. }
  542. t, err = ut.T("gt-string", fe.Field(), c)
  543. case reflect.Slice, reflect.Map, reflect.Array:
  544. var c string
  545. err = fn()
  546. if err != nil {
  547. goto END
  548. }
  549. c, err = ut.C("gt-items-item", f64, digits, ut.FmtNumber(f64, digits))
  550. if err != nil {
  551. goto END
  552. }
  553. t, err = ut.T("gt-items", fe.Field(), c)
  554. case reflect.Struct:
  555. if fe.Type() != reflect.TypeOf(time.Time{}) {
  556. err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
  557. goto END
  558. }
  559. t, err = ut.T("gt-datetime", fe.Field())
  560. default:
  561. err = fn()
  562. if err != nil {
  563. goto END
  564. }
  565. t, err = ut.T("gt-number", fe.Field(), ut.FmtNumber(f64, digits))
  566. }
  567. END:
  568. if err != nil {
  569. fmt.Printf("warning: error translating FieldError: %s", err)
  570. return fe.(error).Error()
  571. }
  572. return t
  573. },
  574. },
  575. {
  576. tag: "gte",
  577. customRegisFunc: func(ut ut.Translator) (err error) {
  578. if err = ut.Add("gte-string", "{0}の長さは少なくとも{1}以上はなければなりません", false); err != nil {
  579. return
  580. }
  581. // if err = ut.AddCardinal("gte-string-character", "{0}文字", locales.PluralRuleOne, false); err != nil {
  582. // return
  583. // }
  584. if err = ut.AddCardinal("gte-string-character", "{0}文字", locales.PluralRuleOther, false); err != nil {
  585. return
  586. }
  587. if err = ut.Add("gte-number", "{0}は{1}かより大きくなければなりません", false); err != nil {
  588. return
  589. }
  590. if err = ut.Add("gte-items", "{0}は少なくとも{1}を含まなければなりません", false); err != nil {
  591. return
  592. }
  593. // if err = ut.AddCardinal("gte-items-item", "{0}つの項目", locales.PluralRuleOne, false); err != nil {
  594. // return
  595. // }
  596. if err = ut.AddCardinal("gte-items-item", "{0}つの項目", locales.PluralRuleOther, false); err != nil {
  597. return
  598. }
  599. if err = ut.Add("gte-datetime", "{0}は現時刻以降でなければなりません", false); err != nil {
  600. return
  601. }
  602. return
  603. },
  604. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  605. var err error
  606. var t string
  607. var f64 float64
  608. var digits uint64
  609. var kind reflect.Kind
  610. fn := func() (err error) {
  611. if idx := strings.Index(fe.Param(), "."); idx != -1 {
  612. digits = uint64(len(fe.Param()[idx+1:]))
  613. }
  614. f64, err = strconv.ParseFloat(fe.Param(), 64)
  615. return
  616. }
  617. kind = fe.Kind()
  618. if kind == reflect.Ptr {
  619. kind = fe.Type().Elem().Kind()
  620. }
  621. switch kind {
  622. case reflect.String:
  623. var c string
  624. err = fn()
  625. if err != nil {
  626. goto END
  627. }
  628. c, err = ut.C("gte-string-character", f64, digits, ut.FmtNumber(f64, digits))
  629. if err != nil {
  630. goto END
  631. }
  632. t, err = ut.T("gte-string", fe.Field(), c)
  633. case reflect.Slice, reflect.Map, reflect.Array:
  634. var c string
  635. err = fn()
  636. if err != nil {
  637. goto END
  638. }
  639. c, err = ut.C("gte-items-item", f64, digits, ut.FmtNumber(f64, digits))
  640. if err != nil {
  641. goto END
  642. }
  643. t, err = ut.T("gte-items", fe.Field(), c)
  644. case reflect.Struct:
  645. if fe.Type() != reflect.TypeOf(time.Time{}) {
  646. err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
  647. goto END
  648. }
  649. t, err = ut.T("gte-datetime", fe.Field())
  650. default:
  651. err = fn()
  652. if err != nil {
  653. goto END
  654. }
  655. t, err = ut.T("gte-number", fe.Field(), ut.FmtNumber(f64, digits))
  656. }
  657. END:
  658. if err != nil {
  659. fmt.Printf("warning: error translating FieldError: %s", err)
  660. return fe.(error).Error()
  661. }
  662. return t
  663. },
  664. },
  665. {
  666. tag: "eqfield",
  667. translation: "{0}は{1}と等しくなければなりません",
  668. override: false,
  669. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  670. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  671. if err != nil {
  672. log.Printf("warning: error translating FieldError: %#v", fe)
  673. return fe.(error).Error()
  674. }
  675. return t
  676. },
  677. },
  678. {
  679. tag: "eqcsfield",
  680. translation: "{0}は{1}と等しくなければなりません",
  681. override: false,
  682. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  683. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  684. if err != nil {
  685. log.Printf("warning: error translating FieldError: %#v", fe)
  686. return fe.(error).Error()
  687. }
  688. return t
  689. },
  690. },
  691. {
  692. tag: "necsfield",
  693. translation: "{0}は{1}とは異ならなければなりません",
  694. override: false,
  695. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  696. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  697. if err != nil {
  698. log.Printf("warning: error translating FieldError: %#v", fe)
  699. return fe.(error).Error()
  700. }
  701. return t
  702. },
  703. },
  704. {
  705. tag: "gtcsfield",
  706. translation: "{0}は{1}よりも大きくなければなりません",
  707. override: false,
  708. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  709. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  710. if err != nil {
  711. log.Printf("warning: error translating FieldError: %#v", fe)
  712. return fe.(error).Error()
  713. }
  714. return t
  715. },
  716. },
  717. {
  718. tag: "gtecsfield",
  719. translation: "{0}は{1}以上でなければなりません",
  720. override: false,
  721. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  722. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  723. if err != nil {
  724. log.Printf("warning: error translating FieldError: %#v", fe)
  725. return fe.(error).Error()
  726. }
  727. return t
  728. },
  729. },
  730. {
  731. tag: "ltcsfield",
  732. translation: "{0}は{1}よりも小さくなければなりません",
  733. override: false,
  734. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  735. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  736. if err != nil {
  737. log.Printf("warning: error translating FieldError: %#v", fe)
  738. return fe.(error).Error()
  739. }
  740. return t
  741. },
  742. },
  743. {
  744. tag: "ltecsfield",
  745. translation: "{0}は{1}以下でなければなりません",
  746. override: false,
  747. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  748. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  749. if err != nil {
  750. log.Printf("warning: error translating FieldError: %#v", fe)
  751. return fe.(error).Error()
  752. }
  753. return t
  754. },
  755. },
  756. {
  757. tag: "nefield",
  758. translation: "{0}は{1}とは異ならなければなりません",
  759. override: false,
  760. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  761. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  762. if err != nil {
  763. log.Printf("warning: error translating FieldError: %#v", fe)
  764. return fe.(error).Error()
  765. }
  766. return t
  767. },
  768. },
  769. {
  770. tag: "gtfield",
  771. translation: "{0}は{1}よりも大きくなければなりません",
  772. override: false,
  773. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  774. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  775. if err != nil {
  776. log.Printf("warning: error translating FieldError: %#v", fe)
  777. return fe.(error).Error()
  778. }
  779. return t
  780. },
  781. },
  782. {
  783. tag: "gtefield",
  784. translation: "{0}は{1}以上でなければなりません",
  785. override: false,
  786. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  787. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  788. if err != nil {
  789. log.Printf("warning: error translating FieldError: %#v", fe)
  790. return fe.(error).Error()
  791. }
  792. return t
  793. },
  794. },
  795. {
  796. tag: "ltfield",
  797. translation: "{0}は{1}よりも小さくなければなりません",
  798. override: false,
  799. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  800. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  801. if err != nil {
  802. log.Printf("warning: error translating FieldError: %#v", fe)
  803. return fe.(error).Error()
  804. }
  805. return t
  806. },
  807. },
  808. {
  809. tag: "ltefield",
  810. translation: "{0}は{1}以下でなければなりません",
  811. override: false,
  812. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  813. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  814. if err != nil {
  815. log.Printf("warning: error translating FieldError: %#v", fe)
  816. return fe.(error).Error()
  817. }
  818. return t
  819. },
  820. },
  821. {
  822. tag: "alpha",
  823. translation: "{0}はアルファベットのみを含むことができます",
  824. override: false,
  825. },
  826. {
  827. tag: "alphanum",
  828. translation: "{0}はアルファベットと数字のみを含むことができます",
  829. override: false,
  830. },
  831. {
  832. tag: "numeric",
  833. translation: "{0}は正しい数字でなければなりません",
  834. override: false,
  835. },
  836. {
  837. tag: "number",
  838. translation: "{0}は正しい数でなければなりません",
  839. override: false,
  840. },
  841. {
  842. tag: "hexadecimal",
  843. translation: "{0}は正しい16進表記でなければなりません",
  844. override: false,
  845. },
  846. {
  847. tag: "hexcolor",
  848. translation: "{0}は正しいHEXカラーコードでなければなりません",
  849. override: false,
  850. },
  851. {
  852. tag: "rgb",
  853. translation: "{0}は正しいRGBカラーコードでなければなりません",
  854. override: false,
  855. },
  856. {
  857. tag: "rgba",
  858. translation: "{0}は正しいRGBAカラーコードでなければなりません",
  859. override: false,
  860. },
  861. {
  862. tag: "hsl",
  863. translation: "{0}は正しいHSLカラーコードでなければなりません",
  864. override: false,
  865. },
  866. {
  867. tag: "hsla",
  868. translation: "{0}は正しいHSLAカラーコードでなければなりません",
  869. override: false,
  870. },
  871. {
  872. tag: "email",
  873. translation: "{0}は正しいメールアドレスでなければなりません",
  874. override: false,
  875. },
  876. {
  877. tag: "url",
  878. translation: "{0}は正しいURLでなければなりません",
  879. override: false,
  880. },
  881. {
  882. tag: "uri",
  883. translation: "{0}は正しいURIでなければなりません",
  884. override: false,
  885. },
  886. {
  887. tag: "base64",
  888. translation: "{0}は正しいBase64文字列でなければなりません",
  889. override: false,
  890. },
  891. {
  892. tag: "contains",
  893. translation: "{0}は'{1}'を含まなければなりません",
  894. override: false,
  895. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  896. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  897. if err != nil {
  898. log.Printf("warning: error translating FieldError: %#v", fe)
  899. return fe.(error).Error()
  900. }
  901. return t
  902. },
  903. },
  904. {
  905. tag: "containsany",
  906. translation: "{0}は'{1}'の少なくとも1つを含まなければなりません",
  907. override: false,
  908. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  909. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  910. if err != nil {
  911. log.Printf("warning: error translating FieldError: %#v", fe)
  912. return fe.(error).Error()
  913. }
  914. return t
  915. },
  916. },
  917. {
  918. tag: "excludes",
  919. translation: "{0}には'{1}'というテキストを含むことはできません",
  920. override: false,
  921. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  922. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  923. if err != nil {
  924. log.Printf("warning: error translating FieldError: %#v", fe)
  925. return fe.(error).Error()
  926. }
  927. return t
  928. },
  929. },
  930. {
  931. tag: "excludesall",
  932. translation: "{0}には'{1}'のどれも含めることはできません",
  933. override: false,
  934. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  935. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  936. if err != nil {
  937. log.Printf("warning: error translating FieldError: %#v", fe)
  938. return fe.(error).Error()
  939. }
  940. return t
  941. },
  942. },
  943. {
  944. tag: "excludesrune",
  945. translation: "{0}には'{1}'を含めることはできません",
  946. override: false,
  947. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  948. t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  949. if err != nil {
  950. log.Printf("warning: error translating FieldError: %#v", fe)
  951. return fe.(error).Error()
  952. }
  953. return t
  954. },
  955. },
  956. {
  957. tag: "isbn",
  958. translation: "{0}は正しいISBN番号でなければなりません",
  959. override: false,
  960. },
  961. {
  962. tag: "isbn10",
  963. translation: "{0}は正しいISBN-10番号でなければなりません",
  964. override: false,
  965. },
  966. {
  967. tag: "isbn13",
  968. translation: "{0}は正しいISBN-13番号でなければなりません",
  969. override: false,
  970. },
  971. {
  972. tag: "uuid",
  973. translation: "{0}は正しいUUIDでなければなりません",
  974. override: false,
  975. },
  976. {
  977. tag: "uuid3",
  978. translation: "{0}はバージョンが3の正しいUUIDでなければなりません",
  979. override: false,
  980. },
  981. {
  982. tag: "uuid4",
  983. translation: "{0}はバージョンが4の正しいUUIDでなければなりません",
  984. override: false,
  985. },
  986. {
  987. tag: "uuid5",
  988. translation: "{0}はバージョンが4の正しいUUIDでなければなりません",
  989. override: false,
  990. },
  991. {
  992. tag: "ascii",
  993. translation: "{0}はASCII文字のみを含まなければなりません",
  994. override: false,
  995. },
  996. {
  997. tag: "printascii",
  998. translation: "{0}は印刷可能なASCII文字のみを含まなければなりません",
  999. override: false,
  1000. },
  1001. {
  1002. tag: "multibyte",
  1003. translation: "{0}はマルチバイト文字を含まなければなりません",
  1004. override: false,
  1005. },
  1006. {
  1007. tag: "datauri",
  1008. translation: "{0}は正しいデータURIを含まなければなりません",
  1009. override: false,
  1010. },
  1011. {
  1012. tag: "latitude",
  1013. translation: "{0}は正しい緯度の座標を含まなければなりません",
  1014. override: false,
  1015. },
  1016. {
  1017. tag: "longitude",
  1018. translation: "{0}は正しい経度の座標を含まなければなりません",
  1019. override: false,
  1020. },
  1021. {
  1022. tag: "ssn",
  1023. translation: "{0}は正しい社会保障番号でなければなりません",
  1024. override: false,
  1025. },
  1026. {
  1027. tag: "ipv4",
  1028. translation: "{0}は正しいIPv4アドレスでなければなりません",
  1029. override: false,
  1030. },
  1031. {
  1032. tag: "ipv6",
  1033. translation: "{0}は正しいIPv6アドレスでなければなりません",
  1034. override: false,
  1035. },
  1036. {
  1037. tag: "ip",
  1038. translation: "{0}は正しいIPアドレスでなければなりません",
  1039. override: false,
  1040. },
  1041. {
  1042. tag: "cidr",
  1043. translation: "{0}は正しいCIDR表記を含まなければなりません",
  1044. override: false,
  1045. },
  1046. {
  1047. tag: "cidrv4",
  1048. translation: "{0}はIPv4アドレスの正しいCIDR表記を含まなければなりません",
  1049. override: false,
  1050. },
  1051. {
  1052. tag: "cidrv6",
  1053. translation: "{0}はIPv6アドレスの正しいCIDR表記を含まなければなりません",
  1054. override: false,
  1055. },
  1056. {
  1057. tag: "tcp_addr",
  1058. translation: "{0}は正しいTCPアドレスでなければなりません",
  1059. override: false,
  1060. },
  1061. {
  1062. tag: "tcp4_addr",
  1063. translation: "{0}は正しいIPv4のTCPアドレスでなければなりません",
  1064. override: false,
  1065. },
  1066. {
  1067. tag: "tcp6_addr",
  1068. translation: "{0}は正しいIPv6のTCPアドレスでなければなりません",
  1069. override: false,
  1070. },
  1071. {
  1072. tag: "udp_addr",
  1073. translation: "{0}は正しいUDPアドレスでなければなりません",
  1074. override: false,
  1075. },
  1076. {
  1077. tag: "udp4_addr",
  1078. translation: "{0}は正しいIPv4のUDPアドレスでなければなりません",
  1079. override: false,
  1080. },
  1081. {
  1082. tag: "udp6_addr",
  1083. translation: "{0}は正しいIPv6のUDPアドレスでなければなりません",
  1084. override: false,
  1085. },
  1086. {
  1087. tag: "ip_addr",
  1088. translation: "{0}は解決可能なIPアドレスでなければなりません",
  1089. override: false,
  1090. },
  1091. {
  1092. tag: "ip4_addr",
  1093. translation: "{0}は解決可能なIPv4アドレスでなければなりません",
  1094. override: false,
  1095. },
  1096. {
  1097. tag: "ip6_addr",
  1098. translation: "{0}は解決可能なIPv6アドレスでなければなりません",
  1099. override: false,
  1100. },
  1101. {
  1102. tag: "unix_addr",
  1103. translation: "{0}は解決可能なUNIXアドレスでなければなりません",
  1104. override: false,
  1105. },
  1106. {
  1107. tag: "mac",
  1108. translation: "{0}は正しいMACアドレスを含まなければなりません",
  1109. override: false,
  1110. },
  1111. {
  1112. tag: "iscolor",
  1113. translation: "{0}は正しい色でなければなりません",
  1114. override: false,
  1115. },
  1116. {
  1117. tag: "oneof",
  1118. translation: "{0}は[{1}]のうちのいずれかでなければなりません",
  1119. override: false,
  1120. customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
  1121. s, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
  1122. if err != nil {
  1123. log.Printf("warning: error translating FieldError: %#v", fe)
  1124. return fe.(error).Error()
  1125. }
  1126. return s
  1127. },
  1128. },
  1129. }
  1130. for _, t := range translations {
  1131. if t.customTransFunc != nil && t.customRegisFunc != nil {
  1132. err = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)
  1133. } else if t.customTransFunc != nil && t.customRegisFunc == nil {
  1134. err = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)
  1135. } else if t.customTransFunc == nil && t.customRegisFunc != nil {
  1136. err = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)
  1137. } else {
  1138. err = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)
  1139. }
  1140. if err != nil {
  1141. return
  1142. }
  1143. }
  1144. return
  1145. }
  1146. func registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {
  1147. return func(ut ut.Translator) (err error) {
  1148. if err = ut.Add(tag, translation, override); err != nil {
  1149. return
  1150. }
  1151. return
  1152. }
  1153. }
  1154. func translateFunc(ut ut.Translator, fe validator.FieldError) string {
  1155. t, err := ut.T(fe.Tag(), fe.Field())
  1156. if err != nil {
  1157. log.Printf("warning: error translating FieldError: %#v", fe)
  1158. return fe.(error).Error()
  1159. }
  1160. return t
  1161. }