...
1
2
3
4
5 package plural
6
7 import (
8 "strings"
9 )
10
11
12 func Formula(lang string) func(n int) int {
13 if idx := index(lang); idx != -1 {
14 return formulaTable[fmtForms(FormsTable[idx].Value)]
15 }
16 if idx := index("??"); idx != -1 {
17 return formulaTable[fmtForms(FormsTable[idx].Value)]
18 }
19 return func(n int) int {
20 return n
21 }
22 }
23
24 func index(lang string) int {
25 for i := 0; i < len(FormsTable); i++ {
26 if strings.HasPrefix(lang, FormsTable[i].Lang) {
27 return i
28 }
29 }
30 return -1
31 }
32
33 func fmtForms(forms string) string {
34 forms = strings.TrimSpace(forms)
35 forms = strings.Replace(forms, " ", "", -1)
36 return forms
37 }
38
39 var formulaTable = map[string]func(n int) int{
40 fmtForms("nplurals=n; plural=n-1;"): func(n int) int {
41 if n > 0 {
42 return n - 1
43 }
44 return 0
45 },
46 fmtForms("nplurals=1; plural=0;"): func(n int) int {
47 return 0
48 },
49 fmtForms("nplurals=2; plural=(n != 1);"): func(n int) int {
50 if n <= 1 {
51 return 0
52 }
53 return 1
54 },
55 fmtForms("nplurals=2; plural=(n > 1);"): func(n int) int {
56 if n <= 1 {
57 return 0
58 }
59 return 1
60 },
61 fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"): func(n int) int {
62 if n%10 == 1 && n%100 != 11 {
63 return 0
64 }
65 if n != 0 {
66 return 1
67 }
68 return 2
69 },
70 fmtForms("nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;"): func(n int) int {
71 if n == 1 {
72 return 0
73 }
74 if n == 2 {
75 return 1
76 }
77 return 2
78 },
79 fmtForms("nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;"): func(n int) int {
80 if n == 1 {
81 return 0
82 }
83 if n == 0 || (n%100 > 0 && n%100 < 20) {
84 return 1
85 }
86 return 2
87 },
88 fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
89 if n%10 == 1 && n%100 != 11 {
90 return 0
91 }
92 if n%10 >= 2 && (n%100 < 10 || n%100 >= 20) {
93 return 1
94 }
95 return 2
96 },
97 fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
98 if n%10 == 1 && n%100 != 11 {
99 return 0
100 }
101 if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
102 return 1
103 }
104 return 2
105 },
106 fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
107 if n%10 == 1 && n%100 != 11 {
108 return 0
109 }
110 if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
111 return 1
112 }
113 return 2
114 },
115 fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
116 if n%10 == 1 && n%100 != 11 {
117 return 0
118 }
119 if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
120 return 1
121 }
122 return 2
123 },
124 fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
125 if n%10 == 1 && n%100 != 11 {
126 return 0
127 }
128 if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
129 return 1
130 }
131 return 2
132 },
133 fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
134 if n%10 == 1 && n%100 != 11 {
135 return 0
136 }
137 if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
138 return 1
139 }
140 return 2
141 },
142 fmtForms("nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"): func(n int) int {
143 if n == 1 {
144 return 0
145 }
146 if n >= 2 && n <= 4 {
147 return 1
148 }
149 return 2
150 },
151 fmtForms("nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"): func(n int) int {
152 if n == 1 {
153 return 0
154 }
155 if n >= 2 && n <= 4 {
156 return 1
157 }
158 return 2
159 },
160 fmtForms("nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
161 if n == 1 {
162 return 0
163 }
164 if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
165 return 1
166 }
167 return 2
168 },
169 fmtForms("nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"): func(n int) int {
170 if n%100 == 1 {
171 return 0
172 }
173 if n%100 == 2 {
174 return 1
175 }
176 if n%100 == 3 || n%100 == 4 {
177 return 2
178 }
179 return 3
180 },
181 }
182
View as plain text