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
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/generate_resources.go')
-rw-r--r--cmd/generate_resources.go90
1 files changed, 90 insertions, 0 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) {