formula.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // Copyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package plural
  5. import (
  6. "strings"
  7. )
  8. // Formula provides the language's standard plural formula.
  9. func Formula(lang string) func(n int) int {
  10. if idx := index(lang); idx != -1 {
  11. return formulaTable[fmtForms(FormsTable[idx].Value)]
  12. }
  13. if idx := index("??"); idx != -1 {
  14. return formulaTable[fmtForms(FormsTable[idx].Value)]
  15. }
  16. return func(n int) int {
  17. return n
  18. }
  19. }
  20. func index(lang string) int {
  21. for i := 0; i < len(FormsTable); i++ {
  22. if strings.HasPrefix(lang, FormsTable[i].Lang) {
  23. return i
  24. }
  25. }
  26. return -1
  27. }
  28. func fmtForms(forms string) string {
  29. forms = strings.TrimSpace(forms)
  30. forms = strings.Replace(forms, " ", "", -1)
  31. return forms
  32. }
  33. var formulaTable = map[string]func(n int) int{
  34. fmtForms("nplurals=n; plural=n-1;"): func(n int) int {
  35. if n > 0 {
  36. return n - 1
  37. }
  38. return 0
  39. },
  40. fmtForms("nplurals=1; plural=0;"): func(n int) int {
  41. return 0
  42. },
  43. fmtForms("nplurals=2; plural=(n != 1);"): func(n int) int {
  44. if n <= 1 {
  45. return 0
  46. }
  47. return 1
  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=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"): func(n int) int {
  56. if n%10 == 1 && n%100 != 11 {
  57. return 0
  58. }
  59. if n != 0 {
  60. return 1
  61. }
  62. return 2
  63. },
  64. fmtForms("nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;"): func(n int) int {
  65. if n == 1 {
  66. return 0
  67. }
  68. if n == 2 {
  69. return 1
  70. }
  71. return 2
  72. },
  73. fmtForms("nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;"): func(n int) int {
  74. if n == 1 {
  75. return 0
  76. }
  77. if n == 0 || (n%100 > 0 && n%100 < 20) {
  78. return 1
  79. }
  80. return 2
  81. },
  82. 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 {
  83. if n%10 == 1 && n%100 != 11 {
  84. return 0
  85. }
  86. if n%10 >= 2 && (n%100 < 10 || n%100 >= 20) {
  87. return 1
  88. }
  89. return 2
  90. },
  91. 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 {
  92. if n%10 == 1 && n%100 != 11 {
  93. return 0
  94. }
  95. if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
  96. return 1
  97. }
  98. return 2
  99. },
  100. 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 {
  101. if n%10 == 1 && n%100 != 11 {
  102. return 0
  103. }
  104. if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
  105. return 1
  106. }
  107. return 2
  108. },
  109. 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 {
  110. if n%10 == 1 && n%100 != 11 {
  111. return 0
  112. }
  113. if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
  114. return 1
  115. }
  116. return 2
  117. },
  118. 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 {
  119. if n%10 == 1 && n%100 != 11 {
  120. return 0
  121. }
  122. if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
  123. return 1
  124. }
  125. return 2
  126. },
  127. 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 {
  128. if n%10 == 1 && n%100 != 11 {
  129. return 0
  130. }
  131. if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
  132. return 1
  133. }
  134. return 2
  135. },
  136. fmtForms("nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"): func(n int) int {
  137. if n == 1 {
  138. return 0
  139. }
  140. if n >= 2 && n <= 4 {
  141. return 1
  142. }
  143. return 2
  144. },
  145. fmtForms("nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"): func(n int) int {
  146. if n == 1 {
  147. return 0
  148. }
  149. if n >= 2 && n <= 4 {
  150. return 1
  151. }
  152. return 2
  153. },
  154. 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 {
  155. if n == 1 {
  156. return 0
  157. }
  158. if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
  159. return 1
  160. }
  161. return 2
  162. },
  163. fmtForms("nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"): func(n int) int {
  164. if n%100 == 1 {
  165. return 0
  166. }
  167. if n%100 == 2 {
  168. return 1
  169. }
  170. if n%100 == 3 || n%100 == 4 {
  171. return 2
  172. }
  173. return 3
  174. },
  175. }