twitter_cldr 1.9.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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