rails-i18n 0.1.0 → 5.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (297) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +439 -0
  3. data/MIT-LICENSE.txt +1 -1
  4. data/README.md +104 -48
  5. data/lib/rails-i18n.rb +1 -4
  6. data/lib/rails_i18n.rb +2 -0
  7. data/lib/rails_i18n/common_pluralizations/east_slavic.rb +42 -0
  8. data/lib/rails_i18n/common_pluralizations/one_other.rb +19 -0
  9. data/lib/rails_i18n/common_pluralizations/one_two_other.rb +28 -0
  10. data/lib/rails_i18n/common_pluralizations/one_upto_two_other.rb +19 -0
  11. data/lib/rails_i18n/common_pluralizations/one_with_zero_other.rb +20 -0
  12. data/lib/rails_i18n/common_pluralizations/other.rb +17 -0
  13. data/lib/rails_i18n/common_pluralizations/romanian.rb +28 -0
  14. data/lib/rails_i18n/common_pluralizations/west_slavic.rb +27 -0
  15. data/lib/rails_i18n/railtie.rb +33 -0
  16. data/lib/rails_i18n/unicode.rb +1 -0
  17. data/rails/locale/af.yml +213 -0
  18. data/rails/locale/ar.yml +256 -204
  19. data/rails/locale/az.yml +203 -0
  20. data/rails/locale/be.yml +269 -0
  21. data/rails/locale/bg.yml +176 -302
  22. data/rails/locale/bn.yml +176 -0
  23. data/rails/locale/bs.yml +232 -141
  24. data/rails/locale/ca.yml +176 -230
  25. data/rails/locale/cs.yml +218 -0
  26. data/rails/locale/cy.yml +222 -197
  27. data/rails/locale/da.yml +183 -211
  28. data/rails/locale/de-AT.yml +191 -166
  29. data/rails/locale/de-CH.yml +190 -165
  30. data/rails/locale/de-DE.yml +219 -0
  31. data/rails/locale/de.yml +190 -201
  32. data/rails/locale/el-CY.yml +202 -0
  33. data/rails/locale/el.yml +178 -149
  34. data/rails/locale/en-AU.yml +193 -198
  35. data/rails/locale/en-CA.yml +215 -0
  36. data/rails/locale/en-CY.yml +215 -0
  37. data/rails/locale/en-GB.yml +192 -197
  38. data/rails/locale/en-IE.yml +215 -0
  39. data/rails/locale/en-IN.yml +215 -0
  40. data/rails/locale/en-NZ.yml +215 -0
  41. data/rails/locale/en-US.yml +193 -200
  42. data/rails/locale/en-ZA.yml +215 -0
  43. data/rails/locale/en.yml +215 -0
  44. data/rails/locale/eo.yml +165 -189
  45. data/rails/locale/es-419.yml +219 -0
  46. data/rails/locale/es-AR.yml +190 -190
  47. data/rails/locale/es-CL.yml +195 -200
  48. data/rails/locale/es-CO.yml +189 -190
  49. data/rails/locale/es-CR.yml +219 -0
  50. data/rails/locale/es-EC.yml +219 -0
  51. data/rails/locale/es-ES.yml +219 -0
  52. data/rails/locale/es-MX.yml +189 -197
  53. data/rails/locale/es-NI.yml +219 -0
  54. data/rails/locale/es-PA.yml +219 -0
  55. data/rails/locale/es-PE.yml +200 -151
  56. data/rails/locale/es-US.yml +219 -0
  57. data/rails/locale/es-VE.yml +219 -0
  58. data/rails/locale/es.yml +198 -204
  59. data/rails/locale/et.yml +183 -236
  60. data/rails/locale/eu.yml +187 -201
  61. data/rails/locale/fa.yml +183 -199
  62. data/rails/locale/fi.yml +188 -202
  63. data/rails/locale/fr-CA.yml +185 -195
  64. data/rails/locale/fr-CH.yml +185 -192
  65. data/rails/locale/fr-FR.yml +217 -0
  66. data/rails/locale/fr.yml +184 -189
  67. data/rails/locale/gl.yml +172 -0
  68. data/rails/locale/he.yml +176 -205
  69. data/rails/locale/hi-IN.yml +172 -197
  70. data/rails/locale/hi.yml +172 -197
  71. data/rails/locale/hr.yml +224 -143
  72. data/rails/locale/hu.yml +173 -192
  73. data/rails/locale/id.yml +193 -168
  74. data/rails/locale/is.yml +192 -206
  75. data/rails/locale/it-CH.yml +202 -0
  76. data/rails/locale/it.yml +192 -215
  77. data/rails/locale/ja.yml +184 -205
  78. data/rails/locale/ka.yml +211 -0
  79. data/rails/locale/km.yml +167 -0
  80. data/rails/locale/kn.yml +172 -198
  81. data/rails/locale/ko.yml +182 -205
  82. data/rails/locale/lb.yml +209 -0
  83. data/rails/locale/lo.yml +221 -227
  84. data/rails/locale/lt.yml +204 -167
  85. data/rails/locale/lv.yml +199 -187
  86. data/rails/locale/mk.yml +184 -140
  87. data/rails/locale/ml.yml +210 -0
  88. data/rails/locale/mn.yml +180 -177
  89. data/rails/locale/mr-IN.yml +207 -0
  90. data/rails/locale/ms.yml +202 -0
  91. data/rails/locale/nb.yml +184 -189
  92. data/rails/locale/ne.yml +205 -0
  93. data/rails/locale/nl.yml +190 -203
  94. data/rails/locale/nn.yml +186 -117
  95. data/rails/locale/oc.yml +212 -0
  96. data/rails/locale/or.yml +196 -0
  97. data/rails/locale/pa.yml +208 -0
  98. data/rails/locale/pl.yml +217 -210
  99. data/rails/locale/pt-BR.yml +200 -216
  100. data/rails/locale/pt.yml +216 -0
  101. data/rails/locale/rm.yml +194 -147
  102. data/rails/locale/ro.yml +185 -187
  103. data/rails/locale/ru.yml +244 -351
  104. data/rails/locale/sk.yml +210 -235
  105. data/rails/locale/sl.yml +198 -222
  106. data/rails/locale/sq.yml +208 -0
  107. data/rails/locale/sr.yml +224 -141
  108. data/rails/locale/sv-SE.yml +191 -257
  109. data/rails/locale/sv.yml +207 -0
  110. data/rails/locale/sw.yml +174 -202
  111. data/rails/locale/ta.yml +208 -0
  112. data/rails/locale/te.yml +215 -0
  113. data/rails/locale/th.yml +170 -0
  114. data/rails/locale/tl.yml +202 -0
  115. data/rails/locale/tr.yml +189 -157
  116. data/rails/locale/tt.yml +218 -0
  117. data/rails/locale/ug.yml +207 -0
  118. data/rails/locale/uk.yml +245 -330
  119. data/rails/locale/ur.yml +209 -0
  120. data/rails/locale/uz.yml +254 -0
  121. data/rails/locale/vi.yml +187 -226
  122. data/rails/locale/wo.yml +208 -0
  123. data/rails/locale/zh-CN.yml +154 -223
  124. data/rails/locale/zh-HK.yml +213 -0
  125. data/rails/locale/zh-TW.yml +180 -217
  126. data/rails/locale/zh-YUE.yml +213 -0
  127. data/rails/pluralization/ak.rb +3 -0
  128. data/rails/pluralization/am.rb +3 -0
  129. data/rails/pluralization/ar.rb +32 -0
  130. data/rails/pluralization/az.rb +3 -0
  131. data/rails/pluralization/be.rb +3 -0
  132. data/rails/pluralization/bg.rb +3 -0
  133. data/rails/pluralization/bh.rb +3 -0
  134. data/rails/pluralization/bm.rb +3 -0
  135. data/rails/pluralization/bn.rb +3 -0
  136. data/rails/pluralization/bo.rb +3 -0
  137. data/rails/pluralization/br.rb +31 -0
  138. data/rails/pluralization/bs.rb +3 -0
  139. data/rails/pluralization/by.rb +3 -0
  140. data/rails/pluralization/ca.rb +3 -0
  141. data/rails/pluralization/cs.rb +3 -0
  142. data/rails/pluralization/cy.rb +24 -0
  143. data/rails/pluralization/da.rb +3 -0
  144. data/rails/pluralization/de-AT.rb +3 -0
  145. data/rails/pluralization/de-CH.rb +3 -0
  146. data/rails/pluralization/de-DE.rb +3 -0
  147. data/rails/pluralization/de.rb +3 -0
  148. data/rails/pluralization/dz.rb +3 -0
  149. data/rails/pluralization/el.rb +3 -0
  150. data/rails/pluralization/en-AU.rb +3 -0
  151. data/rails/pluralization/en-CA.rb +3 -0
  152. data/rails/pluralization/en-GB.rb +3 -0
  153. data/rails/pluralization/en-IN.rb +3 -0
  154. data/rails/pluralization/en-NZ.rb +3 -0
  155. data/rails/pluralization/en.rb +3 -0
  156. data/rails/pluralization/eo.rb +3 -0
  157. data/rails/pluralization/es-419.rb +3 -0
  158. data/rails/pluralization/es-AR.rb +3 -0
  159. data/rails/pluralization/es-CL.rb +3 -0
  160. data/rails/pluralization/es-CO.rb +3 -0
  161. data/rails/pluralization/es-CR.rb +3 -0
  162. data/rails/pluralization/es-EC.rb +3 -0
  163. data/rails/pluralization/es-ES.rb +3 -0
  164. data/rails/pluralization/es-MX.rb +3 -0
  165. data/rails/pluralization/es-NI.rb +3 -0
  166. data/rails/pluralization/es-PA.rb +3 -0
  167. data/rails/pluralization/es-PE.rb +3 -0
  168. data/rails/pluralization/es-US.rb +3 -0
  169. data/rails/pluralization/es-VE.rb +3 -0
  170. data/rails/pluralization/es.rb +3 -0
  171. data/rails/pluralization/et.rb +3 -0
  172. data/rails/pluralization/eu.rb +3 -0
  173. data/rails/pluralization/fa.rb +3 -0
  174. data/rails/pluralization/ff.rb +3 -0
  175. data/rails/pluralization/fi.rb +3 -0
  176. data/rails/pluralization/fr-CA.rb +3 -0
  177. data/rails/pluralization/fr-CH.rb +3 -0
  178. data/rails/pluralization/fr-FR.rb +3 -0
  179. data/rails/pluralization/fr.rb +3 -0
  180. data/rails/pluralization/ga.rb +27 -0
  181. data/rails/pluralization/gd.rb +25 -0
  182. data/rails/pluralization/gl.rb +3 -0
  183. data/rails/pluralization/guw.rb +3 -0
  184. data/rails/pluralization/gv.rb +22 -0
  185. data/rails/pluralization/he.rb +3 -0
  186. data/rails/pluralization/hi-IN.rb +3 -0
  187. data/rails/pluralization/hi.rb +3 -0
  188. data/rails/pluralization/hr.rb +3 -0
  189. data/rails/pluralization/hsb.rb +28 -0
  190. data/rails/pluralization/hu.rb +3 -0
  191. data/rails/pluralization/id.rb +3 -0
  192. data/rails/pluralization/ig.rb +3 -0
  193. data/rails/pluralization/ii.rb +3 -0
  194. data/rails/pluralization/is.rb +3 -0
  195. data/rails/pluralization/it-CH.rb +3 -0
  196. data/rails/pluralization/it.rb +3 -0
  197. data/rails/pluralization/iu.rb +3 -0
  198. data/rails/pluralization/ja.rb +3 -0
  199. data/rails/pluralization/jv.rb +3 -0
  200. data/rails/pluralization/ka.rb +3 -0
  201. data/rails/pluralization/kab.rb +3 -0
  202. data/rails/pluralization/kde.rb +3 -0
  203. data/rails/pluralization/kea.rb +3 -0
  204. data/rails/pluralization/km.rb +3 -0
  205. data/rails/pluralization/kn.rb +3 -0
  206. data/rails/pluralization/ko.rb +3 -0
  207. data/rails/pluralization/ksh.rb +23 -0
  208. data/rails/pluralization/kw.rb +3 -0
  209. data/rails/pluralization/lag.rb +24 -0
  210. data/rails/pluralization/ln.rb +3 -0
  211. data/rails/pluralization/lo.rb +3 -0
  212. data/rails/pluralization/lt.rb +27 -0
  213. data/rails/pluralization/lv.rb +22 -0
  214. data/rails/pluralization/mg.rb +3 -0
  215. data/rails/pluralization/mk.rb +22 -0
  216. data/rails/pluralization/ml.rb +3 -0
  217. data/rails/pluralization/mn.rb +3 -0
  218. data/rails/pluralization/mo.rb +3 -0
  219. data/rails/pluralization/mr-IN.rb +3 -0
  220. data/rails/pluralization/ms.rb +3 -0
  221. data/rails/pluralization/mt.rb +28 -0
  222. data/rails/pluralization/my.rb +3 -0
  223. data/rails/pluralization/naq.rb +3 -0
  224. data/rails/pluralization/nb.rb +3 -0
  225. data/rails/pluralization/ne.rb +3 -0
  226. data/rails/pluralization/nl.rb +3 -0
  227. data/rails/pluralization/nn.rb +3 -0
  228. data/rails/pluralization/nso.rb +3 -0
  229. data/rails/pluralization/oc.rb +3 -0
  230. data/rails/pluralization/or.rb +3 -0
  231. data/rails/pluralization/pa.rb +3 -0
  232. data/rails/pluralization/pl.rb +29 -0
  233. data/rails/pluralization/pt.rb +3 -0
  234. data/rails/pluralization/ro.rb +3 -0
  235. data/rails/pluralization/root.rb +3 -0
  236. data/rails/pluralization/ru.rb +3 -0
  237. data/rails/pluralization/sah.rb +3 -0
  238. data/rails/pluralization/se.rb +3 -0
  239. data/rails/pluralization/ses.rb +3 -0
  240. data/rails/pluralization/sg.rb +3 -0
  241. data/rails/pluralization/sh.rb +3 -0
  242. data/rails/pluralization/shi.rb +3 -0
  243. data/rails/pluralization/sk.rb +3 -0
  244. data/rails/pluralization/sl.rb +28 -0
  245. data/rails/pluralization/sma.rb +3 -0
  246. data/rails/pluralization/smi.rb +3 -0
  247. data/rails/pluralization/smj.rb +3 -0
  248. data/rails/pluralization/smn.rb +3 -0
  249. data/rails/pluralization/sms.rb +3 -0
  250. data/rails/pluralization/sr.rb +3 -0
  251. data/rails/pluralization/sv-SE.rb +3 -0
  252. data/rails/pluralization/sv.rb +3 -0
  253. data/rails/pluralization/sw.rb +3 -0
  254. data/rails/pluralization/th.rb +3 -0
  255. data/rails/pluralization/ti.rb +3 -0
  256. data/rails/pluralization/tl.rb +3 -0
  257. data/rails/pluralization/to.rb +3 -0
  258. data/rails/pluralization/tr.rb +3 -0
  259. data/rails/pluralization/tzm.rb +21 -0
  260. data/rails/pluralization/uk.rb +3 -0
  261. data/rails/pluralization/ur.rb +3 -0
  262. data/rails/pluralization/vi.rb +3 -0
  263. data/rails/pluralization/wa.rb +3 -0
  264. data/rails/pluralization/wo.rb +3 -0
  265. data/rails/pluralization/yo.rb +3 -0
  266. data/rails/pluralization/zh-CN.rb +3 -0
  267. data/rails/pluralization/zh-HK.rb +3 -0
  268. data/rails/pluralization/zh-TW.rb +3 -0
  269. data/rails/pluralization/zh-YUE.rb +3 -0
  270. data/rails/pluralization/zh.rb +3 -0
  271. data/rails/transliteration/az.yml +24 -0
  272. data/rails/transliteration/bg.yml +64 -0
  273. data/rails/transliteration/ca.yml +28 -0
  274. data/rails/transliteration/de.yml +12 -0
  275. data/rails/transliteration/el.yml +104 -0
  276. data/rails/transliteration/es.yml +18 -0
  277. data/rails/transliteration/fa.yml +47 -0
  278. data/rails/transliteration/fr.yml +36 -0
  279. data/rails/transliteration/hu.yml +22 -0
  280. data/rails/transliteration/oc.yml +28 -0
  281. data/rails/transliteration/pl.yml +22 -0
  282. data/rails/transliteration/pt.yml +28 -0
  283. data/rails/transliteration/ro.yml +14 -0
  284. data/rails/transliteration/ru.rb +93 -0
  285. data/rails/transliteration/uk.rb +129 -0
  286. data/rails/transliteration/vi.yml +138 -0
  287. metadata +376 -118
  288. data/rails/locale/bn-IN.yml +0 -223
  289. data/rails/locale/cs.rb +0 -229
  290. data/rails/locale/dsb.yml +0 -225
  291. data/rails/locale/fur.yml +0 -184
  292. data/rails/locale/gl-ES.yml +0 -236
  293. data/rails/locale/gsw-CH.yml +0 -222
  294. data/rails/locale/hsb.yml +0 -233
  295. data/rails/locale/pt-PT.yml +0 -230
  296. data/rails/locale/sr-Latn.yml +0 -159
  297. data/rails/locale/th.rb +0 -199
@@ -0,0 +1,18 @@
1
+ es:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ á: "a"
6
+ é: "e"
7
+ í: "i"
8
+ ó: "o"
9
+ ú: "u"
10
+ ü: "u"
11
+ ñ: "n"
12
+ Á: "A"
13
+ É: "E"
14
+ Í: "I"
15
+ Ó: "O"
16
+ Ú: "U"
17
+ Ü: "U"
18
+ Ñ: "N"
@@ -0,0 +1,47 @@
1
+ fa:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ 'آ': 'a'
6
+ 'ا': 'a'
7
+ 'ب': 'b'
8
+ 'پ': 'p'
9
+ 'ت': 't'
10
+ 'ث': 's'
11
+ 'ج': 'g'
12
+ 'چ': 'ch'
13
+ 'ح': 'h'
14
+ 'خ': 'kh'
15
+ 'د': 'd'
16
+ 'ذ': 'z'
17
+ 'ر': 'r'
18
+ 'ز': 'z'
19
+ 'ژ': 'j'
20
+ 'س': 's'
21
+ 'ش': 'sh'
22
+ 'ص': 's'
23
+ 'ض': 'z'
24
+ 'ط': 't'
25
+ 'ظ': 'z'
26
+ 'ع': 'a'
27
+ 'غ': 'q'
28
+ 'ف': 'f'
29
+ 'ق': 'q'
30
+ 'ک': 'k'
31
+ 'گ': 'gh'
32
+ 'ل': 'l'
33
+ 'م': 'm'
34
+ 'ن': 'n'
35
+ 'و': 'v'
36
+ 'ه': 'h'
37
+ 'ی': 'i'
38
+ '۰': '0'
39
+ '۱': '1'
40
+ '۲': '2'
41
+ '۳': '3'
42
+ '۴': '4'
43
+ '۵': '5'
44
+ '۶': '6'
45
+ '۷': '7'
46
+ '۸': '8'
47
+ '۹': '9'
@@ -0,0 +1,36 @@
1
+ fr:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ à: "a"
6
+ â: "a"
7
+ æ: "ae"
8
+ ç: "c"
9
+ é: "e"
10
+ è: "e"
11
+ ê: "e"
12
+ ë: "e"
13
+ î: "i"
14
+ ï: "i"
15
+ ô: "o"
16
+ œ: "oe"
17
+ ù: "u"
18
+ û: "u"
19
+ ü: "u"
20
+ ÿ: "y"
21
+ À: "A"
22
+ Â: "A"
23
+ Æ: "Ae"
24
+ Ç: "C"
25
+ É: "E"
26
+ È: "E"
27
+ Ê: "E"
28
+ Ë: "E"
29
+ Î: "I"
30
+ Ï: "I"
31
+ Ô: "O"
32
+ Œ: "Oe"
33
+ Ù: "U"
34
+ Û: "U"
35
+ Ü: "U"
36
+ Ÿ: "Y"
@@ -0,0 +1,22 @@
1
+ hu:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ á: "a"
6
+ é: "e"
7
+ í: "i"
8
+ ó: "o"
9
+ ö: "o"
10
+ ő: "o"
11
+ ú: "u"
12
+ ü: "u"
13
+ ű: "u"
14
+ Á: "A"
15
+ É: "E"
16
+ Í: "I"
17
+ Ó: "O"
18
+ Ö: "O"
19
+ Ő: "O"
20
+ Ú: "U"
21
+ Ü: "U"
22
+ Ű: "U"
@@ -0,0 +1,28 @@
1
+ oc:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ à: "a"
6
+ á: "a"
7
+ ç: "c"
8
+ é: "e"
9
+ è: "e"
10
+ ë: "e"
11
+ í: "i"
12
+ ï: "i"
13
+ ó: "o"
14
+ ò: "o"
15
+ ú: "u"
16
+ ü: "u"
17
+ À: "A"
18
+ Á: "A"
19
+ Ç: "C"
20
+ É: "E"
21
+ È: "E"
22
+ Ë: "E"
23
+ Í: "I"
24
+ Ï: "I"
25
+ Ó: "O"
26
+ Ò: "O"
27
+ Ú: "U"
28
+ Ü: "U"
@@ -0,0 +1,22 @@
1
+ pl:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ ą: "a"
6
+ ć: "c"
7
+ ę: "e"
8
+ ł: "l"
9
+ ń: "n"
10
+ ó: "o"
11
+ ś: "s"
12
+ ź: "z"
13
+ ż: "z"
14
+ Ą: "A"
15
+ Ć: "C"
16
+ Ę: "E"
17
+ Ł: "L"
18
+ Ń: "N"
19
+ Ó: "O"
20
+ Ś: "S"
21
+ Ź: "Z"
22
+ Ż: "Z"
@@ -0,0 +1,28 @@
1
+ pt:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ á: "a"
6
+ à: "a"
7
+ ã: "a"
8
+ â: "a"
9
+ é: "e"
10
+ ê: "e"
11
+ í: "i"
12
+ ó: "o"
13
+ õ: "o"
14
+ ú: "u"
15
+ Á: "A"
16
+ À: "A"
17
+ Ã: "A"
18
+ É: "E"
19
+ Ê: "E"
20
+ Í: "I"
21
+ Ó: "O"
22
+ Õ: "O"
23
+ Ú: "U"
24
+ Æ: "Ae"
25
+ æ: "ae"
26
+ º: "o"
27
+ ª: "a"
28
+ ç: "c"
@@ -0,0 +1,14 @@
1
+ ro:
2
+ i18n:
3
+ transliterate:
4
+ rule:
5
+ ă: "a"
6
+ â: "a"
7
+ î: "i"
8
+ ș: "s"
9
+ ț: "t"
10
+ Ă: "A"
11
+ Â: "A"
12
+ Î: "I"
13
+ Ș: "S"
14
+ Ț: "T"
@@ -0,0 +1,93 @@
1
+ # encoding: utf-8
2
+
3
+ # (c) Yaroslav Markin, Julian "julik" Tarkhanov and Co
4
+ # https://github.com/yaroslav/russian/blob/master/lib/russian/transliteration.rb
5
+
6
+ module RailsI18n
7
+ module Transliteration
8
+ module Russian
9
+ class << self
10
+ def rule
11
+ lambda do |string|
12
+ next '' unless string
13
+
14
+ chars = string.scan(%r{#{multi_keys.join '|'}|\w|.})
15
+
16
+ result = ""
17
+
18
+ chars.each_with_index do |char, index|
19
+ if upper.has_key?(char) && lower.has_key?(chars[index+1])
20
+ # combined case
21
+ result << upper[char].downcase.capitalize
22
+ elsif upper.has_key?(char)
23
+ result << upper[char]
24
+ elsif lower.has_key?(char)
25
+ result << lower[char]
26
+ else
27
+ result << char
28
+ end
29
+ end
30
+
31
+ result
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ # use instance variables instead of constants to prevent warnings
38
+ # on re-evaling after I18n.reload!
39
+
40
+ def upper
41
+ @upper ||= begin
42
+ upper_single = {
43
+ "Ґ"=>"G","Ё"=>"YO","Є"=>"E","Ї"=>"YI","І"=>"I",
44
+ "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
45
+ "Д"=>"D","Е"=>"E","Ж"=>"ZH","З"=>"Z","И"=>"I",
46
+ "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
47
+ "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
48
+ "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
49
+ "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"'","Ы"=>"Y","Ь"=>"",
50
+ "Э"=>"E","Ю"=>"YU","Я"=>"YA",
51
+ }
52
+
53
+ (upper_single.merge(upper_multi)).freeze
54
+ end
55
+ end
56
+
57
+ def lower
58
+ @lower ||= begin
59
+ lower_single = {
60
+ "і"=>"i","ґ"=>"g","ё"=>"yo","№"=>"#","є"=>"e",
61
+ "ї"=>"yi","а"=>"a","б"=>"b",
62
+ "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
63
+ "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
64
+ "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
65
+ "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
66
+ "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"'",
67
+ "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
68
+ }
69
+
70
+ (lower_single.merge(lower_multi)).freeze
71
+ end
72
+ end
73
+
74
+ def upper_multi
75
+ @upper_multi ||= { "ЬЕ"=>"IE", "ЬЁ"=>"IE" }
76
+ end
77
+
78
+ def lower_multi
79
+ @lower_multi ||= { "ье"=>"ie", "ьё"=>"ie" }
80
+ end
81
+
82
+ def multi_keys
83
+ @multi_keys ||= (lower_multi.merge(upper_multi)).keys.sort_by {|s| s.length}.reverse.freeze
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ { :ru => {
91
+ :i18n => {
92
+ :transliterate => {
93
+ :rule => RailsI18n::Transliteration::Russian.rule }}}}
@@ -0,0 +1,129 @@
1
+ # encoding: utf-8
2
+
3
+ module RailsI18n
4
+ module Transliteration
5
+ module Ukrainian
6
+ class << self
7
+ def rule
8
+ lambda do |string|
9
+ next '' unless string
10
+
11
+ string.gsub(/./) do |char|
12
+ # Regexp.last_match is local to the thread and method scope
13
+ # of the method that did the pattern match.
14
+ @pre_match, @post_match = $`, $'
15
+
16
+ case char
17
+ when 'Ж'
18
+ lookahead_upcase 'ZH'
19
+ when 'Х'
20
+ lookahead_upcase 'KH'
21
+ when 'Ц'
22
+ lookahead_upcase 'TS'
23
+ when 'Ч'
24
+ lookahead_upcase 'CH'
25
+ when 'Ш'
26
+ lookahead_upcase 'SH'
27
+ when 'Щ'
28
+ lookahead_upcase 'SHCH'
29
+ when 'г'
30
+ behind =~ /[зЗ]/ ? 'gh' : 'h'
31
+ when 'Г'
32
+ behind =~ /[зЗ]/ ? lookahead_upcase('GH') : 'H'
33
+ when 'є'
34
+ letter?(behind) ? 'ie' : 'ye'
35
+ when 'Є'
36
+ letter?(behind) ? lookahead_upcase('IE') : lookahead_upcase('YE')
37
+ when 'ї'
38
+ letter?(behind) ? 'i' : 'yi'
39
+ when 'Ї'
40
+ letter?(behind) ? 'I' : lookahead_upcase('YI')
41
+ when 'й'
42
+ letter?(behind) ? 'i' : 'y'
43
+ when 'Й'
44
+ letter?(behind) ? 'I' : 'Y'
45
+ when 'ю'
46
+ letter?(behind) ? 'iu' : 'yu'
47
+ when 'Ю'
48
+ letter?(behind) ? lookahead_upcase('IU') : lookahead_upcase('YU')
49
+ when 'я'
50
+ letter?(behind) ? 'ia' : 'ya'
51
+ when 'Я'
52
+ letter?(behind) ? lookahead_upcase('IA') : lookahead_upcase('YA')
53
+ when "'"
54
+ # remove apostrophe inside a word
55
+ letter?(behind) && letter?(ahead) ? '' : "'"
56
+ else
57
+ straight_lookup[char] || char
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ if RUBY_VERSION < '1.9'
66
+ # two bytes will be enough for Cyrillic
67
+ class_eval <<-END, __FILE__, __LINE__ + 1
68
+ def behind
69
+ tail = @pre_match && @pre_match[-2..-1]
70
+ tail && tail.split(//).last
71
+ end
72
+
73
+ def ahead
74
+ @post_match && @post_match[0..1].split(//).first
75
+ end
76
+ END
77
+ else
78
+ class_eval <<-END, __FILE__, __LINE__ + 1
79
+ def behind
80
+ @pre_match && @pre_match[-1]
81
+ end
82
+
83
+ def ahead
84
+ @post_match && @post_match[0]
85
+ end
86
+ END
87
+ end
88
+
89
+ def downcased?(symbol)
90
+ symbol =~ downcased_regexp
91
+ end
92
+
93
+ def downcased_regexp
94
+ @downcased_regexp ||= /[а-яґєії]/
95
+ end
96
+
97
+ # apostrophe can be inside a word
98
+ def letter?(symbol)
99
+ symbol =~ letter_regexp
100
+ end
101
+
102
+ def letter_regexp
103
+ @letter_regexp ||= /[а-яґєіїА-ЯҐЄІЇ'’]/
104
+ end
105
+
106
+ def lookahead_upcase(word)
107
+ downcased?(ahead) ? word.capitalize : word.upcase
108
+ end
109
+
110
+ def straight_lookup
111
+ @straight_lookup ||= {
112
+ 'а'=>'a','б'=>'b','в'=>'v','ґ'=>'g','д'=>'d','е'=>'e','ж'=>'zh',
113
+ 'з'=>'z','и'=>'y','і'=>'i','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o',
114
+ 'п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'kh','ц'=>'ts',
115
+ 'ч'=>'ch','ш'=>'sh','щ'=>'shch','ь'=>'','’'=>'',
116
+ 'А'=>'A','Б'=>'B','В'=>'V','Ґ'=>'G','Д'=>'D','Е'=>'E',
117
+ 'З'=>'Z','И'=>'Y','І'=>'I','К'=>'K','Л'=>'L','М'=>'M','Н'=>'N','О'=>'O',
118
+ 'П'=>'P','Р'=>'R','С'=>'S','Т'=>'T','У'=>'U','Ф'=>'F','Ь'=>''
119
+ }
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ { :uk => {
127
+ :i18n => {
128
+ :transliterate => {
129
+ :rule => RailsI18n::Transliteration::Ukrainian.rule }}}}