Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/locales.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorjoeybloggs <Dean.Karn@gmail.com>2016-08-11 05:25:55 +0300
committerjoeybloggs <Dean.Karn@gmail.com>2016-08-11 05:25:55 +0300
commitdf0d272ef2250baaad947ff65501398623365e61 (patch)
tree67905e5f9735420445a174eab98d3a42a4b3be43 /cmd
parentf81dd14d3cd97e875a6241cf395dae384457c455 (diff)
add range plural rules + expose Ordinal + Cardinal functions
Diffstat (limited to 'cmd')
-rw-r--r--cmd/generate_resources.go90
-rw-r--r--cmd/translator.tmpl13
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