generate_resources.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "os/exec"
  7. "strings"
  8. "github.com/go-playground/universal-translator/resources/locales"
  9. "golang.org/x/text/unicode/cldr"
  10. "text/template"
  11. )
  12. // numbers:
  13. // symbols:
  14. // decimal: .
  15. // group: ','
  16. // negative: '-'
  17. // percent: '%'
  18. // permille: "\u2030"
  19. // formats:
  20. // decimal: '#,##0.###'
  21. // currency: "\xA4#,##0.00;(\xA4#,##0.00)"
  22. // percent: '#,##0%'
  23. // currencies:
  24. // JPY:
  25. // symbol: "\xA5"
  26. // USD:
  27. // symbol: $
  28. // type pluralInfo struct {
  29. // path string
  30. // locale string
  31. // plural string
  32. // }
  33. // type translator struct {
  34. // locale string
  35. // }
  36. //
  37. const (
  38. locDir = "../../resources/locales/%s"
  39. locFilename = locDir + "/%s.go"
  40. )
  41. var (
  42. prVarFuncs = map[string]string{
  43. "n": `n, err := locales.N(num)
  44. if err != nil {
  45. return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
  46. }
  47. `,
  48. "i": `i, err := locales.I(num)
  49. if err != nil {
  50. return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
  51. }
  52. `,
  53. "v": "v := locales.V(num)\n\n",
  54. "w": `w, err := locales.W(num)
  55. if err != nil {
  56. return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
  57. }
  58. `,
  59. "f": `f, err := locales.F(num)
  60. if err != nil {
  61. return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
  62. }
  63. `,
  64. "t": `t, err := locales.T(num)
  65. if err != nil {
  66. return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
  67. }
  68. `,
  69. }
  70. )
  71. type translator struct {
  72. Locale string
  73. Plurals string
  74. CardinalFunc string
  75. }
  76. var tmpl *template.Template
  77. func main() {
  78. var err error
  79. // load template
  80. tmpl, err = template.ParseGlob("*.tmpl")
  81. if err != nil {
  82. log.Fatal(err)
  83. }
  84. // load CLDR recourses
  85. var decoder cldr.Decoder
  86. cldr, err := decoder.DecodePath("data/core")
  87. if err != nil {
  88. panic(err)
  89. }
  90. // cardinalPlurals := map[string]
  91. // for _, p := range ldr.Supplemental().Plurals {
  92. // for _, pr := range p.PluralRules {
  93. // fmt.Println(pr.Locales)
  94. // for _, rule := range pr.PluralRule {
  95. // fmt.Println(rule.Count, rule.Common.Data())
  96. // }
  97. // }
  98. // }
  99. for _, l := range cldr.Locales() {
  100. // // work on uk for the moment
  101. // if l != "uk" && l != "fil" && l != "gd" {
  102. // if l != "gd" {
  103. // continue
  104. // }
  105. fmt.Println(l)
  106. baseLocale := strings.SplitN(l, "_", 2)[0]
  107. trans := &translator{
  108. Locale: l,
  109. }
  110. trans.CardinalFunc, trans.Plurals = parseCardinalPluralRuleFunc(cldr, baseLocale)
  111. // fmt.Println(trans.CardinalFunc, trans.Plurals)
  112. // cardinalRules := getLocaleCardinalPluralRules(cldr, baseLocale)
  113. // fmt.Println("CardinalRules:", l, cardinalRules)
  114. // Start Plural Rules
  115. // for _, p := range cldr.Supplemental().Plurals {
  116. // for _, pr := range p.PluralRules {
  117. // locales := strings.Split(pr.Locales, " ")
  118. // for _, loc := range locales {
  119. // if loc == baseLocale {
  120. // // plural rule found
  121. // fmt.Println("Locale Plural Rules Found:", loc, baseLocale, l)
  122. // }
  123. // }
  124. // // fmt.Println(pr.Locales)
  125. // // for _, rule := range pr.PluralRule {
  126. // // fmt.Println(rule.Count, rule.Common.Data())
  127. // // }
  128. // }
  129. // }
  130. // End Plural Rules
  131. if err = os.MkdirAll(fmt.Sprintf(locDir, l), 0777); err != nil {
  132. log.Fatal(err)
  133. }
  134. filename := fmt.Sprintf(locFilename, l, l)
  135. output, err := os.Create(filename)
  136. if err != nil {
  137. log.Fatal(err)
  138. }
  139. defer output.Close()
  140. if err := tmpl.ExecuteTemplate(output, "translator", trans); err != nil {
  141. log.Fatal(err)
  142. }
  143. output.Close()
  144. // after file written run gofmt on file to ensure best formatting
  145. cmd := exec.Command("gofmt", "-s", "-w", filename)
  146. if err = cmd.Run(); err != nil {
  147. log.Panic(err)
  148. }
  149. }
  150. }
  151. // TODO: cleanup function logic perhaps write a lexer... but it's working right now, and
  152. // I'm already farther down the rabbit hole than I'd like and so pulling the chute here.
  153. func parseCardinalPluralRuleFunc(current *cldr.CLDR, baseLocale string) (results string, plurals string) {
  154. var prCardinal *struct {
  155. cldr.Common
  156. Locales string "xml:\"locales,attr\""
  157. PluralRule []*struct {
  158. cldr.Common
  159. Count string "xml:\"count,attr\""
  160. } "xml:\"pluralRule\""
  161. }
  162. var pluralArr []locales.PluralRule
  163. for _, p := range current.Supplemental().Plurals {
  164. for _, pr := range p.PluralRules {
  165. locs := strings.Split(pr.Locales, " ")
  166. for _, loc := range locs {
  167. if loc == baseLocale {
  168. prCardinal = pr
  169. }
  170. }
  171. }
  172. }
  173. // no plural rules for locale
  174. if prCardinal == nil {
  175. plurals = "nil"
  176. results = "return locales.PluralRuleUnknown,nil"
  177. return
  178. }
  179. vals := make(map[string]struct{})
  180. first := true
  181. // pre parse for variables
  182. for _, rule := range prCardinal.PluralRule {
  183. ps1 := pluralStringToString(rule.Count)
  184. psI := pluralStringToInt(rule.Count)
  185. pluralArr = append(pluralArr, psI)
  186. // fmt.Println(rule.Count, ps1)
  187. data := strings.Replace(strings.Replace(strings.Replace(strings.TrimSpace(strings.SplitN(rule.Common.Data(), "@", 2)[0]), " = ", " == ", -1), " or ", " || ", -1), " and ", " && ", -1)
  188. if len(data) == 0 {
  189. if len(prCardinal.PluralRule) == 1 {
  190. results = "return locales." + ps1 + ", nil"
  191. } else {
  192. results += "\n\nreturn locales." + ps1 + ", nil"
  193. // results += "else {\nreturn locales." + locales.PluralStringToString(rule.Count) + ", nil\n}"
  194. }
  195. continue
  196. }
  197. if strings.Contains(data, "n") {
  198. vals[prVarFuncs["n"]] = struct{}{}
  199. }
  200. if strings.Contains(data, "i") {
  201. vals[prVarFuncs["i"]] = struct{}{}
  202. }
  203. if strings.Contains(data, "v") {
  204. vals[prVarFuncs["v"]] = struct{}{}
  205. }
  206. if strings.Contains(data, "w") {
  207. vals[prVarFuncs["w"]] = struct{}{}
  208. }
  209. if strings.Contains(data, "f") {
  210. vals[prVarFuncs["f"]] = struct{}{}
  211. }
  212. if strings.Contains(data, "t") {
  213. vals[prVarFuncs["t"]] = struct{}{}
  214. }
  215. if first {
  216. results += "if "
  217. first = false
  218. } else {
  219. results += "else if "
  220. }
  221. stmt := ""
  222. // real work here
  223. //
  224. // split by 'or' then by 'and' allowing to better
  225. // determine bracketing for formula
  226. ors := strings.Split(data, "||")
  227. for _, or := range ors {
  228. stmt += "("
  229. ands := strings.Split(strings.TrimSpace(or), "&&")
  230. for _, and := range ands {
  231. inArg := false
  232. pre := ""
  233. lft := ""
  234. preOperator := ""
  235. args := strings.Split(strings.TrimSpace(and), " ")
  236. for _, a := range args {
  237. if inArg {
  238. // check to see if is a value range 2..9
  239. multiRange := strings.Count(a, "..") > 1
  240. cargs := strings.Split(strings.TrimSpace(a), ",")
  241. hasBracket := len(cargs) > 1
  242. bracketAdded := false
  243. lastWasRange := false
  244. for _, carg := range cargs {
  245. if rng := strings.Split(carg, ".."); len(rng) > 1 {
  246. if multiRange {
  247. pre += " ("
  248. } else {
  249. pre += " "
  250. }
  251. switch preOperator {
  252. case "==":
  253. pre += lft + " >= " + rng[0] + " && " + lft + "<=" + rng[1]
  254. case "!=":
  255. pre += lft + " < " + rng[0] + " && " + lft + " > " + rng[1]
  256. }
  257. if multiRange {
  258. pre += ") || "
  259. } else {
  260. pre += " || "
  261. }
  262. lastWasRange = true
  263. continue
  264. }
  265. if lastWasRange {
  266. pre = strings.TrimRight(pre, " || ") + " && "
  267. }
  268. lastWasRange = false
  269. if hasBracket && !bracketAdded {
  270. pre += "("
  271. bracketAdded = true
  272. }
  273. // single comma separated values
  274. switch preOperator {
  275. case "==":
  276. pre += " " + lft + preOperator + carg + " || "
  277. case "!=":
  278. pre += " " + lft + preOperator + carg + " && "
  279. }
  280. }
  281. pre = strings.TrimRight(pre, " || ")
  282. pre = strings.TrimRight(pre, " && ")
  283. pre = strings.TrimRight(pre, " || ")
  284. if hasBracket && bracketAdded {
  285. pre += ")"
  286. }
  287. continue
  288. }
  289. if strings.Contains(a, "=") || a == ">" || a == "<" {
  290. inArg = true
  291. preOperator = a
  292. continue
  293. }
  294. lft += a
  295. }
  296. stmt += pre + " && "
  297. }
  298. stmt = strings.TrimRight(stmt, " && ") + ") || "
  299. }
  300. stmt = strings.TrimRight(stmt, " || ")
  301. results += stmt
  302. results += " {\n"
  303. // return plural rule here
  304. results += "return locales." + ps1 + ", nil\n"
  305. results += "}"
  306. }
  307. pre := "\n"
  308. for k := range vals {
  309. pre += k
  310. }
  311. pre += "\n"
  312. if len(results) == 0 {
  313. results = "return locales.PluralRuleUnknown,nil"
  314. }
  315. results = pre + results
  316. if len(pluralArr) == 0 {
  317. plurals = "nil"
  318. } else {
  319. plurals = fmt.Sprintf("%#v", pluralArr)
  320. }
  321. return
  322. }
  323. // pluralStringToInt returns the enum value of 'plural' provided
  324. func pluralStringToInt(plural string) locales.PluralRule {
  325. switch plural {
  326. case "zero":
  327. return locales.PluralRuleZero
  328. case "one":
  329. return locales.PluralRuleOne
  330. case "two":
  331. return locales.PluralRuleTwo
  332. case "few":
  333. return locales.PluralRuleFew
  334. case "many":
  335. return locales.PluralRuleMany
  336. case "other":
  337. return locales.PluralRuleOther
  338. default:
  339. return locales.PluralRuleUnknown
  340. }
  341. }
  342. func pluralStringToString(pr string) string {
  343. pr = strings.TrimSpace(pr)
  344. switch pr {
  345. case "zero":
  346. return "PluralRuleZero"
  347. case "one":
  348. return "PluralRuleOne"
  349. case "two":
  350. return "PluralRuleTwo"
  351. case "few":
  352. return "PluralRuleFew"
  353. case "many":
  354. return "PluralRuleMany"
  355. case "other":
  356. return "PluralRuleOther"
  357. default:
  358. return "PluralRuleUnknown"
  359. }
  360. }
  361. // //plurals
  362. // rules := "data/rules"
  363. // plurals := map[string]*pluralInfo{}
  364. // basePlurals := map[string]string{}
  365. // err := filepath.Walk(rules, func(path string, info os.FileInfo, err error) error {
  366. // if err != nil {
  367. // panic(err)
  368. // }
  369. // if info.IsDir() {
  370. // return nil
  371. // }
  372. // in, err := ioutil.ReadFile(path)
  373. // if err != nil {
  374. // panic(err)
  375. // }
  376. // var out yaml.MapSlice
  377. // if err = yaml.Unmarshal(in, &out); err != nil {
  378. // panic(err)
  379. // }
  380. // var plural string
  381. // for _, item := range out {
  382. // if item.Key == "plural" {
  383. // plural = item.Value.(string)
  384. // }
  385. // }
  386. // locale := strings.Replace(info.Name(), filepath.Ext(info.Name()), "", 1)
  387. // locale = strings.ToLower(strings.Replace(locale, "-", "_", -1))
  388. // plurals[locale] = &pluralInfo{
  389. // path: path,
  390. // locale: locale,
  391. // plural: plural,
  392. // }
  393. // if plural == "" {
  394. // return nil
  395. // }
  396. // basePlurals[locale] = plural
  397. // return nil
  398. // })
  399. // if err != nil {
  400. // panic(err)
  401. // }
  402. // for _, p := range plurals {
  403. // if p.plural == "" {
  404. // var ok bool
  405. // fmt.Print("can't find plurals in ", p.path, " attempting to locate base language plural rules...")
  406. // base := strings.SplitN(p.locale, "_", 2)
  407. // p.plural, ok = basePlurals[base[0]]
  408. // if !ok {
  409. // fmt.Println("Not Found")
  410. // continue
  411. // }
  412. // fmt.Println("Found")
  413. // }
  414. // }
  415. // cldr
  416. // var decoder cldr.Decoder
  417. // cldr, err := decoder.DecodePath("data/core")
  418. // if err != nil {
  419. // panic(err)
  420. // }
  421. // locs := map[string]string{}
  422. // numbers := map[string]i18n.Number{}
  423. // calendars := map[string]i18n.Calendar{}
  424. // locales := cldr.Locales()
  425. // for _, loc := range locales {
  426. // ldml := cldr.RawLDML(loc)
  427. // if ldml.Numbers == nil {
  428. // continue
  429. // }
  430. // var number i18n.Number
  431. // number.Currencies = make(i18n.CurrencyFormatValue)
  432. // if len(ldml.Numbers.Symbols) > 0 {
  433. // symbol := ldml.Numbers.Symbols[0]
  434. // if len(symbol.Decimal) > 0 {
  435. // number.Symbols.Decimal = symbol.Decimal[0].Data()
  436. // }
  437. // if len(symbol.Group) > 0 {
  438. // number.Symbols.Group = symbol.Group[0].Data()
  439. // }
  440. // if len(symbol.MinusSign) > 0 {
  441. // number.Symbols.Negative = symbol.MinusSign[0].Data()
  442. // }
  443. // if len(symbol.PercentSign) > 0 {
  444. // number.Symbols.Percent = symbol.PercentSign[0].Data()
  445. // }
  446. // if len(symbol.PerMille) > 0 {
  447. // number.Symbols.PerMille = symbol.PerMille[0].Data()
  448. // }
  449. // }
  450. // if len(ldml.Numbers.DecimalFormats) > 0 && len(ldml.Numbers.DecimalFormats[0].DecimalFormatLength) > 0 {
  451. // number.Formats.Decimal = ldml.Numbers.DecimalFormats[0].DecimalFormatLength[0].DecimalFormat[0].Pattern[0].Data()
  452. // }
  453. // if len(ldml.Numbers.CurrencyFormats) > 0 && len(ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength) > 0 {
  454. // number.Formats.Currency = ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat[0].Pattern[0].Data()
  455. // number.Formats.CurrencyAccounting = number.Formats.Currency
  456. // if len(ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat) > 1 {
  457. // number.Formats.CurrencyAccounting = ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat[1].Pattern[0].Data()
  458. // }
  459. // }
  460. // if len(ldml.Numbers.PercentFormats) > 0 && len(ldml.Numbers.PercentFormats[0].PercentFormatLength) > 0 {
  461. // number.Formats.Percent = ldml.Numbers.PercentFormats[0].PercentFormatLength[0].PercentFormat[0].Pattern[0].Data()
  462. // }
  463. // if ldml.Numbers.Currencies != nil {
  464. // for _, currency := range ldml.Numbers.Currencies.Currency {
  465. // var c i18n.Currency
  466. // c.Currency = currency.Type
  467. // if len(currency.DisplayName) > 0 {
  468. // c.DisplayName = currency.DisplayName[0].Data()
  469. // }
  470. // if len(currency.Symbol) > 0 {
  471. // c.Symbol = currency.Symbol[0].Data()
  472. // }
  473. // number.Currencies[c.Currency] = c
  474. // }
  475. // }
  476. // numbers[loc] = number
  477. // locs[loc] = strings.ToLower(strings.Replace(loc, "_", "", -1))
  478. // if ldml.Dates != nil && ldml.Dates.Calendars != nil {
  479. // var calendar i18n.Calendar
  480. // ldmlCar := ldml.Dates.Calendars.Calendar[0]
  481. // for _, cal := range ldml.Dates.Calendars.Calendar {
  482. // if cal.Type == "gregorian" {
  483. // ldmlCar = cal
  484. // }
  485. // }
  486. // if ldmlCar.DateFormats != nil {
  487. // for _, datefmt := range ldmlCar.DateFormats.DateFormatLength {
  488. // switch datefmt.Type {
  489. // case "full":
  490. // calendar.Formats.DateEra.BC.Full = datefmt.DateFormat[0].Pattern[0].Data()
  491. // calendar.Formats.DateEra.AD.Full = calendar.Formats.DateEra.BC.Full
  492. // case "long":
  493. // calendar.Formats.DateEra.BC.Long = datefmt.DateFormat[0].Pattern[0].Data()
  494. // calendar.Formats.DateEra.AD.Long = calendar.Formats.DateEra.BC.Long
  495. // // Overrides TODO: Split Each Section into separate function, getting to big to maintain
  496. // case "medium":
  497. // calendar.Formats.DateEra.BC.Medium = datefmt.DateFormat[0].Pattern[0].Data()
  498. // calendar.Formats.DateEra.AD.Medium = calendar.Formats.DateEra.BC.Medium
  499. // case "short":
  500. // calendar.Formats.DateEra.BC.Short = datefmt.DateFormat[0].Pattern[0].Data()
  501. // calendar.Formats.DateEra.AD.Short = calendar.Formats.DateEra.BC.Short
  502. // }
  503. // }
  504. // // Overrides TODO: Split Each Section into separate function, getting to big to maintain
  505. // switch loc {
  506. // case "th":
  507. // calendar.Formats.DateEra.BC.Full = "EEEEที่ d MMMM y GGGG"
  508. // calendar.Formats.DateEra.AD.Full = "EEEEที่ d MMMM GGGG y"
  509. // calendar.Formats.DateEra.BC.Long = "d MMMM y GG"
  510. // calendar.Formats.DateEra.AD.Long = "d MMMM GG y"
  511. // case "en":
  512. // calendar.Formats.DateEra.BC.Full = "EEEE, MMMM d, y GGGG"
  513. // calendar.Formats.DateEra.BC.Long = "MMMM d, y GG"
  514. // // calendar.Formats.DateEra.BC.Medium = "MMM d, y GG"
  515. // // calendar.Formats.DateEra.BC.Short = "M/d/yy G"
  516. // }
  517. // }
  518. // if ldmlCar.TimeFormats != nil {
  519. // for _, datefmt := range ldmlCar.TimeFormats.TimeFormatLength {
  520. // switch datefmt.Type {
  521. // case "full":
  522. // calendar.Formats.Time.Full = datefmt.TimeFormat[0].Pattern[0].Data()
  523. // case "long":
  524. // calendar.Formats.Time.Long = datefmt.TimeFormat[0].Pattern[0].Data()
  525. // case "medium":
  526. // calendar.Formats.Time.Medium = datefmt.TimeFormat[0].Pattern[0].Data()
  527. // case "short":
  528. // calendar.Formats.Time.Short = datefmt.TimeFormat[0].Pattern[0].Data()
  529. // }
  530. // }
  531. // }
  532. // if ldmlCar.DateTimeFormats != nil {
  533. // for _, datefmt := range ldmlCar.DateTimeFormats.DateTimeFormatLength {
  534. // switch datefmt.Type {
  535. // case "full":
  536. // calendar.Formats.DateTime.Full = datefmt.DateTimeFormat[0].Pattern[0].Data()
  537. // case "long":
  538. // calendar.Formats.DateTime.Long = datefmt.DateTimeFormat[0].Pattern[0].Data()
  539. // case "medium":
  540. // calendar.Formats.DateTime.Medium = datefmt.DateTimeFormat[0].Pattern[0].Data()
  541. // case "short":
  542. // calendar.Formats.DateTime.Short = datefmt.DateTimeFormat[0].Pattern[0].Data()
  543. // }
  544. // }
  545. // }
  546. // if ldmlCar.Months != nil {
  547. // for _, monthctx := range ldmlCar.Months.MonthContext {
  548. // for _, months := range monthctx.MonthWidth {
  549. // i18nMonth := make(i18n.CalendarMonthFormatNameValue)
  550. // for _, m := range months.Month {
  551. // switch m.Type {
  552. // case "1":
  553. // i18nMonth[time.January] = m.Data()
  554. // case "2":
  555. // i18nMonth[time.February] = m.Data()
  556. // case "3":
  557. // i18nMonth[time.March] = m.Data()
  558. // case "4":
  559. // i18nMonth[time.April] = m.Data()
  560. // case "5":
  561. // i18nMonth[time.May] = m.Data()
  562. // case "6":
  563. // i18nMonth[time.June] = m.Data()
  564. // case "7":
  565. // i18nMonth[time.July] = m.Data()
  566. // case "8":
  567. // i18nMonth[time.August] = m.Data()
  568. // case "9":
  569. // i18nMonth[time.September] = m.Data()
  570. // case "10":
  571. // i18nMonth[time.October] = m.Data()
  572. // case "11":
  573. // i18nMonth[time.November] = m.Data()
  574. // case "12":
  575. // i18nMonth[time.December] = m.Data()
  576. // }
  577. // }
  578. // switch months.Type {
  579. // case "abbreviated":
  580. // calendar.FormatNames.Months.Abbreviated = i18nMonth
  581. // case "narrow":
  582. // calendar.FormatNames.Months.Narrow = i18nMonth
  583. // case "short":
  584. // calendar.FormatNames.Months.Short = i18nMonth
  585. // case "wide":
  586. // calendar.FormatNames.Months.Wide = i18nMonth
  587. // }
  588. // }
  589. // }
  590. // }
  591. // if ldmlCar.Days != nil {
  592. // for _, dayctx := range ldmlCar.Days.DayContext {
  593. // for _, days := range dayctx.DayWidth {
  594. // i18nDay := make(i18n.CalendarDayFormatNameValue)
  595. // for _, d := range days.Day {
  596. // switch d.Type {
  597. // case "sun":
  598. // i18nDay[time.Sunday] = d.Data()
  599. // case "mon":
  600. // i18nDay[time.Monday] = d.Data()
  601. // case "tue":
  602. // i18nDay[time.Tuesday] = d.Data()
  603. // case "wed":
  604. // i18nDay[time.Wednesday] = d.Data()
  605. // case "thu":
  606. // i18nDay[time.Thursday] = d.Data()
  607. // case "fri":
  608. // i18nDay[time.Friday] = d.Data()
  609. // case "sat":
  610. // i18nDay[time.Saturday] = d.Data()
  611. // }
  612. // }
  613. // switch days.Type {
  614. // case "abbreviated":
  615. // calendar.FormatNames.Days.Abbreviated = i18nDay
  616. // case "narrow":
  617. // calendar.FormatNames.Days.Narrow = i18nDay
  618. // case "short":
  619. // calendar.FormatNames.Days.Short = i18nDay
  620. // case "wide":
  621. // calendar.FormatNames.Days.Wide = i18nDay
  622. // }
  623. // }
  624. // }
  625. // }
  626. // if ldmlCar.DayPeriods != nil {
  627. // for _, ctx := range ldmlCar.DayPeriods.DayPeriodContext {
  628. // for _, width := range ctx.DayPeriodWidth {
  629. // // var i18nPeriod i18n.CalendarPeriodFormatNameValue
  630. // i18nPeriod := make(i18n.CalendarPeriodFormatNameValue)
  631. // for _, d := range width.DayPeriod {
  632. // if _, ok := i18nPeriod[d.Type]; !ok {
  633. // i18nPeriod[d.Type] = d.Data()
  634. // }
  635. // }
  636. // switch width.Type {
  637. // case "abbreviated":
  638. // calendar.FormatNames.Periods.Abbreviated = i18nPeriod
  639. // case "narrow":
  640. // calendar.FormatNames.Periods.Narrow = i18nPeriod
  641. // case "short":
  642. // calendar.FormatNames.Periods.Short = i18nPeriod
  643. // case "wide":
  644. // calendar.FormatNames.Periods.Wide = i18nPeriod
  645. // }
  646. // }
  647. // }
  648. // // var empty i18n.CalendarPeriodFormatNameValue
  649. // // if calendar.FormatNames.Periods.Abbreviated == empty {
  650. // // calendar.FormatNames.Periods.Abbreviated = calendar.FormatNames.Periods.Wide
  651. // // }
  652. // }
  653. // if ldmlCar.Eras != nil {
  654. // var eras i18n.Eras
  655. // if ldmlCar.Eras.EraNames != nil && len(ldmlCar.Eras.EraNames.Era) > 0 {
  656. // eras.BC.Full = ldmlCar.Eras.EraNames.Era[0].Data()
  657. // }
  658. // if ldmlCar.Eras.EraAbbr != nil && len(ldmlCar.Eras.EraAbbr.Era) > 0 {
  659. // eras.BC.Abbrev = ldmlCar.Eras.EraAbbr.Era[0].Data()
  660. // }
  661. // if ldmlCar.Eras.EraNarrow != nil && len(ldmlCar.Eras.EraNarrow.Era) > 0 {
  662. // eras.BC.Narrow = ldmlCar.Eras.EraNarrow.Era[0].Data()
  663. // }
  664. // if ldmlCar.Eras.EraNames != nil && len(ldmlCar.Eras.EraNames.Era) > 2 {
  665. // eras.AD.Full = ldmlCar.Eras.EraNames.Era[2].Data()
  666. // }
  667. // if ldmlCar.Eras.EraAbbr != nil && len(ldmlCar.Eras.EraAbbr.Era) > 2 {
  668. // eras.AD.Abbrev = ldmlCar.Eras.EraAbbr.Era[2].Data()
  669. // }
  670. // if ldmlCar.Eras.EraNarrow != nil && len(ldmlCar.Eras.EraNarrow.Era) > 2 {
  671. // eras.AD.Narrow = ldmlCar.Eras.EraNarrow.Era[2].Data()
  672. // }
  673. // calendar.FormatNames.Eras = eras
  674. // }
  675. // calendars[loc] = calendar
  676. // }
  677. // }
  678. // for locale := range locs {
  679. // if !strings.Contains(locale, "_") {
  680. // continue
  681. // }
  682. // calendar := calendars[locale]
  683. // bString := strings.SplitN(locale, "_", 2)
  684. // base := bString[0]
  685. // baseCal := calendars[base]
  686. // // copy base calendar objects
  687. // // Dates
  688. // if calendar.Formats.DateEra.AD.Full == "" {
  689. // calendar.Formats.DateEra.BC.Full = baseCal.Formats.DateEra.BC.Full
  690. // calendar.Formats.DateEra.AD.Full = baseCal.Formats.DateEra.AD.Full
  691. // }
  692. // if calendar.Formats.DateEra.AD.Long == "" {
  693. // calendar.Formats.DateEra.BC.Long = baseCal.Formats.DateEra.BC.Long
  694. // calendar.Formats.DateEra.AD.Long = baseCal.Formats.DateEra.AD.Long
  695. // }
  696. // if calendar.Formats.DateEra.AD.Medium == "" {
  697. // calendar.Formats.DateEra.BC.Medium = baseCal.Formats.DateEra.BC.Medium
  698. // calendar.Formats.DateEra.AD.Medium = baseCal.Formats.DateEra.AD.Medium
  699. // }
  700. // if calendar.Formats.DateEra.AD.Short == "" {
  701. // calendar.Formats.DateEra.BC.Short = baseCal.Formats.DateEra.BC.Short
  702. // calendar.Formats.DateEra.AD.Short = baseCal.Formats.DateEra.AD.Short
  703. // }
  704. // // times
  705. // if calendar.Formats.Time.Full == "" {
  706. // calendar.Formats.Time.Full = baseCal.Formats.Time.Full
  707. // }
  708. // if calendar.Formats.Time.Long == "" {
  709. // calendar.Formats.Time.Long = baseCal.Formats.Time.Long
  710. // }
  711. // if calendar.Formats.Time.Medium == "" {
  712. // calendar.Formats.Time.Medium = baseCal.Formats.Time.Medium
  713. // }
  714. // if calendar.Formats.Time.Short == "" {
  715. // calendar.Formats.Time.Short = baseCal.Formats.Time.Short
  716. // }
  717. // // date & times
  718. // if calendar.Formats.DateTime.Full == "" {
  719. // calendar.Formats.DateTime.Full = baseCal.Formats.DateTime.Full
  720. // }
  721. // if calendar.Formats.DateTime.Long == "" {
  722. // calendar.Formats.DateTime.Long = baseCal.Formats.DateTime.Long
  723. // }
  724. // if calendar.Formats.DateTime.Medium == "" {
  725. // calendar.Formats.DateTime.Medium = baseCal.Formats.DateTime.Medium
  726. // }
  727. // if calendar.Formats.DateTime.Short == "" {
  728. // calendar.Formats.DateTime.Short = baseCal.Formats.DateTime.Short
  729. // }
  730. // // months
  731. // if calendar.FormatNames.Months.Abbreviated == nil {
  732. // calendar.FormatNames.Months.Abbreviated = make(i18n.CalendarMonthFormatNameValue)
  733. // }
  734. // if calendar.FormatNames.Months.Narrow == nil {
  735. // calendar.FormatNames.Months.Narrow = make(i18n.CalendarMonthFormatNameValue)
  736. // }
  737. // if calendar.FormatNames.Months.Short == nil {
  738. // calendar.FormatNames.Months.Short = make(i18n.CalendarMonthFormatNameValue)
  739. // }
  740. // if calendar.FormatNames.Months.Wide == nil {
  741. // calendar.FormatNames.Months.Wide = make(i18n.CalendarMonthFormatNameValue)
  742. // }
  743. // for k, v := range baseCal.FormatNames.Months.Abbreviated {
  744. // val, ok := calendar.FormatNames.Months.Abbreviated[k]
  745. // if !ok {
  746. // calendar.FormatNames.Months.Abbreviated[k] = v
  747. // continue
  748. // }
  749. // if val == "" {
  750. // calendar.FormatNames.Months.Abbreviated[k] = v
  751. // }
  752. // }
  753. // for k, v := range baseCal.FormatNames.Months.Narrow {
  754. // val, ok := calendar.FormatNames.Months.Narrow[k]
  755. // if !ok {
  756. // calendar.FormatNames.Months.Narrow[k] = v
  757. // continue
  758. // }
  759. // if val == "" {
  760. // calendar.FormatNames.Months.Narrow[k] = v
  761. // }
  762. // }
  763. // for k, v := range baseCal.FormatNames.Months.Short {
  764. // val, ok := calendar.FormatNames.Months.Short[k]
  765. // if !ok {
  766. // calendar.FormatNames.Months.Short[k] = v
  767. // continue
  768. // }
  769. // if val == "" {
  770. // calendar.FormatNames.Months.Short[k] = v
  771. // }
  772. // }
  773. // for k, v := range baseCal.FormatNames.Months.Wide {
  774. // val, ok := calendar.FormatNames.Months.Wide[k]
  775. // if !ok {
  776. // calendar.FormatNames.Months.Wide[k] = v
  777. // continue
  778. // }
  779. // if val == "" {
  780. // calendar.FormatNames.Months.Wide[k] = v
  781. // }
  782. // }
  783. // // days
  784. // if calendar.FormatNames.Days.Abbreviated == nil {
  785. // calendar.FormatNames.Days.Abbreviated = make(i18n.CalendarDayFormatNameValue)
  786. // }
  787. // if calendar.FormatNames.Days.Narrow == nil {
  788. // calendar.FormatNames.Days.Narrow = make(i18n.CalendarDayFormatNameValue)
  789. // }
  790. // if calendar.FormatNames.Days.Short == nil {
  791. // calendar.FormatNames.Days.Short = make(i18n.CalendarDayFormatNameValue)
  792. // }
  793. // if calendar.FormatNames.Days.Wide == nil {
  794. // calendar.FormatNames.Days.Wide = make(i18n.CalendarDayFormatNameValue)
  795. // }
  796. // for k, v := range baseCal.FormatNames.Days.Abbreviated {
  797. // val, ok := calendar.FormatNames.Days.Abbreviated[k]
  798. // if !ok {
  799. // calendar.FormatNames.Days.Abbreviated[k] = v
  800. // continue
  801. // }
  802. // if val == "" {
  803. // calendar.FormatNames.Days.Abbreviated[k] = v
  804. // }
  805. // }
  806. // for k, v := range baseCal.FormatNames.Days.Narrow {
  807. // val, ok := calendar.FormatNames.Days.Narrow[k]
  808. // if !ok {
  809. // calendar.FormatNames.Days.Narrow[k] = v
  810. // continue
  811. // }
  812. // if val == "" {
  813. // calendar.FormatNames.Days.Narrow[k] = v
  814. // }
  815. // }
  816. // for k, v := range baseCal.FormatNames.Days.Short {
  817. // val, ok := calendar.FormatNames.Days.Short[k]
  818. // if !ok {
  819. // calendar.FormatNames.Days.Short[k] = v
  820. // continue
  821. // }
  822. // if val == "" {
  823. // calendar.FormatNames.Days.Short[k] = v
  824. // }
  825. // }
  826. // for k, v := range baseCal.FormatNames.Days.Wide {
  827. // val, ok := calendar.FormatNames.Days.Wide[k]
  828. // if !ok {
  829. // calendar.FormatNames.Days.Wide[k] = v
  830. // continue
  831. // }
  832. // if val == "" {
  833. // calendar.FormatNames.Days.Wide[k] = v
  834. // }
  835. // }
  836. // // periods
  837. // if calendar.FormatNames.Periods.Abbreviated == nil {
  838. // calendar.FormatNames.Periods.Abbreviated = make(i18n.CalendarPeriodFormatNameValue)
  839. // }
  840. // if calendar.FormatNames.Periods.Narrow == nil {
  841. // calendar.FormatNames.Periods.Narrow = make(i18n.CalendarPeriodFormatNameValue)
  842. // }
  843. // if calendar.FormatNames.Periods.Short == nil {
  844. // calendar.FormatNames.Periods.Short = make(i18n.CalendarPeriodFormatNameValue)
  845. // }
  846. // if calendar.FormatNames.Periods.Wide == nil {
  847. // calendar.FormatNames.Periods.Wide = make(i18n.CalendarPeriodFormatNameValue)
  848. // }
  849. // for k, v := range baseCal.FormatNames.Periods.Abbreviated {
  850. // val, ok := calendar.FormatNames.Periods.Abbreviated[k]
  851. // if !ok {
  852. // calendar.FormatNames.Periods.Abbreviated[k] = v
  853. // continue
  854. // }
  855. // if val == "" {
  856. // calendar.FormatNames.Periods.Abbreviated[k] = v
  857. // }
  858. // }
  859. // for k, v := range baseCal.FormatNames.Periods.Narrow {
  860. // val, ok := calendar.FormatNames.Periods.Narrow[k]
  861. // if !ok {
  862. // calendar.FormatNames.Periods.Narrow[k] = v
  863. // continue
  864. // }
  865. // if val == "" {
  866. // calendar.FormatNames.Periods.Narrow[k] = v
  867. // }
  868. // }
  869. // for k, v := range baseCal.FormatNames.Periods.Short {
  870. // val, ok := calendar.FormatNames.Periods.Short[k]
  871. // if !ok {
  872. // calendar.FormatNames.Periods.Short[k] = v
  873. // continue
  874. // }
  875. // if val == "" {
  876. // calendar.FormatNames.Periods.Short[k] = v
  877. // }
  878. // }
  879. // for k, v := range baseCal.FormatNames.Periods.Wide {
  880. // val, ok := calendar.FormatNames.Periods.Wide[k]
  881. // if !ok {
  882. // calendar.FormatNames.Periods.Wide[k] = v
  883. // continue
  884. // }
  885. // if val == "" {
  886. // calendar.FormatNames.Periods.Wide[k] = v
  887. // }
  888. // }
  889. // calendars[locale] = calendar
  890. // number := numbers[locale]
  891. // baseNum := numbers[base]
  892. // // symbols
  893. // if number.Symbols.Decimal == "" {
  894. // number.Symbols.Decimal = baseNum.Symbols.Decimal
  895. // }
  896. // if number.Symbols.Group == "" {
  897. // number.Symbols.Group = baseNum.Symbols.Group
  898. // }
  899. // if number.Symbols.Negative == "" {
  900. // number.Symbols.Negative = baseNum.Symbols.Negative
  901. // }
  902. // if number.Symbols.Percent == "" {
  903. // number.Symbols.Percent = baseNum.Symbols.Percent
  904. // }
  905. // if number.Symbols.PerMille == "" {
  906. // number.Symbols.PerMille = baseNum.Symbols.PerMille
  907. // }
  908. // // formats
  909. // if number.Formats.Decimal == "" {
  910. // number.Formats.Decimal = baseNum.Formats.Decimal
  911. // }
  912. // if number.Formats.Currency == "" {
  913. // number.Formats.Currency = baseNum.Formats.Currency
  914. // }
  915. // if number.Formats.CurrencyAccounting == "" {
  916. // number.Formats.CurrencyAccounting = baseNum.Formats.CurrencyAccounting
  917. // }
  918. // if number.Formats.Percent == "" {
  919. // number.Formats.Percent = baseNum.Formats.Percent
  920. // }
  921. // // currency
  922. // for k, v := range baseNum.Currencies {
  923. // val, ok := number.Currencies[k]
  924. // if !ok {
  925. // // number.Currencies[k] = v
  926. // continue
  927. // }
  928. // if val.Currency == "" {
  929. // val.Currency = v.Currency
  930. // }
  931. // if val.DisplayName == "" {
  932. // val.DisplayName = v.DisplayName
  933. // }
  934. // if val.Symbol == "" {
  935. // val.Symbol = v.Symbol
  936. // }
  937. // number.Currencies[k] = val
  938. // }
  939. // numbers[locale] = number
  940. // }
  941. // var wg sync.WaitGroup
  942. // wg.Add(len(numbers))
  943. // for locale, number := range numbers {
  944. // go func(locale string, number i18n.Number) {
  945. // localeLowercase := strings.ToLower(locale)
  946. // defer func() { wg.Done() }()
  947. // path := "../../resources/locales/" + locale
  948. // if _, err := os.Stat(path); err != nil {
  949. // if err = os.MkdirAll(path, 0777); err != nil {
  950. // panic(err)
  951. // }
  952. // }
  953. // path += "/"
  954. // mainFile, err := os.Create(path + "main.go")
  955. // if err != nil {
  956. // panic(err)
  957. // }
  958. // defer mainFile.Close()
  959. // calendar := calendars[locale]
  960. // mainCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
  961. // import "github.com/go-playground/universal-translator"
  962. // var locale = &ut.Locale{
  963. // Locale: %q,
  964. // Number: ut.Number{
  965. // Symbols: symbols,
  966. // Formats: formats,
  967. // Currencies: currencies,
  968. // },
  969. // Calendar: calendar,
  970. // PluralRule: pluralRule,
  971. // }
  972. // func init() {
  973. // ut.RegisterLocale(locale)
  974. // }
  975. // `, locale, locale)))
  976. // if err != nil {
  977. // panic(err)
  978. // }
  979. // fmt.Fprintf(mainFile, "%s", mainCodes)
  980. // numberFile, err := os.Create(path + "number.go")
  981. // if err != nil {
  982. // panic(err)
  983. // }
  984. // defer numberFile.Close()
  985. // numberCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
  986. // import "github.com/go-playground/universal-translator"
  987. // var (
  988. // symbols = %#v
  989. // formats = %#v
  990. // )
  991. // `, locale, number.Symbols, number.Formats)))
  992. // if err != nil {
  993. // panic(err)
  994. // }
  995. // fmt.Fprintf(numberFile, "%s", numberCodes)
  996. // currencyFile, err := os.Create(path + "currency.go")
  997. // if err != nil {
  998. // panic(err)
  999. // }
  1000. // defer currencyFile.Close()
  1001. // currencyCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
  1002. // import "github.com/go-playground/universal-translator"
  1003. // var currencies = %# v
  1004. // `, locale, number.Currencies)))
  1005. // if err != nil {
  1006. // panic(err)
  1007. // }
  1008. // fmt.Fprintf(currencyFile, "%s", currencyCodes)
  1009. // calendarFile, err := os.Create(path + "calendar.go")
  1010. // if err != nil {
  1011. // panic(err)
  1012. // }
  1013. // defer calendarFile.Close()
  1014. // calendarCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
  1015. // import "github.com/go-playground/universal-translator"
  1016. // var calendar = %#v
  1017. // `, locale, calendar)))
  1018. // if err != nil {
  1019. // panic(err)
  1020. // }
  1021. // fmt.Fprintf(calendarFile, "%s", calendarCodes)
  1022. // var ok bool
  1023. // pluralCode := "1"
  1024. // pInfo, ok := plurals[localeLowercase]
  1025. // if ok && pInfo.plural != "" {
  1026. // pluralCode = pInfo.plural
  1027. // }
  1028. // pluralFile, err := os.Create(path + "plural.go")
  1029. // if err != nil {
  1030. // panic(err)
  1031. // }
  1032. // defer pluralFile.Close()
  1033. // pluralCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
  1034. // var pluralRule = %q
  1035. // `, locale, pluralCode)))
  1036. // if err != nil {
  1037. // panic(err)
  1038. // }
  1039. // fmt.Fprintf(pluralFile, "%s", pluralCodes)
  1040. // }(locale, number)
  1041. // }
  1042. // wg.Wait()
  1043. // localesFile, err := os.Create("../../resources/locales/all.go")
  1044. // if err != nil {
  1045. // panic(err)
  1046. // }
  1047. // defer localesFile.Close()
  1048. // tmpl, err := template.New("").Parse(`package locales
  1049. // // Imports for all locales
  1050. // import (
  1051. // {{range $locale, $_ := .}}// Locale "{{$locale}}" import that automatically registers itslef with the universal-translator package
  1052. // _ "github.com/go-playground/universal-translator/resources/locales/{{$locale}}"
  1053. // {{end}})
  1054. // `)
  1055. // if err != nil {
  1056. // panic(err)
  1057. // }
  1058. // var buf bytes.Buffer
  1059. // if err := tmpl.Execute(&buf, locs); err != nil {
  1060. // panic(err)
  1061. // }
  1062. // allCodes, err := format.Source(buf.Bytes())
  1063. // if err != nil {
  1064. // panic(err)
  1065. // }
  1066. // _, err = localesFile.Write(allCodes)
  1067. // if err != nil {
  1068. // panic(err)
  1069. // }
  1070. // }