|
|
@@ -1,22 +1,15 @@
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
- "bytes"
|
|
|
"fmt"
|
|
|
- "go/format"
|
|
|
- "io/ioutil"
|
|
|
+ "log"
|
|
|
"os"
|
|
|
- "path/filepath"
|
|
|
+ "os/exec"
|
|
|
"strings"
|
|
|
- "sync"
|
|
|
- "text/template"
|
|
|
- "time"
|
|
|
-
|
|
|
- "gopkg.in/yaml.v2"
|
|
|
|
|
|
"golang.org/x/text/unicode/cldr"
|
|
|
|
|
|
- i18n "github.com/go-playground/universal-translator"
|
|
|
+ "text/template"
|
|
|
)
|
|
|
|
|
|
// numbers:
|
|
|
@@ -36,904 +29,1304 @@ import (
|
|
|
// USD:
|
|
|
// symbol: $
|
|
|
|
|
|
-type pluralInfo struct {
|
|
|
- path string
|
|
|
- locale string
|
|
|
- plural string
|
|
|
-}
|
|
|
+// type pluralInfo struct {
|
|
|
+// path string
|
|
|
+// locale string
|
|
|
+// plural string
|
|
|
+// }
|
|
|
|
|
|
-func main() {
|
|
|
+// type translator struct {
|
|
|
+// locale string
|
|
|
|
|
|
- //plurals
|
|
|
- rules := "data/rules"
|
|
|
- plurals := map[string]*pluralInfo{}
|
|
|
- basePlurals := map[string]string{}
|
|
|
+// }
|
|
|
+//
|
|
|
|
|
|
- err := filepath.Walk(rules, func(path string, info os.FileInfo, err error) error {
|
|
|
+const (
|
|
|
+ locDir = "../../resources/locales/%s"
|
|
|
+ locFilename = locDir + "/%s.go"
|
|
|
+)
|
|
|
|
|
|
+var (
|
|
|
+ prVarFuncs = map[string]string{
|
|
|
+ "n": `n, err := locales.N(num)
|
|
|
if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
-
|
|
|
- if info.IsDir() {
|
|
|
- return nil
|
|
|
+ return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
|
|
|
}
|
|
|
|
|
|
- in, err := ioutil.ReadFile(path)
|
|
|
+ `,
|
|
|
+ "i": `i, err := locales.I(num)
|
|
|
if err != nil {
|
|
|
- panic(err)
|
|
|
+ return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
|
|
|
}
|
|
|
|
|
|
- var out yaml.MapSlice
|
|
|
- if err = yaml.Unmarshal(in, &out); err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
-
|
|
|
- var plural string
|
|
|
- for _, item := range out {
|
|
|
- if item.Key == "plural" {
|
|
|
- plural = item.Value.(string)
|
|
|
- }
|
|
|
+ `,
|
|
|
+ "v": "v := locales.V(num)\n\n",
|
|
|
+ "w": `w, err := locales.W(num)
|
|
|
+ if err != nil {
|
|
|
+ return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
|
|
|
}
|
|
|
|
|
|
- locale := strings.Replace(info.Name(), filepath.Ext(info.Name()), "", 1)
|
|
|
- locale = strings.ToLower(strings.Replace(locale, "-", "_", -1))
|
|
|
-
|
|
|
- plurals[locale] = &pluralInfo{
|
|
|
- path: path,
|
|
|
- locale: locale,
|
|
|
- plural: plural,
|
|
|
+ `,
|
|
|
+ "f": `f, err := locales.F(num)
|
|
|
+ if err != nil {
|
|
|
+ return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
|
|
|
}
|
|
|
|
|
|
- if plural == "" {
|
|
|
- return nil
|
|
|
+ `,
|
|
|
+ "t": `t, err := locales.T(num)
|
|
|
+ if err != nil {
|
|
|
+ return locales.PluralRuleUnknown, &locales.ErrBadNumberValue{NumberValue:num, InnerError: err}
|
|
|
}
|
|
|
|
|
|
- basePlurals[locale] = plural
|
|
|
-
|
|
|
- return nil
|
|
|
- })
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
+ `,
|
|
|
}
|
|
|
+)
|
|
|
|
|
|
- for _, p := range plurals {
|
|
|
-
|
|
|
- if p.plural == "" {
|
|
|
-
|
|
|
- var ok bool
|
|
|
+type translator struct {
|
|
|
+ Locale string
|
|
|
+ CardinalFunc string
|
|
|
+}
|
|
|
|
|
|
- fmt.Print("can't find plurals in ", p.path, " attempting to locate base language plural rules...")
|
|
|
+var tmpl *template.Template
|
|
|
|
|
|
- base := strings.SplitN(p.locale, "_", 2)
|
|
|
+func main() {
|
|
|
|
|
|
- p.plural, ok = basePlurals[base[0]]
|
|
|
- if !ok {
|
|
|
- fmt.Println("Not Found")
|
|
|
- continue
|
|
|
- }
|
|
|
+ var err error
|
|
|
|
|
|
- fmt.Println("Found")
|
|
|
- }
|
|
|
+ // load template
|
|
|
+ tmpl, err = template.ParseGlob("*.tmpl")
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- // cldr
|
|
|
-
|
|
|
+ // load CLDR recourses
|
|
|
var decoder cldr.Decoder
|
|
|
cldr, err := decoder.DecodePath("data/core")
|
|
|
if err != nil {
|
|
|
panic(err)
|
|
|
}
|
|
|
|
|
|
- locs := map[string]string{}
|
|
|
- numbers := map[string]i18n.Number{}
|
|
|
- calendars := map[string]i18n.Calendar{}
|
|
|
- locales := cldr.Locales()
|
|
|
- for _, loc := range locales {
|
|
|
-
|
|
|
- ldml := cldr.RawLDML(loc)
|
|
|
- if ldml.Numbers == nil {
|
|
|
- continue
|
|
|
- }
|
|
|
- var number i18n.Number
|
|
|
-
|
|
|
- number.Currencies = make(i18n.CurrencyFormatValue)
|
|
|
+ // cardinalPlurals := map[string]
|
|
|
|
|
|
- if len(ldml.Numbers.Symbols) > 0 {
|
|
|
- symbol := ldml.Numbers.Symbols[0]
|
|
|
- if len(symbol.Decimal) > 0 {
|
|
|
- number.Symbols.Decimal = symbol.Decimal[0].Data()
|
|
|
- }
|
|
|
- if len(symbol.Group) > 0 {
|
|
|
- number.Symbols.Group = symbol.Group[0].Data()
|
|
|
- }
|
|
|
- if len(symbol.MinusSign) > 0 {
|
|
|
- number.Symbols.Negative = symbol.MinusSign[0].Data()
|
|
|
- }
|
|
|
- if len(symbol.PercentSign) > 0 {
|
|
|
- number.Symbols.Percent = symbol.PercentSign[0].Data()
|
|
|
- }
|
|
|
- if len(symbol.PerMille) > 0 {
|
|
|
- number.Symbols.PerMille = symbol.PerMille[0].Data()
|
|
|
- }
|
|
|
- }
|
|
|
- if len(ldml.Numbers.DecimalFormats) > 0 && len(ldml.Numbers.DecimalFormats[0].DecimalFormatLength) > 0 {
|
|
|
- number.Formats.Decimal = ldml.Numbers.DecimalFormats[0].DecimalFormatLength[0].DecimalFormat[0].Pattern[0].Data()
|
|
|
- }
|
|
|
+ // for _, p := range ldr.Supplemental().Plurals {
|
|
|
|
|
|
- if len(ldml.Numbers.CurrencyFormats) > 0 && len(ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength) > 0 {
|
|
|
+ // for _, pr := range p.PluralRules {
|
|
|
|
|
|
- number.Formats.Currency = ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat[0].Pattern[0].Data()
|
|
|
- number.Formats.CurrencyAccounting = number.Formats.Currency
|
|
|
+ // fmt.Println(pr.Locales)
|
|
|
|
|
|
- if len(ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat) > 1 {
|
|
|
- number.Formats.CurrencyAccounting = ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat[1].Pattern[0].Data()
|
|
|
- }
|
|
|
- }
|
|
|
- if len(ldml.Numbers.PercentFormats) > 0 && len(ldml.Numbers.PercentFormats[0].PercentFormatLength) > 0 {
|
|
|
- number.Formats.Percent = ldml.Numbers.PercentFormats[0].PercentFormatLength[0].PercentFormat[0].Pattern[0].Data()
|
|
|
- }
|
|
|
- if ldml.Numbers.Currencies != nil {
|
|
|
+ // for _, rule := range pr.PluralRule {
|
|
|
+ // fmt.Println(rule.Count, rule.Common.Data())
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
|
|
|
- for _, currency := range ldml.Numbers.Currencies.Currency {
|
|
|
+ for _, l := range cldr.Locales() {
|
|
|
|
|
|
- var c i18n.Currency
|
|
|
-
|
|
|
- c.Currency = currency.Type
|
|
|
-
|
|
|
- if len(currency.DisplayName) > 0 {
|
|
|
- c.DisplayName = currency.DisplayName[0].Data()
|
|
|
- }
|
|
|
+ // // work on uk for the moment
|
|
|
+ // if l != "uk" && l != "fil" && l != "gd" {
|
|
|
+ // if l != "gd" {
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ fmt.Println(l)
|
|
|
|
|
|
- if len(currency.Symbol) > 0 {
|
|
|
- c.Symbol = currency.Symbol[0].Data()
|
|
|
- }
|
|
|
+ baseLocale := strings.SplitN(l, "_", 2)[0]
|
|
|
|
|
|
- number.Currencies[c.Currency] = c
|
|
|
- }
|
|
|
+ trans := &translator{
|
|
|
+ Locale: l,
|
|
|
+ CardinalFunc: parseCardinalPluralRuleFunc(cldr, baseLocale),
|
|
|
}
|
|
|
- numbers[loc] = number
|
|
|
- locs[loc] = strings.ToLower(strings.Replace(loc, "_", "", -1))
|
|
|
|
|
|
- if ldml.Dates != nil && ldml.Dates.Calendars != nil {
|
|
|
+ // cardinalRules := getLocaleCardinalPluralRules(cldr, baseLocale)
|
|
|
+ // fmt.Println("CardinalRules:", l, cardinalRules)
|
|
|
+ // Start Plural Rules
|
|
|
|
|
|
- var calendar i18n.Calendar
|
|
|
- ldmlCar := ldml.Dates.Calendars.Calendar[0]
|
|
|
+ // for _, p := range cldr.Supplemental().Plurals {
|
|
|
|
|
|
- for _, cal := range ldml.Dates.Calendars.Calendar {
|
|
|
- if cal.Type == "gregorian" {
|
|
|
- ldmlCar = cal
|
|
|
- }
|
|
|
- }
|
|
|
+ // for _, pr := range p.PluralRules {
|
|
|
|
|
|
- if ldmlCar.DateFormats != nil {
|
|
|
- for _, datefmt := range ldmlCar.DateFormats.DateFormatLength {
|
|
|
- switch datefmt.Type {
|
|
|
- case "full":
|
|
|
- calendar.Formats.DateEra.BC.Full = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
- calendar.Formats.DateEra.AD.Full = calendar.Formats.DateEra.BC.Full
|
|
|
-
|
|
|
- case "long":
|
|
|
- calendar.Formats.DateEra.BC.Long = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
- calendar.Formats.DateEra.AD.Long = calendar.Formats.DateEra.BC.Long
|
|
|
-
|
|
|
- // Overrides TODO: Split Each Section into separate function, getting to big to maintain
|
|
|
-
|
|
|
- case "medium":
|
|
|
- calendar.Formats.DateEra.BC.Medium = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
- calendar.Formats.DateEra.AD.Medium = calendar.Formats.DateEra.BC.Medium
|
|
|
- case "short":
|
|
|
- calendar.Formats.DateEra.BC.Short = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
- calendar.Formats.DateEra.AD.Short = calendar.Formats.DateEra.BC.Short
|
|
|
- }
|
|
|
- }
|
|
|
+ // locales := strings.Split(pr.Locales, " ")
|
|
|
|
|
|
- // Overrides TODO: Split Each Section into separate function, getting to big to maintain
|
|
|
- switch loc {
|
|
|
- case "th":
|
|
|
- calendar.Formats.DateEra.BC.Full = "EEEEที่ d MMMM y GGGG"
|
|
|
- calendar.Formats.DateEra.AD.Full = "EEEEที่ d MMMM GGGG y"
|
|
|
- calendar.Formats.DateEra.BC.Long = "d MMMM y GG"
|
|
|
- calendar.Formats.DateEra.AD.Long = "d MMMM GG y"
|
|
|
- case "en":
|
|
|
- calendar.Formats.DateEra.BC.Full = "EEEE, MMMM d, y GGGG"
|
|
|
- calendar.Formats.DateEra.BC.Long = "MMMM d, y GG"
|
|
|
- // calendar.Formats.DateEra.BC.Medium = "MMM d, y GG"
|
|
|
- // calendar.Formats.DateEra.BC.Short = "M/d/yy G"
|
|
|
- }
|
|
|
- }
|
|
|
+ // for _, loc := range locales {
|
|
|
|
|
|
- if ldmlCar.TimeFormats != nil {
|
|
|
- for _, datefmt := range ldmlCar.TimeFormats.TimeFormatLength {
|
|
|
- switch datefmt.Type {
|
|
|
- case "full":
|
|
|
- calendar.Formats.Time.Full = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
- case "long":
|
|
|
- calendar.Formats.Time.Long = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
- case "medium":
|
|
|
- calendar.Formats.Time.Medium = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
- case "short":
|
|
|
- calendar.Formats.Time.Short = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if ldmlCar.DateTimeFormats != nil {
|
|
|
- for _, datefmt := range ldmlCar.DateTimeFormats.DateTimeFormatLength {
|
|
|
- switch datefmt.Type {
|
|
|
- case "full":
|
|
|
- calendar.Formats.DateTime.Full = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
- case "long":
|
|
|
- calendar.Formats.DateTime.Long = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
- case "medium":
|
|
|
- calendar.Formats.DateTime.Medium = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
- case "short":
|
|
|
- calendar.Formats.DateTime.Short = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if ldmlCar.Months != nil {
|
|
|
-
|
|
|
- for _, monthctx := range ldmlCar.Months.MonthContext {
|
|
|
-
|
|
|
- for _, months := range monthctx.MonthWidth {
|
|
|
-
|
|
|
- i18nMonth := make(i18n.CalendarMonthFormatNameValue)
|
|
|
-
|
|
|
- for _, m := range months.Month {
|
|
|
- switch m.Type {
|
|
|
- case "1":
|
|
|
- i18nMonth[time.January] = m.Data()
|
|
|
- case "2":
|
|
|
- i18nMonth[time.February] = m.Data()
|
|
|
- case "3":
|
|
|
- i18nMonth[time.March] = m.Data()
|
|
|
- case "4":
|
|
|
- i18nMonth[time.April] = m.Data()
|
|
|
- case "5":
|
|
|
- i18nMonth[time.May] = m.Data()
|
|
|
- case "6":
|
|
|
- i18nMonth[time.June] = m.Data()
|
|
|
- case "7":
|
|
|
- i18nMonth[time.July] = m.Data()
|
|
|
- case "8":
|
|
|
- i18nMonth[time.August] = m.Data()
|
|
|
- case "9":
|
|
|
- i18nMonth[time.September] = m.Data()
|
|
|
- case "10":
|
|
|
- i18nMonth[time.October] = m.Data()
|
|
|
- case "11":
|
|
|
- i18nMonth[time.November] = m.Data()
|
|
|
- case "12":
|
|
|
- i18nMonth[time.December] = m.Data()
|
|
|
- }
|
|
|
- }
|
|
|
- switch months.Type {
|
|
|
- case "abbreviated":
|
|
|
- calendar.FormatNames.Months.Abbreviated = i18nMonth
|
|
|
- case "narrow":
|
|
|
- calendar.FormatNames.Months.Narrow = i18nMonth
|
|
|
- case "short":
|
|
|
- calendar.FormatNames.Months.Short = i18nMonth
|
|
|
- case "wide":
|
|
|
- calendar.FormatNames.Months.Wide = i18nMonth
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if ldmlCar.Days != nil {
|
|
|
- for _, dayctx := range ldmlCar.Days.DayContext {
|
|
|
-
|
|
|
- for _, days := range dayctx.DayWidth {
|
|
|
-
|
|
|
- i18nDay := make(i18n.CalendarDayFormatNameValue)
|
|
|
-
|
|
|
- for _, d := range days.Day {
|
|
|
-
|
|
|
- switch d.Type {
|
|
|
- case "sun":
|
|
|
- i18nDay[time.Sunday] = d.Data()
|
|
|
- case "mon":
|
|
|
- i18nDay[time.Monday] = d.Data()
|
|
|
- case "tue":
|
|
|
- i18nDay[time.Tuesday] = d.Data()
|
|
|
- case "wed":
|
|
|
- i18nDay[time.Wednesday] = d.Data()
|
|
|
- case "thu":
|
|
|
- i18nDay[time.Thursday] = d.Data()
|
|
|
- case "fri":
|
|
|
- i18nDay[time.Friday] = d.Data()
|
|
|
- case "sat":
|
|
|
- i18nDay[time.Saturday] = d.Data()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- switch days.Type {
|
|
|
- case "abbreviated":
|
|
|
- calendar.FormatNames.Days.Abbreviated = i18nDay
|
|
|
- case "narrow":
|
|
|
- calendar.FormatNames.Days.Narrow = i18nDay
|
|
|
- case "short":
|
|
|
- calendar.FormatNames.Days.Short = i18nDay
|
|
|
- case "wide":
|
|
|
- calendar.FormatNames.Days.Wide = i18nDay
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if ldmlCar.DayPeriods != nil {
|
|
|
-
|
|
|
- for _, ctx := range ldmlCar.DayPeriods.DayPeriodContext {
|
|
|
-
|
|
|
- for _, width := range ctx.DayPeriodWidth {
|
|
|
+ // if loc == baseLocale {
|
|
|
|
|
|
- // var i18nPeriod i18n.CalendarPeriodFormatNameValue
|
|
|
- i18nPeriod := make(i18n.CalendarPeriodFormatNameValue)
|
|
|
+ // // plural rule found
|
|
|
+ // fmt.Println("Locale Plural Rules Found:", loc, baseLocale, l)
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // // fmt.Println(pr.Locales)
|
|
|
|
|
|
- for _, d := range width.DayPeriod {
|
|
|
+ // // for _, rule := range pr.PluralRule {
|
|
|
+ // // fmt.Println(rule.Count, rule.Common.Data())
|
|
|
+ // // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
|
|
|
- if _, ok := i18nPeriod[d.Type]; !ok {
|
|
|
- i18nPeriod[d.Type] = d.Data()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- switch width.Type {
|
|
|
- case "abbreviated":
|
|
|
- calendar.FormatNames.Periods.Abbreviated = i18nPeriod
|
|
|
- case "narrow":
|
|
|
- calendar.FormatNames.Periods.Narrow = i18nPeriod
|
|
|
- case "short":
|
|
|
- calendar.FormatNames.Periods.Short = i18nPeriod
|
|
|
- case "wide":
|
|
|
- calendar.FormatNames.Periods.Wide = i18nPeriod
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // var empty i18n.CalendarPeriodFormatNameValue
|
|
|
- // if calendar.FormatNames.Periods.Abbreviated == empty {
|
|
|
- // calendar.FormatNames.Periods.Abbreviated = calendar.FormatNames.Periods.Wide
|
|
|
- // }
|
|
|
- }
|
|
|
-
|
|
|
- if ldmlCar.Eras != nil {
|
|
|
-
|
|
|
- var eras i18n.Eras
|
|
|
-
|
|
|
- if ldmlCar.Eras.EraNames != nil && len(ldmlCar.Eras.EraNames.Era) > 0 {
|
|
|
- eras.BC.Full = ldmlCar.Eras.EraNames.Era[0].Data()
|
|
|
- }
|
|
|
-
|
|
|
- if ldmlCar.Eras.EraAbbr != nil && len(ldmlCar.Eras.EraAbbr.Era) > 0 {
|
|
|
- eras.BC.Abbrev = ldmlCar.Eras.EraAbbr.Era[0].Data()
|
|
|
- }
|
|
|
-
|
|
|
- if ldmlCar.Eras.EraNarrow != nil && len(ldmlCar.Eras.EraNarrow.Era) > 0 {
|
|
|
- eras.BC.Narrow = ldmlCar.Eras.EraNarrow.Era[0].Data()
|
|
|
- }
|
|
|
+ // End Plural Rules
|
|
|
|
|
|
- if ldmlCar.Eras.EraNames != nil && len(ldmlCar.Eras.EraNames.Era) > 2 {
|
|
|
- eras.AD.Full = ldmlCar.Eras.EraNames.Era[2].Data()
|
|
|
- }
|
|
|
-
|
|
|
- if ldmlCar.Eras.EraAbbr != nil && len(ldmlCar.Eras.EraAbbr.Era) > 2 {
|
|
|
- eras.AD.Abbrev = ldmlCar.Eras.EraAbbr.Era[2].Data()
|
|
|
- }
|
|
|
-
|
|
|
- if ldmlCar.Eras.EraNarrow != nil && len(ldmlCar.Eras.EraNarrow.Era) > 2 {
|
|
|
- eras.AD.Narrow = ldmlCar.Eras.EraNarrow.Era[2].Data()
|
|
|
- }
|
|
|
-
|
|
|
- calendar.FormatNames.Eras = eras
|
|
|
- }
|
|
|
-
|
|
|
- calendars[loc] = calendar
|
|
|
+ if err = os.MkdirAll(fmt.Sprintf(locDir, l), 0777); err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- for locale := range locs {
|
|
|
-
|
|
|
- if !strings.Contains(locale, "_") {
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- calendar := calendars[locale]
|
|
|
-
|
|
|
- bString := strings.SplitN(locale, "_", 2)
|
|
|
- base := bString[0]
|
|
|
|
|
|
- baseCal := calendars[base]
|
|
|
+ filename := fmt.Sprintf(locFilename, l, l)
|
|
|
|
|
|
- // copy base calendar objects
|
|
|
-
|
|
|
- // Dates
|
|
|
- if calendar.Formats.DateEra.AD.Full == "" {
|
|
|
- calendar.Formats.DateEra.BC.Full = baseCal.Formats.DateEra.BC.Full
|
|
|
- calendar.Formats.DateEra.AD.Full = baseCal.Formats.DateEra.AD.Full
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.DateEra.AD.Long == "" {
|
|
|
- calendar.Formats.DateEra.BC.Long = baseCal.Formats.DateEra.BC.Long
|
|
|
- calendar.Formats.DateEra.AD.Long = baseCal.Formats.DateEra.AD.Long
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.DateEra.AD.Medium == "" {
|
|
|
- calendar.Formats.DateEra.BC.Medium = baseCal.Formats.DateEra.BC.Medium
|
|
|
- calendar.Formats.DateEra.AD.Medium = baseCal.Formats.DateEra.AD.Medium
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.DateEra.AD.Short == "" {
|
|
|
- calendar.Formats.DateEra.BC.Short = baseCal.Formats.DateEra.BC.Short
|
|
|
- calendar.Formats.DateEra.AD.Short = baseCal.Formats.DateEra.AD.Short
|
|
|
- }
|
|
|
-
|
|
|
- // times
|
|
|
- if calendar.Formats.Time.Full == "" {
|
|
|
- calendar.Formats.Time.Full = baseCal.Formats.Time.Full
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.Time.Long == "" {
|
|
|
- calendar.Formats.Time.Long = baseCal.Formats.Time.Long
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.Time.Medium == "" {
|
|
|
- calendar.Formats.Time.Medium = baseCal.Formats.Time.Medium
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.Time.Short == "" {
|
|
|
- calendar.Formats.Time.Short = baseCal.Formats.Time.Short
|
|
|
- }
|
|
|
-
|
|
|
- // date & times
|
|
|
- if calendar.Formats.DateTime.Full == "" {
|
|
|
- calendar.Formats.DateTime.Full = baseCal.Formats.DateTime.Full
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.DateTime.Long == "" {
|
|
|
- calendar.Formats.DateTime.Long = baseCal.Formats.DateTime.Long
|
|
|
- }
|
|
|
-
|
|
|
- if calendar.Formats.DateTime.Medium == "" {
|
|
|
- calendar.Formats.DateTime.Medium = baseCal.Formats.DateTime.Medium
|
|
|
+ output, err := os.Create(filename)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
}
|
|
|
+ defer output.Close()
|
|
|
|
|
|
- if calendar.Formats.DateTime.Short == "" {
|
|
|
- calendar.Formats.DateTime.Short = baseCal.Formats.DateTime.Short
|
|
|
+ if err := tmpl.ExecuteTemplate(output, "translator", trans); err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- // months
|
|
|
+ output.Close()
|
|
|
|
|
|
- if calendar.FormatNames.Months.Abbreviated == nil {
|
|
|
- calendar.FormatNames.Months.Abbreviated = make(i18n.CalendarMonthFormatNameValue)
|
|
|
+ // after file written run gofmt on file to ensure best formatting
|
|
|
+ cmd := exec.Command("gofmt", "-s", "-w", filename)
|
|
|
+ if err = cmd.Run(); err != nil {
|
|
|
+ log.Panic(err)
|
|
|
}
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- if calendar.FormatNames.Months.Narrow == nil {
|
|
|
- calendar.FormatNames.Months.Narrow = make(i18n.CalendarMonthFormatNameValue)
|
|
|
- }
|
|
|
+// TODO: cleanup function logic perhaps write a lexer... but it's working right now, and
|
|
|
+// I'm already farther down the rabbit hole than I'd like and so pulling the chute here.
|
|
|
+func parseCardinalPluralRuleFunc(current *cldr.CLDR, baseLocale string) (results string) {
|
|
|
+
|
|
|
+ var prCardinal *struct {
|
|
|
+ cldr.Common
|
|
|
+ Locales string "xml:\"locales,attr\""
|
|
|
+ PluralRule []*struct {
|
|
|
+ cldr.Common
|
|
|
+ Count string "xml:\"count,attr\""
|
|
|
+ } "xml:\"pluralRule\""
|
|
|
+ }
|
|
|
|
|
|
- if calendar.FormatNames.Months.Short == nil {
|
|
|
- calendar.FormatNames.Months.Short = make(i18n.CalendarMonthFormatNameValue)
|
|
|
- }
|
|
|
+ for _, p := range current.Supplemental().Plurals {
|
|
|
|
|
|
- if calendar.FormatNames.Months.Wide == nil {
|
|
|
- calendar.FormatNames.Months.Wide = make(i18n.CalendarMonthFormatNameValue)
|
|
|
- }
|
|
|
+ for _, pr := range p.PluralRules {
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Months.Abbreviated {
|
|
|
+ locs := strings.Split(pr.Locales, " ")
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Months.Abbreviated[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Months.Abbreviated[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ for _, loc := range locs {
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Months.Abbreviated[k] = v
|
|
|
+ if loc == baseLocale {
|
|
|
+ prCardinal = pr
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Months.Narrow {
|
|
|
+ // no plural rules for locale
|
|
|
+ if prCardinal == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Months.Narrow[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Months.Narrow[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ vals := make(map[string]struct{})
|
|
|
+ first := true
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Months.Narrow[k] = v
|
|
|
- }
|
|
|
- }
|
|
|
+ // pre parse for variables
|
|
|
+ for _, rule := range prCardinal.PluralRule {
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Months.Short {
|
|
|
+ data := strings.Replace(strings.Replace(strings.Replace(strings.TrimSpace(strings.SplitN(rule.Common.Data(), "@", 2)[0]), " = ", " == ", -1), " or ", " || ", -1), " and ", " && ", -1)
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Months.Short[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Months.Short[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ if len(data) == 0 {
|
|
|
+ if len(prCardinal.PluralRule) == 1 {
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Months.Short[k] = v
|
|
|
- }
|
|
|
- }
|
|
|
+ results = "return locales." + pluralStringToString(rule.Count) + ", nil"
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Months.Wide {
|
|
|
+ } else {
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Months.Wide[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Months.Wide[k] = v
|
|
|
- continue
|
|
|
+ results += "\n\nreturn locales." + pluralStringToString(rule.Count) + ", nil"
|
|
|
+ // results += "else {\nreturn locales." + locales.PluralStringToString(rule.Count) + ", nil\n}"
|
|
|
}
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Months.Wide[k] = v
|
|
|
- }
|
|
|
+ continue
|
|
|
}
|
|
|
|
|
|
- // days
|
|
|
-
|
|
|
- if calendar.FormatNames.Days.Abbreviated == nil {
|
|
|
- calendar.FormatNames.Days.Abbreviated = make(i18n.CalendarDayFormatNameValue)
|
|
|
+ if strings.Contains(data, "n") {
|
|
|
+ vals[prVarFuncs["n"]] = struct{}{}
|
|
|
}
|
|
|
|
|
|
- if calendar.FormatNames.Days.Narrow == nil {
|
|
|
- calendar.FormatNames.Days.Narrow = make(i18n.CalendarDayFormatNameValue)
|
|
|
+ if strings.Contains(data, "i") {
|
|
|
+ vals[prVarFuncs["i"]] = struct{}{}
|
|
|
}
|
|
|
|
|
|
- if calendar.FormatNames.Days.Short == nil {
|
|
|
- calendar.FormatNames.Days.Short = make(i18n.CalendarDayFormatNameValue)
|
|
|
+ if strings.Contains(data, "v") {
|
|
|
+ vals[prVarFuncs["v"]] = struct{}{}
|
|
|
}
|
|
|
|
|
|
- if calendar.FormatNames.Days.Wide == nil {
|
|
|
- calendar.FormatNames.Days.Wide = make(i18n.CalendarDayFormatNameValue)
|
|
|
+ if strings.Contains(data, "w") {
|
|
|
+ vals[prVarFuncs["w"]] = struct{}{}
|
|
|
}
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Days.Abbreviated {
|
|
|
-
|
|
|
- val, ok := calendar.FormatNames.Days.Abbreviated[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Days.Abbreviated[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Days.Abbreviated[k] = v
|
|
|
- }
|
|
|
+ if strings.Contains(data, "f") {
|
|
|
+ vals[prVarFuncs["f"]] = struct{}{}
|
|
|
}
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Days.Narrow {
|
|
|
-
|
|
|
- val, ok := calendar.FormatNames.Days.Narrow[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Days.Narrow[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Days.Narrow[k] = v
|
|
|
- }
|
|
|
+ if strings.Contains(data, "t") {
|
|
|
+ vals[prVarFuncs["t"]] = struct{}{}
|
|
|
}
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Days.Short {
|
|
|
-
|
|
|
- val, ok := calendar.FormatNames.Days.Short[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Days.Short[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ // fmt.Println(rule.Count, data)
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Days.Short[k] = v
|
|
|
- }
|
|
|
+ if first {
|
|
|
+ results += "if "
|
|
|
+ first = false
|
|
|
+ } else {
|
|
|
+ results += "else if "
|
|
|
}
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Days.Wide {
|
|
|
+ stmt := ""
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Days.Wide[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Days.Wide[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ // real work here
|
|
|
+ //
|
|
|
+ // split by 'or' then by 'and' allowing to better
|
|
|
+ // determine bracketing for formula
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Days.Wide[k] = v
|
|
|
- }
|
|
|
- }
|
|
|
+ ors := strings.Split(data, "||")
|
|
|
|
|
|
- // periods
|
|
|
- if calendar.FormatNames.Periods.Abbreviated == nil {
|
|
|
- calendar.FormatNames.Periods.Abbreviated = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
- }
|
|
|
+ for _, or := range ors {
|
|
|
|
|
|
- if calendar.FormatNames.Periods.Narrow == nil {
|
|
|
- calendar.FormatNames.Periods.Narrow = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
- }
|
|
|
+ stmt += "("
|
|
|
|
|
|
- if calendar.FormatNames.Periods.Short == nil {
|
|
|
- calendar.FormatNames.Periods.Short = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
- }
|
|
|
+ ands := strings.Split(strings.TrimSpace(or), "&&")
|
|
|
|
|
|
- if calendar.FormatNames.Periods.Wide == nil {
|
|
|
- calendar.FormatNames.Periods.Wide = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
- }
|
|
|
+ for _, and := range ands {
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Periods.Abbreviated {
|
|
|
+ inArg := false
|
|
|
+ pre := ""
|
|
|
+ lft := ""
|
|
|
+ preOperator := ""
|
|
|
+ args := strings.Split(strings.TrimSpace(and), " ")
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Periods.Abbreviated[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Periods.Abbreviated[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ for _, a := range args {
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Periods.Abbreviated[k] = v
|
|
|
- }
|
|
|
- }
|
|
|
+ if inArg {
|
|
|
+ // check to see if is a value range 2..9
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Periods.Narrow {
|
|
|
+ multiRange := strings.Count(a, "..") > 1
|
|
|
+ cargs := strings.Split(strings.TrimSpace(a), ",")
|
|
|
+ hasBracket := len(cargs) > 1
|
|
|
+ bracketAdded := false
|
|
|
+ lastWasRange := false
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Periods.Narrow[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Periods.Narrow[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Periods.Narrow[k] = v
|
|
|
- }
|
|
|
- }
|
|
|
+ for _, carg := range cargs {
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Periods.Short {
|
|
|
+ if rng := strings.Split(carg, ".."); len(rng) > 1 {
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Periods.Short[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Periods.Short[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ if multiRange {
|
|
|
+ pre += " ("
|
|
|
+ } else {
|
|
|
+ pre += " "
|
|
|
+ }
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Periods.Short[k] = v
|
|
|
- }
|
|
|
- }
|
|
|
+ switch preOperator {
|
|
|
+ case "==":
|
|
|
+ pre += lft + " >= " + rng[0] + " && " + lft + "<=" + rng[1]
|
|
|
+ case "!=":
|
|
|
+ pre += lft + " < " + rng[0] + " && " + lft + " > " + rng[1]
|
|
|
+ }
|
|
|
|
|
|
- for k, v := range baseCal.FormatNames.Periods.Wide {
|
|
|
+ if multiRange {
|
|
|
+ pre += ") || "
|
|
|
+ } else {
|
|
|
+ pre += " || "
|
|
|
+ }
|
|
|
|
|
|
- val, ok := calendar.FormatNames.Periods.Wide[k]
|
|
|
- if !ok {
|
|
|
- calendar.FormatNames.Periods.Wide[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ lastWasRange = true
|
|
|
+ continue
|
|
|
+ }
|
|
|
|
|
|
- if val == "" {
|
|
|
- calendar.FormatNames.Periods.Wide[k] = v
|
|
|
- }
|
|
|
- }
|
|
|
+ if lastWasRange {
|
|
|
+ pre = strings.TrimRight(pre, " || ") + " && "
|
|
|
+ }
|
|
|
|
|
|
- calendars[locale] = calendar
|
|
|
+ lastWasRange = false
|
|
|
|
|
|
- number := numbers[locale]
|
|
|
- baseNum := numbers[base]
|
|
|
+ if hasBracket && !bracketAdded {
|
|
|
+ pre += "("
|
|
|
+ bracketAdded = true
|
|
|
+ }
|
|
|
|
|
|
- // symbols
|
|
|
- if number.Symbols.Decimal == "" {
|
|
|
- number.Symbols.Decimal = baseNum.Symbols.Decimal
|
|
|
- }
|
|
|
+ // single comma separated values
|
|
|
+ switch preOperator {
|
|
|
+ case "==":
|
|
|
+ pre += " " + lft + preOperator + carg + " || "
|
|
|
+ case "!=":
|
|
|
+ pre += " " + lft + preOperator + carg + " && "
|
|
|
+ }
|
|
|
|
|
|
- if number.Symbols.Group == "" {
|
|
|
- number.Symbols.Group = baseNum.Symbols.Group
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- if number.Symbols.Negative == "" {
|
|
|
- number.Symbols.Negative = baseNum.Symbols.Negative
|
|
|
- }
|
|
|
+ pre = strings.TrimRight(pre, " || ")
|
|
|
+ pre = strings.TrimRight(pre, " && ")
|
|
|
+ pre = strings.TrimRight(pre, " || ")
|
|
|
|
|
|
- if number.Symbols.Percent == "" {
|
|
|
- number.Symbols.Percent = baseNum.Symbols.Percent
|
|
|
- }
|
|
|
+ if hasBracket && bracketAdded {
|
|
|
+ pre += ")"
|
|
|
+ }
|
|
|
|
|
|
- if number.Symbols.PerMille == "" {
|
|
|
- number.Symbols.PerMille = baseNum.Symbols.PerMille
|
|
|
- }
|
|
|
+ continue
|
|
|
+ }
|
|
|
|
|
|
- // formats
|
|
|
- if number.Formats.Decimal == "" {
|
|
|
- number.Formats.Decimal = baseNum.Formats.Decimal
|
|
|
- }
|
|
|
+ if strings.Contains(a, "=") || a == ">" || a == "<" {
|
|
|
+ inArg = true
|
|
|
+ preOperator = a
|
|
|
+ continue
|
|
|
+ }
|
|
|
|
|
|
- if number.Formats.Currency == "" {
|
|
|
- number.Formats.Currency = baseNum.Formats.Currency
|
|
|
- }
|
|
|
+ lft += a
|
|
|
+ }
|
|
|
|
|
|
- if number.Formats.CurrencyAccounting == "" {
|
|
|
- number.Formats.CurrencyAccounting = baseNum.Formats.CurrencyAccounting
|
|
|
- }
|
|
|
+ stmt += pre + " && "
|
|
|
+ }
|
|
|
|
|
|
- if number.Formats.Percent == "" {
|
|
|
- number.Formats.Percent = baseNum.Formats.Percent
|
|
|
+ stmt = strings.TrimRight(stmt, " && ") + ") || "
|
|
|
}
|
|
|
|
|
|
- // currency
|
|
|
- for k, v := range baseNum.Currencies {
|
|
|
+ stmt = strings.TrimRight(stmt, " || ")
|
|
|
|
|
|
- val, ok := number.Currencies[k]
|
|
|
- if !ok {
|
|
|
- // number.Currencies[k] = v
|
|
|
- continue
|
|
|
- }
|
|
|
+ results += stmt
|
|
|
|
|
|
- if val.Currency == "" {
|
|
|
- val.Currency = v.Currency
|
|
|
- }
|
|
|
+ results += " {\n"
|
|
|
|
|
|
- if val.DisplayName == "" {
|
|
|
- val.DisplayName = v.DisplayName
|
|
|
- }
|
|
|
+ // return plural rule here
|
|
|
+ results += "return locales." + pluralStringToString(rule.Count) + ", nil\n"
|
|
|
|
|
|
- if val.Symbol == "" {
|
|
|
- val.Symbol = v.Symbol
|
|
|
- }
|
|
|
+ results += "}"
|
|
|
+ }
|
|
|
|
|
|
- number.Currencies[k] = val
|
|
|
- }
|
|
|
+ pre := "\n"
|
|
|
|
|
|
- numbers[locale] = number
|
|
|
+ for k := range vals {
|
|
|
+ pre += k
|
|
|
}
|
|
|
|
|
|
- var wg sync.WaitGroup
|
|
|
- wg.Add(len(numbers))
|
|
|
- for locale, number := range numbers {
|
|
|
- go func(locale string, number i18n.Number) {
|
|
|
+ pre += "\n"
|
|
|
|
|
|
- localeLowercase := strings.ToLower(locale)
|
|
|
-
|
|
|
- defer func() { wg.Done() }()
|
|
|
- path := "../../resources/locales/" + locale
|
|
|
+ if len(results) == 0 {
|
|
|
+ results = "return locales.PluralRuleUnknown,nil"
|
|
|
+ }
|
|
|
|
|
|
- if _, err := os.Stat(path); err != nil {
|
|
|
- if err = os.MkdirAll(path, 0777); err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- }
|
|
|
+ results = pre + results
|
|
|
|
|
|
- path += "/"
|
|
|
+ return
|
|
|
+}
|
|
|
|
|
|
- mainFile, err := os.Create(path + "main.go")
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- defer mainFile.Close()
|
|
|
-
|
|
|
- calendar := calendars[locale]
|
|
|
-
|
|
|
- mainCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
- import "github.com/go-playground/universal-translator"
|
|
|
-
|
|
|
- var locale = &ut.Locale{
|
|
|
- Locale: %q,
|
|
|
- Number: ut.Number{
|
|
|
- Symbols: symbols,
|
|
|
- Formats: formats,
|
|
|
- Currencies: currencies,
|
|
|
- },
|
|
|
- Calendar: calendar,
|
|
|
- PluralRule: pluralRule,
|
|
|
- }
|
|
|
+func pluralStringToString(pr string) string {
|
|
|
+
|
|
|
+ pr = strings.TrimSpace(pr)
|
|
|
+
|
|
|
+ switch pr {
|
|
|
+ case "zero":
|
|
|
+ return "PluralRuleZero"
|
|
|
+ case "one":
|
|
|
+ return "PluralRuleOne"
|
|
|
+ case "two":
|
|
|
+ return "PluralRuleTwo"
|
|
|
+ case "few":
|
|
|
+ return "PluralRuleFew"
|
|
|
+ case "many":
|
|
|
+ return "PluralRuleMany"
|
|
|
+ case "other":
|
|
|
+ return "PluralRuleOther"
|
|
|
+ default:
|
|
|
+ return "PluralRuleUnknown"
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- func init() {
|
|
|
- ut.RegisterLocale(locale)
|
|
|
- }
|
|
|
- `, locale, locale)))
|
|
|
+// //plurals
|
|
|
+// rules := "data/rules"
|
|
|
+// plurals := map[string]*pluralInfo{}
|
|
|
+// basePlurals := map[string]string{}
|
|
|
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
+// err := filepath.Walk(rules, func(path string, info os.FileInfo, err error) error {
|
|
|
+
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+
|
|
|
+// if info.IsDir() {
|
|
|
+// return nil
|
|
|
+// }
|
|
|
+
|
|
|
+// in, err := ioutil.ReadFile(path)
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+
|
|
|
+// var out yaml.MapSlice
|
|
|
+// if err = yaml.Unmarshal(in, &out); err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+
|
|
|
+// var plural string
|
|
|
+// for _, item := range out {
|
|
|
+// if item.Key == "plural" {
|
|
|
+// plural = item.Value.(string)
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// locale := strings.Replace(info.Name(), filepath.Ext(info.Name()), "", 1)
|
|
|
+// locale = strings.ToLower(strings.Replace(locale, "-", "_", -1))
|
|
|
+
|
|
|
+// plurals[locale] = &pluralInfo{
|
|
|
+// path: path,
|
|
|
+// locale: locale,
|
|
|
+// plural: plural,
|
|
|
+// }
|
|
|
+
|
|
|
+// if plural == "" {
|
|
|
+// return nil
|
|
|
+// }
|
|
|
+
|
|
|
+// basePlurals[locale] = plural
|
|
|
+
|
|
|
+// return nil
|
|
|
+// })
|
|
|
+
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+
|
|
|
+// for _, p := range plurals {
|
|
|
+
|
|
|
+// if p.plural == "" {
|
|
|
+
|
|
|
+// var ok bool
|
|
|
+
|
|
|
+// fmt.Print("can't find plurals in ", p.path, " attempting to locate base language plural rules...")
|
|
|
+
|
|
|
+// base := strings.SplitN(p.locale, "_", 2)
|
|
|
+
|
|
|
+// p.plural, ok = basePlurals[base[0]]
|
|
|
+// if !ok {
|
|
|
+// fmt.Println("Not Found")
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// fmt.Println("Found")
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// cldr
|
|
|
+
|
|
|
+// var decoder cldr.Decoder
|
|
|
+// cldr, err := decoder.DecodePath("data/core")
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+
|
|
|
+// locs := map[string]string{}
|
|
|
+// numbers := map[string]i18n.Number{}
|
|
|
+// calendars := map[string]i18n.Calendar{}
|
|
|
+// locales := cldr.Locales()
|
|
|
+// for _, loc := range locales {
|
|
|
+
|
|
|
+// ldml := cldr.RawLDML(loc)
|
|
|
+// if ldml.Numbers == nil {
|
|
|
+// continue
|
|
|
+// }
|
|
|
+// var number i18n.Number
|
|
|
+
|
|
|
+// number.Currencies = make(i18n.CurrencyFormatValue)
|
|
|
+
|
|
|
+// if len(ldml.Numbers.Symbols) > 0 {
|
|
|
+// symbol := ldml.Numbers.Symbols[0]
|
|
|
+// if len(symbol.Decimal) > 0 {
|
|
|
+// number.Symbols.Decimal = symbol.Decimal[0].Data()
|
|
|
+// }
|
|
|
+// if len(symbol.Group) > 0 {
|
|
|
+// number.Symbols.Group = symbol.Group[0].Data()
|
|
|
+// }
|
|
|
+// if len(symbol.MinusSign) > 0 {
|
|
|
+// number.Symbols.Negative = symbol.MinusSign[0].Data()
|
|
|
+// }
|
|
|
+// if len(symbol.PercentSign) > 0 {
|
|
|
+// number.Symbols.Percent = symbol.PercentSign[0].Data()
|
|
|
+// }
|
|
|
+// if len(symbol.PerMille) > 0 {
|
|
|
+// number.Symbols.PerMille = symbol.PerMille[0].Data()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// if len(ldml.Numbers.DecimalFormats) > 0 && len(ldml.Numbers.DecimalFormats[0].DecimalFormatLength) > 0 {
|
|
|
+// number.Formats.Decimal = ldml.Numbers.DecimalFormats[0].DecimalFormatLength[0].DecimalFormat[0].Pattern[0].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// if len(ldml.Numbers.CurrencyFormats) > 0 && len(ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength) > 0 {
|
|
|
+
|
|
|
+// number.Formats.Currency = ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat[0].Pattern[0].Data()
|
|
|
+// number.Formats.CurrencyAccounting = number.Formats.Currency
|
|
|
+
|
|
|
+// if len(ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat) > 1 {
|
|
|
+// number.Formats.CurrencyAccounting = ldml.Numbers.CurrencyFormats[0].CurrencyFormatLength[0].CurrencyFormat[1].Pattern[0].Data()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// if len(ldml.Numbers.PercentFormats) > 0 && len(ldml.Numbers.PercentFormats[0].PercentFormatLength) > 0 {
|
|
|
+// number.Formats.Percent = ldml.Numbers.PercentFormats[0].PercentFormatLength[0].PercentFormat[0].Pattern[0].Data()
|
|
|
+// }
|
|
|
+// if ldml.Numbers.Currencies != nil {
|
|
|
+
|
|
|
+// for _, currency := range ldml.Numbers.Currencies.Currency {
|
|
|
+
|
|
|
+// var c i18n.Currency
|
|
|
+
|
|
|
+// c.Currency = currency.Type
|
|
|
+
|
|
|
+// if len(currency.DisplayName) > 0 {
|
|
|
+// c.DisplayName = currency.DisplayName[0].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// if len(currency.Symbol) > 0 {
|
|
|
+// c.Symbol = currency.Symbol[0].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// number.Currencies[c.Currency] = c
|
|
|
+// }
|
|
|
+// }
|
|
|
+// numbers[loc] = number
|
|
|
+// locs[loc] = strings.ToLower(strings.Replace(loc, "_", "", -1))
|
|
|
+
|
|
|
+// if ldml.Dates != nil && ldml.Dates.Calendars != nil {
|
|
|
+
|
|
|
+// var calendar i18n.Calendar
|
|
|
+// ldmlCar := ldml.Dates.Calendars.Calendar[0]
|
|
|
+
|
|
|
+// for _, cal := range ldml.Dates.Calendars.Calendar {
|
|
|
+// if cal.Type == "gregorian" {
|
|
|
+// ldmlCar = cal
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.DateFormats != nil {
|
|
|
+// for _, datefmt := range ldmlCar.DateFormats.DateFormatLength {
|
|
|
+// switch datefmt.Type {
|
|
|
+// case "full":
|
|
|
+// calendar.Formats.DateEra.BC.Full = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
+// calendar.Formats.DateEra.AD.Full = calendar.Formats.DateEra.BC.Full
|
|
|
+
|
|
|
+// case "long":
|
|
|
+// calendar.Formats.DateEra.BC.Long = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
+// calendar.Formats.DateEra.AD.Long = calendar.Formats.DateEra.BC.Long
|
|
|
+
|
|
|
+// // Overrides TODO: Split Each Section into separate function, getting to big to maintain
|
|
|
+
|
|
|
+// case "medium":
|
|
|
+// calendar.Formats.DateEra.BC.Medium = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
+// calendar.Formats.DateEra.AD.Medium = calendar.Formats.DateEra.BC.Medium
|
|
|
+// case "short":
|
|
|
+// calendar.Formats.DateEra.BC.Short = datefmt.DateFormat[0].Pattern[0].Data()
|
|
|
+// calendar.Formats.DateEra.AD.Short = calendar.Formats.DateEra.BC.Short
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // Overrides TODO: Split Each Section into separate function, getting to big to maintain
|
|
|
+// switch loc {
|
|
|
+// case "th":
|
|
|
+// calendar.Formats.DateEra.BC.Full = "EEEEที่ d MMMM y GGGG"
|
|
|
+// calendar.Formats.DateEra.AD.Full = "EEEEที่ d MMMM GGGG y"
|
|
|
+// calendar.Formats.DateEra.BC.Long = "d MMMM y GG"
|
|
|
+// calendar.Formats.DateEra.AD.Long = "d MMMM GG y"
|
|
|
+// case "en":
|
|
|
+// calendar.Formats.DateEra.BC.Full = "EEEE, MMMM d, y GGGG"
|
|
|
+// calendar.Formats.DateEra.BC.Long = "MMMM d, y GG"
|
|
|
+// // calendar.Formats.DateEra.BC.Medium = "MMM d, y GG"
|
|
|
+// // calendar.Formats.DateEra.BC.Short = "M/d/yy G"
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.TimeFormats != nil {
|
|
|
+// for _, datefmt := range ldmlCar.TimeFormats.TimeFormatLength {
|
|
|
+// switch datefmt.Type {
|
|
|
+// case "full":
|
|
|
+// calendar.Formats.Time.Full = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
+// case "long":
|
|
|
+// calendar.Formats.Time.Long = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
+// case "medium":
|
|
|
+// calendar.Formats.Time.Medium = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
+// case "short":
|
|
|
+// calendar.Formats.Time.Short = datefmt.TimeFormat[0].Pattern[0].Data()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// if ldmlCar.DateTimeFormats != nil {
|
|
|
+// for _, datefmt := range ldmlCar.DateTimeFormats.DateTimeFormatLength {
|
|
|
+// switch datefmt.Type {
|
|
|
+// case "full":
|
|
|
+// calendar.Formats.DateTime.Full = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
+// case "long":
|
|
|
+// calendar.Formats.DateTime.Long = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
+// case "medium":
|
|
|
+// calendar.Formats.DateTime.Medium = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
+// case "short":
|
|
|
+// calendar.Formats.DateTime.Short = datefmt.DateTimeFormat[0].Pattern[0].Data()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// if ldmlCar.Months != nil {
|
|
|
+
|
|
|
+// for _, monthctx := range ldmlCar.Months.MonthContext {
|
|
|
+
|
|
|
+// for _, months := range monthctx.MonthWidth {
|
|
|
+
|
|
|
+// i18nMonth := make(i18n.CalendarMonthFormatNameValue)
|
|
|
+
|
|
|
+// for _, m := range months.Month {
|
|
|
+// switch m.Type {
|
|
|
+// case "1":
|
|
|
+// i18nMonth[time.January] = m.Data()
|
|
|
+// case "2":
|
|
|
+// i18nMonth[time.February] = m.Data()
|
|
|
+// case "3":
|
|
|
+// i18nMonth[time.March] = m.Data()
|
|
|
+// case "4":
|
|
|
+// i18nMonth[time.April] = m.Data()
|
|
|
+// case "5":
|
|
|
+// i18nMonth[time.May] = m.Data()
|
|
|
+// case "6":
|
|
|
+// i18nMonth[time.June] = m.Data()
|
|
|
+// case "7":
|
|
|
+// i18nMonth[time.July] = m.Data()
|
|
|
+// case "8":
|
|
|
+// i18nMonth[time.August] = m.Data()
|
|
|
+// case "9":
|
|
|
+// i18nMonth[time.September] = m.Data()
|
|
|
+// case "10":
|
|
|
+// i18nMonth[time.October] = m.Data()
|
|
|
+// case "11":
|
|
|
+// i18nMonth[time.November] = m.Data()
|
|
|
+// case "12":
|
|
|
+// i18nMonth[time.December] = m.Data()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// switch months.Type {
|
|
|
+// case "abbreviated":
|
|
|
+// calendar.FormatNames.Months.Abbreviated = i18nMonth
|
|
|
+// case "narrow":
|
|
|
+// calendar.FormatNames.Months.Narrow = i18nMonth
|
|
|
+// case "short":
|
|
|
+// calendar.FormatNames.Months.Short = i18nMonth
|
|
|
+// case "wide":
|
|
|
+// calendar.FormatNames.Months.Wide = i18nMonth
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// if ldmlCar.Days != nil {
|
|
|
+// for _, dayctx := range ldmlCar.Days.DayContext {
|
|
|
+
|
|
|
+// for _, days := range dayctx.DayWidth {
|
|
|
+
|
|
|
+// i18nDay := make(i18n.CalendarDayFormatNameValue)
|
|
|
+
|
|
|
+// for _, d := range days.Day {
|
|
|
+
|
|
|
+// switch d.Type {
|
|
|
+// case "sun":
|
|
|
+// i18nDay[time.Sunday] = d.Data()
|
|
|
+// case "mon":
|
|
|
+// i18nDay[time.Monday] = d.Data()
|
|
|
+// case "tue":
|
|
|
+// i18nDay[time.Tuesday] = d.Data()
|
|
|
+// case "wed":
|
|
|
+// i18nDay[time.Wednesday] = d.Data()
|
|
|
+// case "thu":
|
|
|
+// i18nDay[time.Thursday] = d.Data()
|
|
|
+// case "fri":
|
|
|
+// i18nDay[time.Friday] = d.Data()
|
|
|
+// case "sat":
|
|
|
+// i18nDay[time.Saturday] = d.Data()
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// switch days.Type {
|
|
|
+// case "abbreviated":
|
|
|
+// calendar.FormatNames.Days.Abbreviated = i18nDay
|
|
|
+// case "narrow":
|
|
|
+// calendar.FormatNames.Days.Narrow = i18nDay
|
|
|
+// case "short":
|
|
|
+// calendar.FormatNames.Days.Short = i18nDay
|
|
|
+// case "wide":
|
|
|
+// calendar.FormatNames.Days.Wide = i18nDay
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.DayPeriods != nil {
|
|
|
+
|
|
|
+// for _, ctx := range ldmlCar.DayPeriods.DayPeriodContext {
|
|
|
+
|
|
|
+// for _, width := range ctx.DayPeriodWidth {
|
|
|
+
|
|
|
+// // var i18nPeriod i18n.CalendarPeriodFormatNameValue
|
|
|
+// i18nPeriod := make(i18n.CalendarPeriodFormatNameValue)
|
|
|
+
|
|
|
+// for _, d := range width.DayPeriod {
|
|
|
+
|
|
|
+// if _, ok := i18nPeriod[d.Type]; !ok {
|
|
|
+// i18nPeriod[d.Type] = d.Data()
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// switch width.Type {
|
|
|
+// case "abbreviated":
|
|
|
+// calendar.FormatNames.Periods.Abbreviated = i18nPeriod
|
|
|
+// case "narrow":
|
|
|
+// calendar.FormatNames.Periods.Narrow = i18nPeriod
|
|
|
+// case "short":
|
|
|
+// calendar.FormatNames.Periods.Short = i18nPeriod
|
|
|
+// case "wide":
|
|
|
+// calendar.FormatNames.Periods.Wide = i18nPeriod
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// // var empty i18n.CalendarPeriodFormatNameValue
|
|
|
+// // if calendar.FormatNames.Periods.Abbreviated == empty {
|
|
|
+// // calendar.FormatNames.Periods.Abbreviated = calendar.FormatNames.Periods.Wide
|
|
|
+// // }
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.Eras != nil {
|
|
|
+
|
|
|
+// var eras i18n.Eras
|
|
|
+
|
|
|
+// if ldmlCar.Eras.EraNames != nil && len(ldmlCar.Eras.EraNames.Era) > 0 {
|
|
|
+// eras.BC.Full = ldmlCar.Eras.EraNames.Era[0].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.Eras.EraAbbr != nil && len(ldmlCar.Eras.EraAbbr.Era) > 0 {
|
|
|
+// eras.BC.Abbrev = ldmlCar.Eras.EraAbbr.Era[0].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.Eras.EraNarrow != nil && len(ldmlCar.Eras.EraNarrow.Era) > 0 {
|
|
|
+// eras.BC.Narrow = ldmlCar.Eras.EraNarrow.Era[0].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.Eras.EraNames != nil && len(ldmlCar.Eras.EraNames.Era) > 2 {
|
|
|
+// eras.AD.Full = ldmlCar.Eras.EraNames.Era[2].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.Eras.EraAbbr != nil && len(ldmlCar.Eras.EraAbbr.Era) > 2 {
|
|
|
+// eras.AD.Abbrev = ldmlCar.Eras.EraAbbr.Era[2].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// if ldmlCar.Eras.EraNarrow != nil && len(ldmlCar.Eras.EraNarrow.Era) > 2 {
|
|
|
+// eras.AD.Narrow = ldmlCar.Eras.EraNarrow.Era[2].Data()
|
|
|
+// }
|
|
|
+
|
|
|
+// calendar.FormatNames.Eras = eras
|
|
|
+// }
|
|
|
+
|
|
|
+// calendars[loc] = calendar
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for locale := range locs {
|
|
|
+
|
|
|
+// if !strings.Contains(locale, "_") {
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// calendar := calendars[locale]
|
|
|
+
|
|
|
+// bString := strings.SplitN(locale, "_", 2)
|
|
|
+// base := bString[0]
|
|
|
+
|
|
|
+// baseCal := calendars[base]
|
|
|
+
|
|
|
+// // copy base calendar objects
|
|
|
+
|
|
|
+// // Dates
|
|
|
+// if calendar.Formats.DateEra.AD.Full == "" {
|
|
|
+// calendar.Formats.DateEra.BC.Full = baseCal.Formats.DateEra.BC.Full
|
|
|
+// calendar.Formats.DateEra.AD.Full = baseCal.Formats.DateEra.AD.Full
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.Formats.DateEra.AD.Long == "" {
|
|
|
+// calendar.Formats.DateEra.BC.Long = baseCal.Formats.DateEra.BC.Long
|
|
|
+// calendar.Formats.DateEra.AD.Long = baseCal.Formats.DateEra.AD.Long
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.Formats.DateEra.AD.Medium == "" {
|
|
|
+// calendar.Formats.DateEra.BC.Medium = baseCal.Formats.DateEra.BC.Medium
|
|
|
+// calendar.Formats.DateEra.AD.Medium = baseCal.Formats.DateEra.AD.Medium
|
|
|
+// }
|
|
|
|
|
|
- fmt.Fprintf(mainFile, "%s", mainCodes)
|
|
|
+// if calendar.Formats.DateEra.AD.Short == "" {
|
|
|
+// calendar.Formats.DateEra.BC.Short = baseCal.Formats.DateEra.BC.Short
|
|
|
+// calendar.Formats.DateEra.AD.Short = baseCal.Formats.DateEra.AD.Short
|
|
|
+// }
|
|
|
+
|
|
|
+// // times
|
|
|
+// if calendar.Formats.Time.Full == "" {
|
|
|
+// calendar.Formats.Time.Full = baseCal.Formats.Time.Full
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.Formats.Time.Long == "" {
|
|
|
+// calendar.Formats.Time.Long = baseCal.Formats.Time.Long
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.Formats.Time.Medium == "" {
|
|
|
+// calendar.Formats.Time.Medium = baseCal.Formats.Time.Medium
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.Formats.Time.Short == "" {
|
|
|
+// calendar.Formats.Time.Short = baseCal.Formats.Time.Short
|
|
|
+// }
|
|
|
+
|
|
|
+// // date & times
|
|
|
+// if calendar.Formats.DateTime.Full == "" {
|
|
|
+// calendar.Formats.DateTime.Full = baseCal.Formats.DateTime.Full
|
|
|
+// }
|
|
|
|
|
|
- numberFile, err := os.Create(path + "number.go")
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- defer numberFile.Close()
|
|
|
-
|
|
|
- numberCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
- import "github.com/go-playground/universal-translator"
|
|
|
- var (
|
|
|
- symbols = %#v
|
|
|
- formats = %#v
|
|
|
- )
|
|
|
- `, locale, number.Symbols, number.Formats)))
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- fmt.Fprintf(numberFile, "%s", numberCodes)
|
|
|
+// if calendar.Formats.DateTime.Long == "" {
|
|
|
+// calendar.Formats.DateTime.Long = baseCal.Formats.DateTime.Long
|
|
|
+// }
|
|
|
|
|
|
- currencyFile, err := os.Create(path + "currency.go")
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- defer currencyFile.Close()
|
|
|
-
|
|
|
- currencyCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
- import "github.com/go-playground/universal-translator"
|
|
|
- var currencies = %# v
|
|
|
- `, locale, number.Currencies)))
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- fmt.Fprintf(currencyFile, "%s", currencyCodes)
|
|
|
+// if calendar.Formats.DateTime.Medium == "" {
|
|
|
+// calendar.Formats.DateTime.Medium = baseCal.Formats.DateTime.Medium
|
|
|
+// }
|
|
|
|
|
|
- calendarFile, err := os.Create(path + "calendar.go")
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- defer calendarFile.Close()
|
|
|
-
|
|
|
- calendarCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
- import "github.com/go-playground/universal-translator"
|
|
|
- var calendar = %#v
|
|
|
- `, locale, calendar)))
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- fmt.Fprintf(calendarFile, "%s", calendarCodes)
|
|
|
+// if calendar.Formats.DateTime.Short == "" {
|
|
|
+// calendar.Formats.DateTime.Short = baseCal.Formats.DateTime.Short
|
|
|
+// }
|
|
|
|
|
|
- var ok bool
|
|
|
- pluralCode := "1"
|
|
|
+// // months
|
|
|
|
|
|
- pInfo, ok := plurals[localeLowercase]
|
|
|
- if ok && pInfo.plural != "" {
|
|
|
- pluralCode = pInfo.plural
|
|
|
- }
|
|
|
+// if calendar.FormatNames.Months.Abbreviated == nil {
|
|
|
+// calendar.FormatNames.Months.Abbreviated = make(i18n.CalendarMonthFormatNameValue)
|
|
|
+// }
|
|
|
|
|
|
- pluralFile, err := os.Create(path + "plural.go")
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- defer pluralFile.Close()
|
|
|
+// if calendar.FormatNames.Months.Narrow == nil {
|
|
|
+// calendar.FormatNames.Months.Narrow = make(i18n.CalendarMonthFormatNameValue)
|
|
|
+// }
|
|
|
|
|
|
- pluralCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
+// if calendar.FormatNames.Months.Short == nil {
|
|
|
+// calendar.FormatNames.Months.Short = make(i18n.CalendarMonthFormatNameValue)
|
|
|
+// }
|
|
|
|
|
|
- var pluralRule = %q
|
|
|
- `, locale, pluralCode)))
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- fmt.Fprintf(pluralFile, "%s", pluralCodes)
|
|
|
- }(locale, number)
|
|
|
- }
|
|
|
+// if calendar.FormatNames.Months.Wide == nil {
|
|
|
+// calendar.FormatNames.Months.Wide = make(i18n.CalendarMonthFormatNameValue)
|
|
|
+// }
|
|
|
|
|
|
- wg.Wait()
|
|
|
+// for k, v := range baseCal.FormatNames.Months.Abbreviated {
|
|
|
|
|
|
- localesFile, err := os.Create("../../resources/locales/all.go")
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- defer localesFile.Close()
|
|
|
+// val, ok := calendar.FormatNames.Months.Abbreviated[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Months.Abbreviated[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
|
|
|
- tmpl, err := template.New("").Parse(`package locales
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Months.Abbreviated[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
|
|
|
- // Imports for all locales
|
|
|
- import (
|
|
|
- {{range $locale, $_ := .}}// Locale "{{$locale}}" import that automatically registers itslef with the universal-translator package
|
|
|
- _ "github.com/go-playground/universal-translator/resources/locales/{{$locale}}"
|
|
|
- {{end}})
|
|
|
- `)
|
|
|
+// for k, v := range baseCal.FormatNames.Months.Narrow {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Months.Narrow[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Months.Narrow[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Months.Narrow[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Months.Short {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Months.Short[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Months.Short[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Months.Short[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Months.Wide {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Months.Wide[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Months.Wide[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Months.Wide[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // days
|
|
|
+
|
|
|
+// if calendar.FormatNames.Days.Abbreviated == nil {
|
|
|
+// calendar.FormatNames.Days.Abbreviated = make(i18n.CalendarDayFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.FormatNames.Days.Narrow == nil {
|
|
|
+// calendar.FormatNames.Days.Narrow = make(i18n.CalendarDayFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.FormatNames.Days.Short == nil {
|
|
|
+// calendar.FormatNames.Days.Short = make(i18n.CalendarDayFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.FormatNames.Days.Wide == nil {
|
|
|
+// calendar.FormatNames.Days.Wide = make(i18n.CalendarDayFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Days.Abbreviated {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Days.Abbreviated[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Days.Abbreviated[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Days.Abbreviated[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Days.Narrow {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Days.Narrow[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Days.Narrow[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Days.Narrow[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Days.Short {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Days.Short[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Days.Short[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Days.Short[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Days.Wide {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Days.Wide[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Days.Wide[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Days.Wide[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// // periods
|
|
|
+// if calendar.FormatNames.Periods.Abbreviated == nil {
|
|
|
+// calendar.FormatNames.Periods.Abbreviated = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.FormatNames.Periods.Narrow == nil {
|
|
|
+// calendar.FormatNames.Periods.Narrow = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.FormatNames.Periods.Short == nil {
|
|
|
+// calendar.FormatNames.Periods.Short = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// if calendar.FormatNames.Periods.Wide == nil {
|
|
|
+// calendar.FormatNames.Periods.Wide = make(i18n.CalendarPeriodFormatNameValue)
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Periods.Abbreviated {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Periods.Abbreviated[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Periods.Abbreviated[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Periods.Abbreviated[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Periods.Narrow {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Periods.Narrow[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Periods.Narrow[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Periods.Narrow[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Periods.Short {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Periods.Short[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Periods.Short[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Periods.Short[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// for k, v := range baseCal.FormatNames.Periods.Wide {
|
|
|
+
|
|
|
+// val, ok := calendar.FormatNames.Periods.Wide[k]
|
|
|
+// if !ok {
|
|
|
+// calendar.FormatNames.Periods.Wide[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val == "" {
|
|
|
+// calendar.FormatNames.Periods.Wide[k] = v
|
|
|
+// }
|
|
|
+// }
|
|
|
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- var buf bytes.Buffer
|
|
|
- if err := tmpl.Execute(&buf, locs); err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- allCodes, err := format.Source(buf.Bytes())
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
- _, err = localesFile.Write(allCodes)
|
|
|
- if err != nil {
|
|
|
- panic(err)
|
|
|
- }
|
|
|
-}
|
|
|
+// calendars[locale] = calendar
|
|
|
+
|
|
|
+// number := numbers[locale]
|
|
|
+// baseNum := numbers[base]
|
|
|
+
|
|
|
+// // symbols
|
|
|
+// if number.Symbols.Decimal == "" {
|
|
|
+// number.Symbols.Decimal = baseNum.Symbols.Decimal
|
|
|
+// }
|
|
|
+
|
|
|
+// if number.Symbols.Group == "" {
|
|
|
+// number.Symbols.Group = baseNum.Symbols.Group
|
|
|
+// }
|
|
|
+
|
|
|
+// if number.Symbols.Negative == "" {
|
|
|
+// number.Symbols.Negative = baseNum.Symbols.Negative
|
|
|
+// }
|
|
|
+
|
|
|
+// if number.Symbols.Percent == "" {
|
|
|
+// number.Symbols.Percent = baseNum.Symbols.Percent
|
|
|
+// }
|
|
|
+
|
|
|
+// if number.Symbols.PerMille == "" {
|
|
|
+// number.Symbols.PerMille = baseNum.Symbols.PerMille
|
|
|
+// }
|
|
|
+
|
|
|
+// // formats
|
|
|
+// if number.Formats.Decimal == "" {
|
|
|
+// number.Formats.Decimal = baseNum.Formats.Decimal
|
|
|
+// }
|
|
|
+
|
|
|
+// if number.Formats.Currency == "" {
|
|
|
+// number.Formats.Currency = baseNum.Formats.Currency
|
|
|
+// }
|
|
|
+
|
|
|
+// if number.Formats.CurrencyAccounting == "" {
|
|
|
+// number.Formats.CurrencyAccounting = baseNum.Formats.CurrencyAccounting
|
|
|
+// }
|
|
|
+
|
|
|
+// if number.Formats.Percent == "" {
|
|
|
+// number.Formats.Percent = baseNum.Formats.Percent
|
|
|
+// }
|
|
|
+
|
|
|
+// // currency
|
|
|
+// for k, v := range baseNum.Currencies {
|
|
|
+
|
|
|
+// val, ok := number.Currencies[k]
|
|
|
+// if !ok {
|
|
|
+// // number.Currencies[k] = v
|
|
|
+// continue
|
|
|
+// }
|
|
|
+
|
|
|
+// if val.Currency == "" {
|
|
|
+// val.Currency = v.Currency
|
|
|
+// }
|
|
|
+
|
|
|
+// if val.DisplayName == "" {
|
|
|
+// val.DisplayName = v.DisplayName
|
|
|
+// }
|
|
|
+
|
|
|
+// if val.Symbol == "" {
|
|
|
+// val.Symbol = v.Symbol
|
|
|
+// }
|
|
|
+
|
|
|
+// number.Currencies[k] = val
|
|
|
+// }
|
|
|
+
|
|
|
+// numbers[locale] = number
|
|
|
+// }
|
|
|
+
|
|
|
+// var wg sync.WaitGroup
|
|
|
+// wg.Add(len(numbers))
|
|
|
+// for locale, number := range numbers {
|
|
|
+// go func(locale string, number i18n.Number) {
|
|
|
+
|
|
|
+// localeLowercase := strings.ToLower(locale)
|
|
|
+
|
|
|
+// defer func() { wg.Done() }()
|
|
|
+// path := "../../resources/locales/" + locale
|
|
|
+
|
|
|
+// if _, err := os.Stat(path); err != nil {
|
|
|
+// if err = os.MkdirAll(path, 0777); err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// path += "/"
|
|
|
+
|
|
|
+// mainFile, err := os.Create(path + "main.go")
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// defer mainFile.Close()
|
|
|
+
|
|
|
+// calendar := calendars[locale]
|
|
|
+
|
|
|
+// mainCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
+// import "github.com/go-playground/universal-translator"
|
|
|
+
|
|
|
+// var locale = &ut.Locale{
|
|
|
+// Locale: %q,
|
|
|
+// Number: ut.Number{
|
|
|
+// Symbols: symbols,
|
|
|
+// Formats: formats,
|
|
|
+// Currencies: currencies,
|
|
|
+// },
|
|
|
+// Calendar: calendar,
|
|
|
+// PluralRule: pluralRule,
|
|
|
+// }
|
|
|
+
|
|
|
+// func init() {
|
|
|
+// ut.RegisterLocale(locale)
|
|
|
+// }
|
|
|
+// `, locale, locale)))
|
|
|
+
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+
|
|
|
+// fmt.Fprintf(mainFile, "%s", mainCodes)
|
|
|
+
|
|
|
+// numberFile, err := os.Create(path + "number.go")
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// defer numberFile.Close()
|
|
|
+
|
|
|
+// numberCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
+// import "github.com/go-playground/universal-translator"
|
|
|
+// var (
|
|
|
+// symbols = %#v
|
|
|
+// formats = %#v
|
|
|
+// )
|
|
|
+// `, locale, number.Symbols, number.Formats)))
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// fmt.Fprintf(numberFile, "%s", numberCodes)
|
|
|
+
|
|
|
+// currencyFile, err := os.Create(path + "currency.go")
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// defer currencyFile.Close()
|
|
|
+
|
|
|
+// currencyCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
+// import "github.com/go-playground/universal-translator"
|
|
|
+// var currencies = %# v
|
|
|
+// `, locale, number.Currencies)))
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// fmt.Fprintf(currencyFile, "%s", currencyCodes)
|
|
|
+
|
|
|
+// calendarFile, err := os.Create(path + "calendar.go")
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// defer calendarFile.Close()
|
|
|
+
|
|
|
+// calendarCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
+// import "github.com/go-playground/universal-translator"
|
|
|
+// var calendar = %#v
|
|
|
+// `, locale, calendar)))
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// fmt.Fprintf(calendarFile, "%s", calendarCodes)
|
|
|
+
|
|
|
+// var ok bool
|
|
|
+// pluralCode := "1"
|
|
|
+
|
|
|
+// pInfo, ok := plurals[localeLowercase]
|
|
|
+// if ok && pInfo.plural != "" {
|
|
|
+// pluralCode = pInfo.plural
|
|
|
+// }
|
|
|
+
|
|
|
+// pluralFile, err := os.Create(path + "plural.go")
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// defer pluralFile.Close()
|
|
|
+
|
|
|
+// pluralCodes, err := format.Source([]byte(fmt.Sprintf(`package %s
|
|
|
+
|
|
|
+// var pluralRule = %q
|
|
|
+// `, locale, pluralCode)))
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// fmt.Fprintf(pluralFile, "%s", pluralCodes)
|
|
|
+// }(locale, number)
|
|
|
+// }
|
|
|
+
|
|
|
+// wg.Wait()
|
|
|
+
|
|
|
+// localesFile, err := os.Create("../../resources/locales/all.go")
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// defer localesFile.Close()
|
|
|
+
|
|
|
+// tmpl, err := template.New("").Parse(`package locales
|
|
|
+
|
|
|
+// // Imports for all locales
|
|
|
+// import (
|
|
|
+// {{range $locale, $_ := .}}// Locale "{{$locale}}" import that automatically registers itslef with the universal-translator package
|
|
|
+// _ "github.com/go-playground/universal-translator/resources/locales/{{$locale}}"
|
|
|
+// {{end}})
|
|
|
+// `)
|
|
|
+
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// var buf bytes.Buffer
|
|
|
+// if err := tmpl.Execute(&buf, locs); err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// allCodes, err := format.Source(buf.Bytes())
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// _, err = localesFile.Write(allCodes)
|
|
|
+// if err != nil {
|
|
|
+// panic(err)
|
|
|
+// }
|
|
|
+// }
|