diff options
author | joeybloggs <Dean.Karn@gmail.com> | 2016-08-11 05:25:55 +0300 |
---|---|---|
committer | joeybloggs <Dean.Karn@gmail.com> | 2016-08-11 05:25:55 +0300 |
commit | df0d272ef2250baaad947ff65501398623365e61 (patch) | |
tree | 67905e5f9735420445a174eab98d3a42a4b3be43 /cmd | |
parent | f81dd14d3cd97e875a6241cf395dae384457c455 (diff) |
add range plural rules + expose Ordinal + Cardinal functions
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/generate_resources.go | 90 | ||||
-rw-r--r-- | cmd/translator.tmpl | 13 |
2 files changed, 99 insertions, 4 deletions
diff --git a/cmd/generate_resources.go b/cmd/generate_resources.go index 38182b8f..14bbd36d 100644 --- a/cmd/generate_resources.go +++ b/cmd/generate_resources.go @@ -51,6 +51,7 @@ type translator struct { CardinalFunc string PluralsOrdinal string OrdinalFunc string + RangeFunc string Decimal string Group string Minus string @@ -161,6 +162,10 @@ func postProcess(cldr *cldr.CLDR) { //ordinal plural rules trans.OrdinalFunc, trans.PluralsOrdinal = parseOrdinalPluralRuleFunc(cldr, trans.BaseLocale) + // if trans.Locale == "en" { + trans.RangeFunc = parseRangePluralRuleFunc(cldr, trans.BaseLocale) + // } + // ignore base locales if trans.BaseLocale == trans.Locale { found = false @@ -488,6 +493,91 @@ func (a ByRank) Len() int { return len(a) } func (a ByRank) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a ByRank) Less(i, j int) bool { return a[i].Rank < a[j].Rank } +// TODO: refine generated code a bit, some combinations end up with same plural rule, +// could check all at once; but it works and that's step 1 complete +func parseRangePluralRuleFunc(current *cldr.CLDR, baseLocale string) (results string) { + + var pluralRange *struct { + cldr.Common + Locales string `xml:"locales,attr"` + PluralRange []*struct { + cldr.Common + Start string `xml:"start,attr"` + End string `xml:"end,attr"` + Result string `xml:"result,attr"` + } `xml:"pluralRange"` + } + + for _, pr := range current.Supplemental().Plurals[1].PluralRanges { + + locs := strings.Split(pr.Locales, " ") + + for _, loc := range locs { + + if loc == baseLocale { + pluralRange = pr + } + } + } + + // no range plural rules for locale + if pluralRange == nil { + results = "return locales.PluralRuleUnknown" + return + } + + mp := make(map[string]struct{}) + + // pre-process if all the same + for _, rule := range pluralRange.PluralRange { + mp[rule.Result] = struct{}{} + } + + if len(mp) == 1 { + results += "return locales." + pluralStringToString(pluralRange.PluralRange[0].Result) + return + } + + multiple := len(pluralRange.PluralRange) > 1 + + if multiple { + results += "start := " + baseLocale + ".CardinalPluralRule(num1, v1)\n" + results += "end := " + baseLocale + ".CardinalPluralRule(num2, v2)\n\n" + } + + first := true + + // pre parse for variables + for i, rule := range pluralRange.PluralRange { + + if i == len(pluralRange.PluralRange)-1 { + + if multiple { + results += "\n\n" + } + results += "return locales." + pluralStringToString(rule.Result) + continue + } + + if first { + results += "if" + first = false + } else { + results += "else if" + } + + results += " start == locales." + pluralStringToString(rule.Start) + " && end == locales." + pluralStringToString(rule.End) + " {\n return locales." + pluralStringToString(rule.Result) + "\n} " + + } + + if multiple { + results = "\n" + results + "\n" + } + + return + +} + // 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 parseOrdinalPluralRuleFunc(current *cldr.CLDR, baseLocale string) (results string, plurals string) { diff --git a/cmd/translator.tmpl b/cmd/translator.tmpl index 15729144..699e4673 100644 --- a/cmd/translator.tmpl +++ b/cmd/translator.tmpl @@ -49,14 +49,19 @@ func({{ .BaseLocale }} *{{ .Locale }}) PluralsOrdinal() []locales.PluralRule { return {{ .BaseLocale }}.pluralsOrdinal } -// cardinalPluralRule returns the cardinal PluralRule given 'num' and digits/precision of 'v' for '{{ .Locale }}' -func({{ .BaseLocale }} *{{ .Locale }}) cardinalPluralRule(num float64, v uint64) locales.PluralRule { +// CardinalPluralRule returns the cardinal PluralRule given 'num' and digits/precision of 'v' for '{{ .Locale }}' +func({{ .BaseLocale }} *{{ .Locale }}) CardinalPluralRule(num float64, v uint64) locales.PluralRule { {{ .CardinalFunc }} } -// ordinalPluralRule returns the ordinal PluralRule given 'num' and digits/precision of 'v' for '{{ .Locale }}' -func({{ .BaseLocale }} *{{ .Locale }}) ordinalPluralRule(num float64, v uint64) locales.PluralRule { +// OrdinalPluralRule returns the ordinal PluralRule given 'num' and digits/precision of 'v' for '{{ .Locale }}' +func({{ .BaseLocale }} *{{ .Locale }}) OrdinalPluralRule(num float64, v uint64) locales.PluralRule { {{ .OrdinalFunc }} } +// RangePluralRule returns the ordinal PluralRule given 'num1', 'num2' and digits/precision of 'v1' and 'v2' for '{{ .Locale }}' +func({{ .BaseLocale }} *{{ .Locale }}) RangePluralRule(num1 float64, v1 uint64,num2 float64, v2 uint64) locales.PluralRule { + {{ .RangeFunc }} +} + {{ end }}
\ No newline at end of file |