twitter_cldr 1.9.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (403) hide show
  1. data/Gemfile +7 -0
  2. data/History.txt +11 -0
  3. data/README.md +93 -13
  4. data/Rakefile +27 -6
  5. data/lib/twitter_cldr/formatters.rb +15 -12
  6. data/lib/twitter_cldr/formatters/base.rb +1 -1
  7. data/lib/twitter_cldr/formatters/calendars/datetime_formatter.rb +18 -3
  8. data/lib/twitter_cldr/formatters/calendars/timespan_formatter.rb +24 -26
  9. data/lib/twitter_cldr/formatters/numbers/abbreviated/abbreviated_number_formatter.rb +47 -0
  10. data/lib/twitter_cldr/formatters/numbers/abbreviated/long_decimal_formatter.rb +18 -0
  11. data/lib/twitter_cldr/formatters/numbers/abbreviated/short_decimal_formatter.rb +18 -0
  12. data/lib/twitter_cldr/formatters/numbers/currency_formatter.rb +22 -17
  13. data/lib/twitter_cldr/formatters/numbers/decimal_formatter.rb +0 -9
  14. data/lib/twitter_cldr/formatters/numbers/helpers/base.rb +1 -1
  15. data/lib/twitter_cldr/formatters/numbers/number_formatter.rb +25 -10
  16. data/lib/twitter_cldr/formatters/numbers/percent_formatter.rb +9 -6
  17. data/lib/twitter_cldr/localized/localized_datetime.rb +6 -2
  18. data/lib/twitter_cldr/localized/localized_number.rb +9 -3
  19. data/lib/twitter_cldr/localized/localized_timespan.rb +1 -1
  20. data/lib/twitter_cldr/resources.rb +13 -12
  21. data/lib/twitter_cldr/resources/custom_locales_resources_importer.rb +1 -1
  22. data/lib/twitter_cldr/resources/download.rb +1 -1
  23. data/lib/twitter_cldr/resources/locales_resources_importer.rb +10 -6
  24. data/lib/twitter_cldr/shared/bidi.rb +27 -27
  25. data/lib/twitter_cldr/shared/currencies.rb +20 -13
  26. data/lib/twitter_cldr/tokenizers.rb +10 -9
  27. data/lib/twitter_cldr/tokenizers/base.rb +33 -21
  28. data/lib/twitter_cldr/tokenizers/calendars/additional_date_format_selector.rb +86 -0
  29. data/lib/twitter_cldr/tokenizers/calendars/date_tokenizer.rb +20 -11
  30. data/lib/twitter_cldr/tokenizers/calendars/datetime_tokenizer.rb +50 -13
  31. data/lib/twitter_cldr/tokenizers/calendars/time_tokenizer.rb +19 -10
  32. data/lib/twitter_cldr/tokenizers/calendars/timespan_tokenizer.rb +32 -32
  33. data/lib/twitter_cldr/tokenizers/numbers/number_tokenizer.rb +45 -22
  34. data/lib/twitter_cldr/utils.rb +16 -1
  35. data/lib/twitter_cldr/version.rb +1 -1
  36. data/resources/collation/tailoring/af.yml +1 -0
  37. data/resources/collation/tailoring/ar.yml +3 -2
  38. data/resources/collation/tailoring/be.yml +7 -0
  39. data/resources/collation/tailoring/bg.yml +5 -0
  40. data/resources/collation/tailoring/bn.yml +9 -0
  41. data/resources/collation/tailoring/ca.yml +3 -2
  42. data/resources/collation/tailoring/cs.yml +3 -2
  43. data/resources/collation/tailoring/cy.yml +51 -0
  44. data/resources/collation/tailoring/da.yml +3 -2
  45. data/resources/collation/tailoring/de.yml +1 -0
  46. data/resources/collation/tailoring/el.yml +1 -0
  47. data/resources/collation/tailoring/en.yml +1 -0
  48. data/resources/collation/tailoring/es.yml +3 -2
  49. data/resources/collation/tailoring/eu.yml +1 -0
  50. data/resources/collation/tailoring/fa.yml +3 -2
  51. data/resources/collation/tailoring/fi.yml +3 -2
  52. data/resources/collation/tailoring/fil.yml +3 -2
  53. data/resources/collation/tailoring/fr.yml +1 -0
  54. data/resources/collation/tailoring/ga.yml +5 -0
  55. data/resources/collation/tailoring/gl.yml +5 -0
  56. data/resources/collation/tailoring/he.yml +1 -0
  57. data/resources/collation/tailoring/hi.yml +3 -2
  58. data/resources/collation/tailoring/hu.yml +3 -2
  59. data/resources/collation/tailoring/id.yml +1 -0
  60. data/resources/collation/tailoring/it.yml +1 -0
  61. data/resources/collation/tailoring/ja.yml +107 -54
  62. data/resources/collation/tailoring/ko.yml +3 -2
  63. data/resources/collation/tailoring/lv.yml +35 -0
  64. data/resources/collation/tailoring/ms.yml +1 -0
  65. data/resources/collation/tailoring/nb.yml +3 -2
  66. data/resources/collation/tailoring/nl.yml +1 -0
  67. data/resources/collation/tailoring/pl.yml +3 -2
  68. data/resources/collation/tailoring/pt.yml +1 -0
  69. data/resources/collation/tailoring/ro.yml +31 -0
  70. data/resources/collation/tailoring/ru.yml +1 -0
  71. data/resources/collation/tailoring/sk.yml +35 -0
  72. data/resources/collation/tailoring/sq.yml +65 -0
  73. data/resources/collation/tailoring/sr.yml +5 -0
  74. data/resources/collation/tailoring/sv.yml +3 -2
  75. data/resources/collation/tailoring/ta.yml +57 -0
  76. data/resources/collation/tailoring/th.yml +3 -2
  77. data/resources/collation/tailoring/tr.yml +3 -2
  78. data/resources/collation/tailoring/uk.yml +3 -2
  79. data/resources/collation/tailoring/ur.yml +3 -2
  80. data/resources/collation/tailoring/zh-Hant.yml +3 -2
  81. data/resources/collation/tailoring/zh.yml +3 -2
  82. data/resources/collation/tries/be.dump +0 -0
  83. data/resources/collation/tries/bg.dump +0 -0
  84. data/resources/collation/tries/bn.dump +0 -0
  85. data/resources/collation/tries/cy.dump +0 -0
  86. data/resources/collation/tries/ga.dump +0 -0
  87. data/resources/collation/tries/gl.dump +0 -0
  88. data/resources/collation/tries/lv.dump +0 -0
  89. data/resources/collation/tries/ro.dump +0 -0
  90. data/resources/collation/tries/sk.dump +0 -0
  91. data/resources/collation/tries/sq.dump +0 -0
  92. data/resources/collation/tries/sr.dump +0 -0
  93. data/resources/collation/tries/ta.dump +0 -0
  94. data/resources/custom/locales/ar/units.yml +6 -6
  95. data/resources/custom/locales/be/units.yml +27 -0
  96. data/resources/custom/locales/bg/units.yml +19 -0
  97. data/resources/custom/locales/bn/units.yml +7 -0
  98. data/resources/custom/locales/cs/units.yml +3 -3
  99. data/resources/custom/locales/cy/units.yml +35 -0
  100. data/resources/custom/locales/fil/units.yml +2 -2
  101. data/resources/custom/locales/ga/units.yml +24 -0
  102. data/resources/custom/locales/gl/units.yml +19 -0
  103. data/resources/custom/locales/hu/plurals.yml +3 -0
  104. data/resources/custom/locales/hu/units.yml +4 -0
  105. data/resources/custom/locales/lv/units.yml +23 -0
  106. data/resources/custom/locales/ms/units.yml +1 -1
  107. data/resources/custom/locales/ro/units.yml +23 -0
  108. data/resources/custom/locales/sk/units.yml +23 -0
  109. data/resources/custom/locales/sr/units.yml +27 -0
  110. data/resources/custom/locales/ta/units.yml +11 -0
  111. data/resources/custom/locales/th/calendars.yml +14 -0
  112. data/resources/locales/af/calendars.yml +56 -0
  113. data/resources/locales/af/currencies.yml +358 -0
  114. data/resources/locales/af/languages.yml +23 -3
  115. data/resources/locales/af/numbers.yml +22 -8
  116. data/resources/locales/af/units.yml +26 -54
  117. data/resources/locales/ar/calendars.yml +99 -6
  118. data/resources/locales/ar/currencies.yml +1491 -0
  119. data/resources/locales/ar/languages.yml +33 -6
  120. data/resources/locales/ar/numbers.yml +27 -14
  121. data/resources/locales/ar/units.yml +31 -31
  122. data/resources/locales/be/calendars.yml +229 -0
  123. data/resources/locales/be/currencies.yml +66 -0
  124. data/resources/locales/be/languages.yml +149 -0
  125. data/resources/locales/be/layout.yml +4 -0
  126. data/resources/locales/be/lists.yml +7 -0
  127. data/resources/locales/be/numbers.yml +43 -0
  128. data/resources/locales/be/plurals.yml +5 -0
  129. data/resources/locales/be/units.yml +87 -0
  130. data/resources/locales/bg/calendars.yml +220 -0
  131. data/resources/locales/bg/currencies.yml +773 -0
  132. data/resources/locales/bg/languages.yml +513 -0
  133. data/resources/locales/bg/layout.yml +4 -0
  134. data/resources/locales/bg/lists.yml +7 -0
  135. data/resources/locales/bg/numbers.yml +57 -0
  136. data/resources/locales/bg/plurals.yml +3 -0
  137. data/resources/locales/bg/units.yml +108 -0
  138. data/resources/locales/bn/calendars.yml +205 -0
  139. data/resources/locales/bn/currencies.yml +564 -0
  140. data/resources/locales/bn/languages.yml +513 -0
  141. data/resources/locales/bn/layout.yml +4 -0
  142. data/resources/locales/bn/lists.yml +7 -0
  143. data/resources/locales/bn/numbers.yml +57 -0
  144. data/resources/locales/bn/plurals.yml +3 -0
  145. data/resources/locales/bn/units.yml +108 -0
  146. data/resources/locales/ca/calendars.yml +70 -21
  147. data/resources/locales/ca/currencies.yml +904 -0
  148. data/resources/locales/ca/languages.yml +70 -5
  149. data/resources/locales/ca/numbers.yml +19 -6
  150. data/resources/locales/ca/units.yml +0 -28
  151. data/resources/locales/cs/calendars.yml +73 -27
  152. data/resources/locales/cs/currencies.yml +1063 -0
  153. data/resources/locales/cs/languages.yml +113 -31
  154. data/resources/locales/cs/numbers.yml +17 -4
  155. data/resources/locales/cs/units.yml +0 -28
  156. data/resources/locales/cy/calendars.yml +266 -0
  157. data/resources/locales/cy/currencies.yml +54 -0
  158. data/resources/locales/cy/languages.yml +92 -0
  159. data/resources/locales/cy/layout.yml +4 -0
  160. data/resources/locales/cy/lists.yml +7 -0
  161. data/resources/locales/cy/numbers.yml +49 -0
  162. data/resources/locales/cy/plurals.yml +4 -0
  163. data/resources/locales/cy/units.yml +73 -0
  164. data/resources/locales/da/calendars.yml +117 -16
  165. data/resources/locales/da/currencies.yml +814 -0
  166. data/resources/locales/da/languages.yml +66 -5
  167. data/resources/locales/da/numbers.yml +16 -3
  168. data/resources/locales/da/units.yml +21 -35
  169. data/resources/locales/de/calendars.yml +115 -17
  170. data/resources/locales/de/currencies.yml +843 -0
  171. data/resources/locales/de/languages.yml +5 -3
  172. data/resources/locales/de/numbers.yml +18 -5
  173. data/resources/locales/de/units.yml +0 -28
  174. data/resources/locales/el/calendars.yml +61 -8
  175. data/resources/locales/el/currencies.yml +866 -0
  176. data/resources/locales/el/languages.yml +61 -5
  177. data/resources/locales/el/numbers.yml +18 -5
  178. data/resources/locales/el/units.yml +7 -42
  179. data/resources/locales/en/calendars.yml +43 -4
  180. data/resources/locales/en/currencies.yml +912 -0
  181. data/resources/locales/en/languages.yml +26 -6
  182. data/resources/locales/en/numbers.yml +17 -4
  183. data/resources/locales/es/calendars.yml +60 -0
  184. data/resources/locales/es/currencies.yml +820 -0
  185. data/resources/locales/es/languages.yml +66 -1
  186. data/resources/locales/es/numbers.yml +20 -7
  187. data/resources/locales/es/units.yml +0 -28
  188. data/resources/locales/eu/calendars.yml +43 -2
  189. data/resources/locales/eu/currencies.yml +378 -0
  190. data/resources/locales/eu/languages.yml +29 -13
  191. data/resources/locales/eu/numbers.yml +17 -4
  192. data/resources/locales/eu/units.yml +22 -43
  193. data/resources/locales/fa/calendars.yml +57 -0
  194. data/resources/locales/fa/currencies.yml +449 -0
  195. data/resources/locales/fa/languages.yml +8 -3
  196. data/resources/locales/fa/numbers.yml +20 -7
  197. data/resources/locales/fa/units.yml +0 -42
  198. data/resources/locales/fi/calendars.yml +49 -1
  199. data/resources/locales/fi/currencies.yml +903 -0
  200. data/resources/locales/fi/languages.yml +58 -2
  201. data/resources/locales/fi/numbers.yml +25 -12
  202. data/resources/locales/fi/units.yml +0 -28
  203. data/resources/locales/fil/calendars.yml +51 -0
  204. data/resources/locales/fil/currencies.yml +357 -0
  205. data/resources/locales/fil/languages.yml +25 -8
  206. data/resources/locales/fil/numbers.yml +18 -5
  207. data/resources/locales/fil/units.yml +14 -28
  208. data/resources/locales/fr/calendars.yml +114 -12
  209. data/resources/locales/fr/currencies.yml +884 -0
  210. data/resources/locales/fr/languages.yml +43 -9
  211. data/resources/locales/fr/numbers.yml +22 -9
  212. data/resources/locales/fr/units.yml +2 -30
  213. data/resources/locales/ga/calendars.yml +187 -0
  214. data/resources/locales/ga/currencies.yml +513 -0
  215. data/resources/locales/ga/languages.yml +147 -0
  216. data/resources/locales/ga/layout.yml +4 -0
  217. data/resources/locales/ga/lists.yml +7 -0
  218. data/resources/locales/ga/numbers.yml +43 -0
  219. data/resources/locales/ga/plurals.yml +4 -0
  220. data/resources/locales/ga/units.yml +66 -0
  221. data/resources/locales/gl/calendars.yml +216 -0
  222. data/resources/locales/gl/currencies.yml +476 -0
  223. data/resources/locales/gl/languages.yml +213 -0
  224. data/resources/locales/gl/layout.yml +4 -0
  225. data/resources/locales/gl/lists.yml +7 -0
  226. data/resources/locales/gl/numbers.yml +57 -0
  227. data/resources/locales/gl/plurals.yml +3 -0
  228. data/resources/locales/gl/units.yml +108 -0
  229. data/resources/locales/he/calendars.yml +70 -18
  230. data/resources/locales/he/currencies.yml +497 -0
  231. data/resources/locales/he/languages.yml +301 -7
  232. data/resources/locales/he/lists.yml +2 -2
  233. data/resources/locales/he/numbers.yml +23 -8
  234. data/resources/locales/he/plurals.yml +3 -2
  235. data/resources/locales/he/units.yml +72 -30
  236. data/resources/locales/hi/calendars.yml +54 -1
  237. data/resources/locales/hi/currencies.yml +388 -0
  238. data/resources/locales/hi/languages.yml +2 -0
  239. data/resources/locales/hi/numbers.yml +21 -8
  240. data/resources/locales/hi/units.yml +15 -29
  241. data/resources/locales/hu/calendars.yml +52 -5
  242. data/resources/locales/hu/currencies.yml +640 -0
  243. data/resources/locales/hu/languages.yml +60 -4
  244. data/resources/locales/hu/numbers.yml +25 -12
  245. data/resources/locales/hu/units.yml +1 -29
  246. data/resources/locales/id/calendars.yml +125 -21
  247. data/resources/locales/id/currencies.yml +603 -0
  248. data/resources/locales/id/languages.yml +113 -51
  249. data/resources/locales/id/numbers.yml +16 -3
  250. data/resources/locales/id/units.yml +0 -28
  251. data/resources/locales/it/calendars.yml +59 -6
  252. data/resources/locales/it/currencies.yml +722 -0
  253. data/resources/locales/it/languages.yml +77 -5
  254. data/resources/locales/it/numbers.yml +22 -9
  255. data/resources/locales/it/units.yml +0 -14
  256. data/resources/locales/ja/calendars.yml +55 -5
  257. data/resources/locales/ja/currencies.yml +602 -0
  258. data/resources/locales/ja/languages.yml +103 -43
  259. data/resources/locales/ja/numbers.yml +18 -5
  260. data/resources/locales/ja/units.yml +6 -34
  261. data/resources/locales/ko/calendars.yml +50 -0
  262. data/resources/locales/ko/currencies.yml +596 -0
  263. data/resources/locales/ko/languages.yml +75 -8
  264. data/resources/locales/ko/numbers.yml +17 -4
  265. data/resources/locales/ko/units.yml +0 -28
  266. data/resources/locales/lv/calendars.yml +275 -0
  267. data/resources/locales/lv/currencies.yml +765 -0
  268. data/resources/locales/lv/languages.yml +576 -0
  269. data/resources/locales/lv/layout.yml +4 -0
  270. data/resources/locales/lv/lists.yml +7 -0
  271. data/resources/locales/lv/numbers.yml +58 -0
  272. data/resources/locales/lv/plurals.yml +4 -0
  273. data/resources/locales/lv/units.yml +136 -0
  274. data/resources/locales/ms/calendars.yml +86 -4
  275. data/resources/locales/ms/currencies.yml +341 -0
  276. data/resources/locales/ms/languages.yml +25 -3
  277. data/resources/locales/ms/numbers.yml +19 -6
  278. data/resources/locales/ms/units.yml +0 -56
  279. data/resources/locales/nb/calendars.yml +48 -1
  280. data/resources/locales/nb/currencies.yml +846 -0
  281. data/resources/locales/nb/languages.yml +44 -2
  282. data/resources/locales/nb/numbers.yml +16 -3
  283. data/resources/locales/nb/units.yml +6 -28
  284. data/resources/locales/nl/calendars.yml +110 -9
  285. data/resources/locales/nl/currencies.yml +640 -0
  286. data/resources/locales/nl/languages.yml +68 -8
  287. data/resources/locales/nl/numbers.yml +25 -12
  288. data/resources/locales/nl/units.yml +14 -28
  289. data/resources/locales/pl/calendars.yml +53 -6
  290. data/resources/locales/pl/currencies.yml +1100 -0
  291. data/resources/locales/pl/languages.yml +13 -6
  292. data/resources/locales/pl/lists.yml +2 -2
  293. data/resources/locales/pl/numbers.yml +18 -5
  294. data/resources/locales/pl/units.yml +51 -92
  295. data/resources/locales/pt/calendars.yml +121 -9
  296. data/resources/locales/pt/currencies.yml +904 -0
  297. data/resources/locales/pt/languages.yml +5 -3
  298. data/resources/locales/pt/numbers.yml +17 -4
  299. data/resources/locales/pt/units.yml +0 -28
  300. data/resources/locales/ro/calendars.yml +278 -0
  301. data/resources/locales/ro/currencies.yml +946 -0
  302. data/resources/locales/ro/languages.yml +576 -0
  303. data/resources/locales/ro/layout.yml +4 -0
  304. data/resources/locales/ro/lists.yml +7 -0
  305. data/resources/locales/ro/numbers.yml +58 -0
  306. data/resources/locales/ro/plurals.yml +3 -0
  307. data/resources/locales/ro/units.yml +136 -0
  308. data/resources/locales/ru/calendars.yml +72 -12
  309. data/resources/locales/ru/currencies.yml +1061 -0
  310. data/resources/locales/ru/languages.yml +51 -6
  311. data/resources/locales/ru/numbers.yml +21 -5
  312. data/resources/locales/ru/units.yml +0 -28
  313. data/resources/locales/sk/calendars.yml +275 -0
  314. data/resources/locales/sk/currencies.yml +713 -0
  315. data/resources/locales/sk/languages.yml +576 -0
  316. data/resources/locales/sk/layout.yml +4 -0
  317. data/resources/locales/sk/lists.yml +7 -0
  318. data/resources/locales/sk/numbers.yml +58 -0
  319. data/resources/locales/sk/plurals.yml +3 -0
  320. data/resources/locales/sk/units.yml +136 -0
  321. data/resources/locales/sq/calendars.yml +188 -0
  322. data/resources/locales/sq/currencies.yml +56 -0
  323. data/resources/locales/sq/languages.yml +17 -0
  324. data/resources/locales/sq/layout.yml +4 -0
  325. data/resources/locales/sq/lists.yml +7 -0
  326. data/resources/locales/sq/numbers.yml +43 -0
  327. data/resources/locales/sq/plurals.yml +3 -0
  328. data/resources/locales/sq/units.yml +73 -0
  329. data/resources/locales/sr/calendars.yml +285 -0
  330. data/resources/locales/sr/currencies.yml +1494 -0
  331. data/resources/locales/sr/languages.yml +513 -0
  332. data/resources/locales/sr/layout.yml +4 -0
  333. data/resources/locales/sr/lists.yml +7 -0
  334. data/resources/locales/sr/numbers.yml +59 -0
  335. data/resources/locales/sr/plurals.yml +5 -0
  336. data/resources/locales/sr/units.yml +164 -0
  337. data/resources/locales/sv/calendars.yml +59 -1
  338. data/resources/locales/sv/currencies.yml +919 -0
  339. data/resources/locales/sv/languages.yml +47 -2
  340. data/resources/locales/sv/numbers.yml +27 -12
  341. data/resources/locales/sv/units.yml +4 -32
  342. data/resources/locales/ta/calendars.yml +264 -0
  343. data/resources/locales/ta/currencies.yml +346 -0
  344. data/resources/locales/ta/languages.yml +512 -0
  345. data/resources/locales/ta/layout.yml +4 -0
  346. data/resources/locales/ta/lists.yml +7 -0
  347. data/resources/locales/ta/numbers.yml +57 -0
  348. data/resources/locales/ta/plurals.yml +3 -0
  349. data/resources/locales/ta/units.yml +108 -0
  350. data/resources/locales/th/calendars.yml +125 -27
  351. data/resources/locales/th/currencies.yml +602 -0
  352. data/resources/locales/th/languages.yml +70 -5
  353. data/resources/locales/th/numbers.yml +24 -11
  354. data/resources/locales/th/units.yml +0 -28
  355. data/resources/locales/tr/calendars.yml +62 -12
  356. data/resources/locales/tr/currencies.yml +571 -0
  357. data/resources/locales/tr/languages.yml +94 -29
  358. data/resources/locales/tr/numbers.yml +19 -6
  359. data/resources/locales/tr/units.yml +1 -29
  360. data/resources/locales/uk/calendars.yml +52 -0
  361. data/resources/locales/uk/currencies.yml +799 -0
  362. data/resources/locales/uk/languages.yml +57 -2
  363. data/resources/locales/uk/numbers.yml +18 -5
  364. data/resources/locales/uk/units.yml +0 -28
  365. data/resources/locales/ur/calendars.yml +96 -32
  366. data/resources/locales/ur/currencies.yml +360 -0
  367. data/resources/locales/ur/languages.yml +49 -32
  368. data/resources/locales/ur/numbers.yml +13 -13
  369. data/resources/locales/ur/units.yml +28 -56
  370. data/resources/locales/zh-Hant/calendars.yml +59 -1
  371. data/resources/locales/zh-Hant/currencies.yml +602 -0
  372. data/resources/locales/zh-Hant/languages.yml +74 -8
  373. data/resources/locales/zh-Hant/numbers.yml +17 -4
  374. data/resources/locales/zh-Hant/units.yml +0 -28
  375. data/resources/locales/zh/calendars.yml +95 -35
  376. data/resources/locales/zh/currencies.yml +602 -0
  377. data/resources/locales/zh/languages.yml +116 -46
  378. data/resources/locales/zh/numbers.yml +20 -7
  379. data/resources/locales/zh/units.yml +6 -34
  380. data/resources/shared/currency_digits_and_rounding.yml +187 -0
  381. data/spec/bidi/bidi_spec.rb +1 -1
  382. data/spec/collation/tailoring_spec.rb +29 -25
  383. data/spec/formatters/calendars/datetime_formatter_spec.rb +50 -2
  384. data/spec/formatters/calendars/timespan_formatter_spec.rb +52 -8
  385. data/spec/formatters/numbers/abbreviated/abbreviated_number_formatter_spec.rb +81 -0
  386. data/spec/formatters/numbers/abbreviated/long_decimal_formatter_spec.rb +37 -0
  387. data/spec/formatters/numbers/abbreviated/short_decimal_formatter_spec.rb +37 -0
  388. data/spec/formatters/numbers/currency_formatter_spec.rb +10 -1
  389. data/spec/localized/localized_date_spec.rb +11 -11
  390. data/spec/localized/localized_datetime_spec.rb +27 -3
  391. data/spec/localized/localized_number_spec.rb +34 -6
  392. data/spec/localized/localized_time_spec.rb +1 -1
  393. data/spec/readme_spec.rb +24 -3
  394. data/spec/shared/currencies_spec.rb +7 -9
  395. data/spec/spec_helper.rb +7 -0
  396. data/spec/tokenizers/base_spec.rb +71 -21
  397. data/spec/tokenizers/calendars/additional_date_format_selector_spec.rb +131 -0
  398. data/spec/tokenizers/calendars/datetime_tokenizer_spec.rb +54 -27
  399. data/spec/tokenizers/calendars/time_tokenizer_spec.rb +16 -16
  400. data/spec/tokenizers/numbers/number_tokenizer_spec.rb +9 -21
  401. data/spec/utils/yaml/yaml_spec.rb +21 -16
  402. data/spec/utils_spec.rb +6 -2
  403. metadata +218 -37
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Twitter, Inc
4
+ # http://www.apache.org/licenses/LICENSE-2.0
5
+
6
+ module TwitterCldr
7
+ module Formatters
8
+ class LongDecimalFormatter < AbbreviatedNumberFormatter
9
+
10
+ protected
11
+
12
+ def get_type
13
+ :long_decimal
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Twitter, Inc
4
+ # http://www.apache.org/licenses/LICENSE-2.0
5
+
6
+ module TwitterCldr
7
+ module Formatters
8
+ class ShortDecimalFormatter < AbbreviatedNumberFormatter
9
+
10
+ protected
11
+
12
+ def get_type
13
+ :short_decimal
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -9,27 +9,32 @@ module TwitterCldr
9
9
  DEFAULT_CURRENCY_SYMBOL = "$"
10
10
  DEFAULT_PRECISION = 2
11
11
 
12
- def initialize(options = {})
13
- @tokenizer = TwitterCldr::Tokenizers::NumberTokenizer.new(:locale => self.extract_locale(options), :type => :currency)
14
- super
15
- end
16
-
17
12
  def format(number, options = {})
18
- if options[:currency]
19
- currency ||= TwitterCldr::Shared::Currencies.for_code(options[:currency])
20
- currency ||= TwitterCldr::Shared::Currencies.for_country(options[:currency])
21
- currency ||= { :symbol => options[:currency] }
22
- else
23
- currency = { :symbol => DEFAULT_CURRENCY_SYMBOL }
24
- end
13
+ options[:currency] ||= "USD"
14
+ currency = TwitterCldr::Shared::Currencies.for_code(options[:currency])
15
+ currency ||= TwitterCldr::Shared::Currencies.for_country(options[:currency])
16
+ currency ||= { :symbol => options[:currency], :currency => options[:currency] }
17
+
18
+ digits_and_rounding = resource(options[:currency])
19
+ options[:precision] ||= digits_and_rounding[:digits]
20
+ options[:rounding] ||= digits_and_rounding[:rounding]
21
+
22
+ super(number, options).gsub('¤', (currency[:symbol] || currency[:currency].to_s))
23
+ end
25
24
 
26
- super(number, options).gsub('¤', currency[:symbol])
25
+ private
26
+ def resource(code)
27
+ @resource ||= TwitterCldr.get_resource(:shared, :currency_digits_and_rounding)
28
+ @resource[code.to_sym] || @resource[:DEFAULT]
27
29
  end
28
30
 
29
- def default_format_options_for(number)
30
- precision = precision_from(number)
31
- { :precision => precision == 0 ? DEFAULT_PRECISION : precision }
31
+ def get_tokens(obj, options = {})
32
+ opts = options.dup.merge(
33
+ :sign => obj.abs == obj ? :positive : :negative,
34
+ :type => :currency
35
+ )
36
+ @tokenizer.tokens(opts)
32
37
  end
33
38
  end
34
39
  end
35
- end
40
+ end
@@ -6,20 +6,11 @@
6
6
  module TwitterCldr
7
7
  module Formatters
8
8
  class DecimalFormatter < NumberFormatter
9
- def initialize(options = {})
10
- @tokenizer = TwitterCldr::Tokenizers::NumberTokenizer.new(:locale => self.extract_locale(options), :type => :decimal)
11
- super
12
- end
13
-
14
9
  def format(number, options = {})
15
10
  super(number, options)
16
11
  rescue TypeError, ArgumentError
17
12
  number
18
13
  end
19
-
20
- def default_format_options_for(number)
21
- { :precision => precision_from(number) }
22
- end
23
14
  end
24
15
  end
25
16
  end
@@ -10,7 +10,7 @@ module TwitterCldr
10
10
  def interpolate(string, value, orientation = :right)
11
11
  value = value.to_s
12
12
  length = value.length
13
- start = orientation == :left ? 0 : -length
13
+ start = orientation == :left ? 0 : -length
14
14
 
15
15
  string = string.dup
16
16
  string = string.ljust(length, '#') if string.length < length
@@ -11,13 +11,15 @@ module TwitterCldr
11
11
  DEFAULT_SYMBOLS = { :group => ',', :decimal => '.', :plus_sign => '+', :minus_sign => '-' }
12
12
 
13
13
  def initialize(options = {})
14
+ @tokenizer = TwitterCldr::Tokenizers::NumberTokenizer.new(:locale => extract_locale(options))
14
15
  @symbols = DEFAULT_SYMBOLS.merge(tokenizer.symbols)
15
16
  end
16
17
 
17
- def format(number, options = {})
18
- opts = self.default_format_options_for(number).merge(options)
19
- prefix, suffix, integer_format, fraction_format = *partition_tokens(self.get_tokens(number, opts))
20
-
18
+ def format(number, opts = {})
19
+ opts[:precision] ||= precision_from(number)
20
+ prefix, suffix, integer_format, fraction_format = *partition_tokens(get_tokens(number, opts))
21
+ number = transform_number(number)
22
+
21
23
  int, fraction = parse_number(number, opts)
22
24
  result = integer_format.apply(int, opts)
23
25
  result << fraction_format.apply(fraction, opts) if fraction
@@ -26,6 +28,10 @@ module TwitterCldr
26
28
 
27
29
  protected
28
30
 
31
+ def transform_number(number)
32
+ number # noop for base class
33
+ end
34
+
29
35
  def partition_tokens(tokens)
30
36
  [tokens[0] || "",
31
37
  tokens[2] || "",
@@ -34,14 +40,22 @@ module TwitterCldr
34
40
  end
35
41
 
36
42
  def parse_number(number, options = {})
37
- precision = options[:precision] || self.precision_from(number)
38
- number = "%.#{precision}f" % round_to(number, precision).abs
43
+ precision = options[:precision] || precision_from(number)
44
+ rounding = options[:rounding] || 0
45
+
46
+ number = "%.#{precision}f" % round_to(number, precision, rounding).abs
39
47
  number.split(".")
40
48
  end
41
49
 
42
- def round_to(number, precision)
50
+ def round_to(number, precision, rounding = 0)
43
51
  factor = 10 ** precision
44
- (number * factor).round.to_f / factor
52
+ result = (number * factor).round.to_f / factor
53
+ if rounding > 0
54
+ rounding = rounding.to_f / factor
55
+ result = (result * (1.0 / rounding)).round.to_f / (1.0 / rounding)
56
+ end
57
+
58
+ result
45
59
  end
46
60
 
47
61
  def precision_from(num)
@@ -50,8 +64,9 @@ module TwitterCldr
50
64
  end
51
65
 
52
66
  def get_tokens(obj, options = {})
53
- obj.abs == obj ? @tokenizer.tokens(:sign => :positive) : @tokenizer.tokens(:sign => :negative)
67
+ opts = options.dup.merge(:sign => obj.abs == obj ? :positive : :negative)
68
+ @tokenizer.tokens(opts)
54
69
  end
55
70
  end
56
71
  end
57
- end
72
+ end
@@ -8,11 +8,6 @@ module TwitterCldr
8
8
  class PercentFormatter < NumberFormatter
9
9
  DEFAULT_PERCENT_SIGN = "%"
10
10
 
11
- def initialize(options = {})
12
- @tokenizer = TwitterCldr::Tokenizers::NumberTokenizer.new(:locale => self.extract_locale(options), :type => :percent)
13
- super
14
- end
15
-
16
11
  def format(number, options = {})
17
12
  super(number, options).gsub('¤', @tokenizer.symbols[:percent_sign] || DEFAULT_PERCENT_SIGN)
18
13
  end
@@ -20,6 +15,14 @@ module TwitterCldr
20
15
  def default_format_options_for(number)
21
16
  { :precision => 0 }
22
17
  end
18
+
19
+ def get_tokens(obj, options = {})
20
+ opts = options.dup.merge(
21
+ :sign => obj.abs == obj ? :positive : :negative,
22
+ :type => :percent
23
+ )
24
+ @tokenizer.tokens(opts)
25
+ end
23
26
  end
24
27
  end
25
- end
28
+ end
@@ -40,8 +40,12 @@ module TwitterCldr
40
40
  TwitterCldr::Localized::LocalizedTimespan.new(seconds, options.merge(:locale => @locale))
41
41
  end
42
42
 
43
- def to_s
44
- to_default_s
43
+ def to_s(options = {})
44
+ if options[:format]
45
+ @formatter.format(@base_obj, options.merge(:type => :additional))
46
+ else
47
+ to_default_s
48
+ end
45
49
  end
46
50
 
47
51
  def to_date
@@ -7,8 +7,14 @@ module TwitterCldr
7
7
  module Localized
8
8
 
9
9
  class LocalizedNumber < LocalizedObject
10
- TYPES = [:decimal, :currency, :percent]
11
10
  DEFAULT_TYPE = :decimal
11
+ TYPES = [
12
+ :decimal,
13
+ :short_decimal,
14
+ :long_decimal,
15
+ :currency,
16
+ :percent,
17
+ ]
12
18
 
13
19
  attr_reader :type
14
20
 
@@ -28,7 +34,7 @@ module TwitterCldr
28
34
  end
29
35
 
30
36
  def to_s(options = {})
31
- @formatter.format(@base_obj, options)
37
+ @formatter.format(@base_obj, options.merge(:type => @type))
32
38
  end
33
39
 
34
40
  def plural_rule
@@ -38,7 +44,7 @@ module TwitterCldr
38
44
  protected
39
45
 
40
46
  def formatter_const
41
- TwitterCldr::Formatters.const_get("#{@type.to_s.capitalize}Formatter")
47
+ TwitterCldr::Formatters.const_get("#{@type.to_s.split("_").map(&:capitalize).join}Formatter")
42
48
  end
43
49
 
44
50
  def to_type(target_type)
@@ -8,7 +8,7 @@ module TwitterCldr
8
8
 
9
9
  class LocalizedTimespan < LocalizedObject
10
10
  def initialize(seconds, options = {})
11
- super(seconds, options[:locale], options)
11
+ super(seconds, options[:locale] || TwitterCldr.get_locale, options)
12
12
  end
13
13
 
14
14
  def to_s(options = {})
@@ -5,17 +5,18 @@
5
5
 
6
6
  module TwitterCldr
7
7
  module Resources
8
- autoload :CanonicalCompositionsUpdater, 'twitter_cldr/resources/canonical_compositions_updater'
9
- autoload :CollationTriesDumper, 'twitter_cldr/resources/collation_tries_dumper'
10
- autoload :CompositionExclusionsImporter, 'twitter_cldr/resources/composition_exclusions_importer'
11
- autoload :CustomLocalesResourcesImporter, 'twitter_cldr/resources/custom_locales_resources_importer'
12
- autoload :LanguageCodesImporter, 'twitter_cldr/resources/language_codes_importer'
13
- autoload :Loader, 'twitter_cldr/resources/loader'
14
- autoload :LocalesResourcesImporter, 'twitter_cldr/resources/locales_resources_importer'
15
- autoload :PhoneCodesImporter, 'twitter_cldr/resources/phone_codes_importer'
16
- autoload :PostalCodesImporter, 'twitter_cldr/resources/postal_codes_importer'
17
- autoload :TailoringImporter, 'twitter_cldr/resources/tailoring_importer'
18
- autoload :UnicodeDataImporter, 'twitter_cldr/resources/unicode_data_importer'
19
- autoload :BidiTestImporter, 'twitter_cldr/resources/bidi_test_importer'
8
+ autoload :CanonicalCompositionsUpdater, 'twitter_cldr/resources/canonical_compositions_updater'
9
+ autoload :CollationTriesDumper, 'twitter_cldr/resources/collation_tries_dumper'
10
+ autoload :CompositionExclusionsImporter, 'twitter_cldr/resources/composition_exclusions_importer'
11
+ autoload :CurrenciesImporter, 'twitter_cldr/resources/currencies_importer'
12
+ autoload :CustomLocalesResourcesImporter, 'twitter_cldr/resources/custom_locales_resources_importer'
13
+ autoload :LanguageCodesImporter, 'twitter_cldr/resources/language_codes_importer'
14
+ autoload :Loader, 'twitter_cldr/resources/loader'
15
+ autoload :LocalesResourcesImporter, 'twitter_cldr/resources/locales_resources_importer'
16
+ autoload :PhoneCodesImporter, 'twitter_cldr/resources/phone_codes_importer'
17
+ autoload :PostalCodesImporter, 'twitter_cldr/resources/postal_codes_importer'
18
+ autoload :TailoringImporter, 'twitter_cldr/resources/tailoring_importer'
19
+ autoload :UnicodeDataImporter, 'twitter_cldr/resources/unicode_data_importer'
20
+ autoload :BidiTestImporter, 'twitter_cldr/resources/bidi_test_importer'
20
21
  end
21
22
  end
@@ -11,7 +11,7 @@ module TwitterCldr
11
11
 
12
12
  class CustomLocalesResourcesImporter
13
13
 
14
- API_ENDPOINT = "http://translate.twttr.com/api/2/twitter/phrase/%s/translations.json"
14
+ API_ENDPOINT = "http://translate.twitter.com/api/2/twitter/phrase/%s/translations.json"
15
15
 
16
16
  TIME_PERIODS = {
17
17
  :day => 19636,
@@ -8,7 +8,7 @@ require 'cldr/download'
8
8
  module TwitterCldr
9
9
  module Resources
10
10
 
11
- CLDR_URL = 'http://unicode.org/Public/cldr/21/core.zip'
11
+ CLDR_URL = 'http://unicode.org/Public/cldr/22.1/core.zip'
12
12
 
13
13
  class << self
14
14
 
@@ -12,7 +12,7 @@ module TwitterCldr
12
12
 
13
13
  class LocalesResourcesImporter
14
14
 
15
- COMPONENTS = %w[calendars languages numbers units plurals lists layout]
15
+ COMPONENTS = %w[calendars languages numbers units plurals lists layout currencies]
16
16
 
17
17
  # Arguments:
18
18
  #
@@ -39,19 +39,23 @@ module TwitterCldr
39
39
  # Copies zh plurals to zh-Hant (they can share, but locale code needs to be different).
40
40
  #
41
41
  def copy_zh_hant_plurals
42
- File.open(File.join(@output_path, 'zh-Hant', 'plurals.yml'), 'w:utf-8') do |output|
43
- data = YAML.load(File.read(File.join(@output_path, 'zh', 'plurals.yml')))
42
+ File.open(File.join(@output_path, 'locales', 'zh-Hant', 'plurals.yml'), 'w:utf-8') do |output|
43
+ data = YAML.load(File.read(File.join(@output_path, 'locales', 'zh', 'plurals.yml')))
44
44
  output.write(YAML.dump(:'zh-Hant' => data[:zh].gsub(':zh', ":'zh-Hant'")))
45
45
  end
46
46
  end
47
47
 
48
48
  def import_components
49
- Cldr::Export.export(:locales => TwitterCldr.supported_locales, :components => COMPONENTS, :target => @output_path) do |component, locale, path|
49
+ Cldr::Export.export(:locales => TwitterCldr.supported_locales, :components => COMPONENTS, :target => File.join(@output_path, 'locales')) do |component, locale, path|
50
50
  add_buddhist_calendar(component, locale, path)
51
51
  process_plurals(component, locale, path)
52
52
  deep_symbolize(component, locale, path)
53
53
  end
54
54
 
55
+ Cldr::Export.export(:components => ["currency_digits_and_rounding"], :target => File.join(@output_path, 'shared')) do |component, locale, path|
56
+ deep_symbolize(component, locale, path)
57
+ end
58
+
55
59
  copy_zh_hant_plurals
56
60
  end
57
61
 
@@ -65,7 +69,7 @@ module TwitterCldr
65
69
  end
66
70
 
67
71
  def process_plurals(component, locale, path)
68
- return unless component == 'plurals'
72
+ return unless component == 'Plurals'
69
73
 
70
74
  plural_rules = File.read(path)
71
75
 
@@ -79,7 +83,7 @@ module TwitterCldr
79
83
  # TODO: export buddhist calendar from CLDR data instead of using BUDDHIST_CALENDAR constant.
80
84
  #
81
85
  def add_buddhist_calendar(component, locale, path)
82
- return unless component == 'calendars' && locale == :th
86
+ return unless component == 'Calendars' && locale == :th
83
87
 
84
88
  data = YAML.load(File.read(path))
85
89
  data['th']['calendars']['buddhist'] = BUDDHIST_CALENDAR
@@ -465,36 +465,36 @@ module TwitterCldr
465
465
 
466
466
  # Process from the end as we are copying the array over itself here.
467
467
  (@formatter_indices.size - 1).downto(0) do |index|
468
- next_fmt = @formatter_indices[index]
469
-
470
- # nextFmt points to a location in the original array. So,
471
- # nextFmt+1 is the target of our copying. output is the location
472
- # to which we last copied, thus we can derive the length of the
473
- # copy from it.
474
- len = output - next_fmt - 1
475
- output = next_fmt
476
- input -= len
477
-
478
- # Note that we no longer need 'types' at this point, so we
479
- # only edit 'levels'.
480
- if next_fmt + 1 < @levels.size
481
- arraycopy(@levels, input, @levels, next_fmt + 1, len)
482
- end
468
+ next_fmt = @formatter_indices[index]
469
+
470
+ # nextFmt points to a location in the original array. So,
471
+ # nextFmt+1 is the target of our copying. output is the location
472
+ # to which we last copied, thus we can derive the length of the
473
+ # copy from it.
474
+ len = output - next_fmt - 1
475
+ output = next_fmt
476
+ input -= len
477
+
478
+ # Note that we no longer need 'types' at this point, so we
479
+ # only edit 'levels'.
480
+ if next_fmt + 1 < @levels.size
481
+ arraycopy(@levels, input, @levels, next_fmt + 1, len)
482
+ end
483
483
 
484
- # Now set the level at the reinsertion point.
485
- right_level = if output == @levels.length - 1
486
- @base_embedding
487
- else
488
- @levels[output + 1] || 0
489
- end
484
+ # Now set the level at the reinsertion point.
485
+ right_level = if output == @levels.length - 1
486
+ @base_embedding
487
+ else
488
+ @levels[output + 1] || 0
489
+ end
490
490
 
491
- left_level = if input == 0
492
- @base_embedding
493
- else
494
- @levels[input] || 0;
495
- end
491
+ left_level = if input == 0
492
+ @base_embedding
493
+ else
494
+ @levels[input] || 0;
495
+ end
496
496
 
497
- @levels[output] = [left_level, right_level].max
497
+ @levels[output] = [left_level, right_level].max
498
498
  end
499
499
  end
500
500