twitter_cldr 2.2.0 → 2.4.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 (387) hide show
  1. data/Gemfile +2 -2
  2. data/History.txt +11 -0
  3. data/README.md +2 -2
  4. data/Rakefile +1 -1
  5. data/lib/twitter_cldr.rb +1 -0
  6. data/lib/twitter_cldr/core_ext.rb +1 -1
  7. data/lib/twitter_cldr/formatters/base.rb +3 -3
  8. data/lib/twitter_cldr/formatters/calendars/datetime_formatter.rb +32 -23
  9. data/lib/twitter_cldr/formatters/numbers/abbreviated/abbreviated_number_formatter.rb +3 -2
  10. data/lib/twitter_cldr/localized/localized_date.rb +32 -13
  11. data/lib/twitter_cldr/localized/localized_datetime.rb +24 -6
  12. data/lib/twitter_cldr/localized/localized_time.rb +12 -3
  13. data/lib/twitter_cldr/resources/download.rb +7 -1
  14. data/lib/twitter_cldr/resources/language_codes_importer.rb +8 -8
  15. data/lib/twitter_cldr/resources/loader.rb +1 -1
  16. data/lib/twitter_cldr/resources/tailoring_importer.rb +1 -3
  17. data/lib/twitter_cldr/shared/languages.rb +1 -1
  18. data/lib/twitter_cldr/tokenizers/calendars/datetime_tokenizer.rb +2 -1
  19. data/lib/twitter_cldr/version.rb +1 -1
  20. data/resources/collation/tailoring/af.yml +0 -1
  21. data/resources/collation/tailoring/ar.yml +3 -12
  22. data/resources/collation/tailoring/be.yml +4 -5
  23. data/resources/collation/tailoring/bg.yml +1 -2
  24. data/resources/collation/tailoring/bn.yml +3 -5
  25. data/resources/collation/tailoring/ca.yml +3 -6
  26. data/resources/collation/tailoring/cs.yml +3 -14
  27. data/resources/collation/tailoring/cy.yml +3 -26
  28. data/resources/collation/tailoring/da.yml +3 -31
  29. data/resources/collation/tailoring/de.yml +0 -1
  30. data/resources/collation/tailoring/el.yml +0 -1
  31. data/resources/collation/tailoring/en.yml +0 -1
  32. data/resources/collation/tailoring/es.yml +3 -4
  33. data/resources/collation/tailoring/eu.yml +0 -1
  34. data/resources/collation/tailoring/fa.yml +3 -38
  35. data/resources/collation/tailoring/fi.yml +3 -24
  36. data/resources/collation/tailoring/fil.yml +3 -7
  37. data/resources/collation/tailoring/fr.yml +0 -1
  38. data/resources/collation/tailoring/ga.yml +0 -1
  39. data/resources/collation/tailoring/gl.yml +0 -1
  40. data/resources/collation/tailoring/he.yml +3 -2
  41. data/resources/collation/tailoring/hi.yml +3 -5
  42. data/resources/collation/tailoring/hu.yml +3 -64
  43. data/resources/collation/tailoring/id.yml +0 -1
  44. data/resources/collation/tailoring/it.yml +0 -1
  45. data/resources/collation/tailoring/ja.yml +55 -7429
  46. data/resources/collation/tailoring/ko.yml +3 -7478
  47. data/resources/collation/tailoring/lv.yml +3 -18
  48. data/resources/collation/tailoring/ms.yml +0 -1
  49. data/resources/collation/tailoring/nb.yml +3 -31
  50. data/resources/collation/tailoring/nl.yml +0 -1
  51. data/resources/collation/tailoring/pl.yml +3 -20
  52. data/resources/collation/tailoring/pt.yml +0 -1
  53. data/resources/collation/tailoring/ro.yml +3 -16
  54. data/resources/collation/tailoring/ru.yml +1 -2
  55. data/resources/collation/tailoring/sk.yml +3 -18
  56. data/resources/collation/tailoring/sq.yml +3 -33
  57. data/resources/collation/tailoring/sr.yml +1 -2
  58. data/resources/collation/tailoring/sv.yml +3 -30
  59. data/resources/collation/tailoring/ta.yml +3 -29
  60. data/resources/collation/tailoring/th.yml +3 -11
  61. data/resources/collation/tailoring/tr.yml +3 -15
  62. data/resources/collation/tailoring/uk.yml +4 -5
  63. data/resources/collation/tailoring/ur.yml +3 -83
  64. data/resources/collation/tailoring/vi.yml +3 -20
  65. data/resources/collation/tailoring/zh-Hant.yml +14 -75240
  66. data/resources/collation/tailoring/zh.yml +44 -41897
  67. data/resources/collation/tries/af.dump +0 -0
  68. data/resources/collation/tries/ar.dump +0 -0
  69. data/resources/collation/tries/be.dump +0 -0
  70. data/resources/collation/tries/bg.dump +0 -0
  71. data/resources/collation/tries/bn.dump +0 -0
  72. data/resources/collation/tries/ca.dump +0 -0
  73. data/resources/collation/tries/cs.dump +0 -0
  74. data/resources/collation/tries/cy.dump +0 -0
  75. data/resources/collation/tries/da.dump +0 -0
  76. data/resources/collation/tries/de.dump +0 -0
  77. data/resources/collation/tries/default.dump +0 -0
  78. data/resources/collation/tries/el.dump +0 -0
  79. data/resources/collation/tries/en.dump +0 -0
  80. data/resources/collation/tries/es.dump +0 -0
  81. data/resources/collation/tries/eu.dump +0 -0
  82. data/resources/collation/tries/fa.dump +0 -0
  83. data/resources/collation/tries/fi.dump +0 -0
  84. data/resources/collation/tries/fil.dump +0 -0
  85. data/resources/collation/tries/fr.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/he.dump +0 -0
  89. data/resources/collation/tries/hi.dump +0 -0
  90. data/resources/collation/tries/hu.dump +0 -0
  91. data/resources/collation/tries/id.dump +0 -0
  92. data/resources/collation/tries/it.dump +0 -0
  93. data/resources/collation/tries/ja.dump +0 -0
  94. data/resources/collation/tries/ko.dump +0 -0
  95. data/resources/collation/tries/lv.dump +0 -0
  96. data/resources/collation/tries/ms.dump +0 -0
  97. data/resources/collation/tries/nb.dump +0 -0
  98. data/resources/collation/tries/nl.dump +0 -0
  99. data/resources/collation/tries/pl.dump +0 -0
  100. data/resources/collation/tries/pt.dump +0 -0
  101. data/resources/collation/tries/ro.dump +0 -0
  102. data/resources/collation/tries/ru.dump +0 -0
  103. data/resources/collation/tries/sk.dump +0 -0
  104. data/resources/collation/tries/sq.dump +0 -0
  105. data/resources/collation/tries/sr.dump +0 -0
  106. data/resources/collation/tries/sv.dump +0 -0
  107. data/resources/collation/tries/ta.dump +0 -0
  108. data/resources/collation/tries/th.dump +0 -0
  109. data/resources/collation/tries/tr.dump +0 -0
  110. data/resources/collation/tries/uk.dump +0 -0
  111. data/resources/collation/tries/ur.dump +0 -0
  112. data/resources/collation/tries/vi.dump +0 -0
  113. data/resources/collation/tries/zh-Hant.dump +0 -0
  114. data/resources/collation/tries/zh.dump +0 -0
  115. data/resources/locales/af/calendars.yml +5 -4
  116. data/resources/locales/af/currencies.yml +2 -0
  117. data/resources/locales/af/layout.yml +2 -1
  118. data/resources/locales/ar/calendars.yml +10 -10
  119. data/resources/locales/ar/currencies.yml +7 -0
  120. data/resources/locales/ar/layout.yml +1 -1
  121. data/resources/locales/be/calendars.yml +9 -9
  122. data/resources/locales/be/currencies.yml +1 -2
  123. data/resources/locales/be/layout.yml +2 -1
  124. data/resources/locales/bg/calendars.yml +8 -11
  125. data/resources/locales/bg/currencies.yml +3 -0
  126. data/resources/locales/bg/layout.yml +2 -1
  127. data/resources/locales/bg/territories.yml +1 -1
  128. data/resources/locales/bn/calendars.yml +6 -7
  129. data/resources/locales/bn/currencies.yml +2 -0
  130. data/resources/locales/bn/layout.yml +2 -1
  131. data/resources/locales/bn/territories.yml +1 -1
  132. data/resources/locales/ca/calendars.yml +8 -7
  133. data/resources/locales/ca/currencies.yml +3 -0
  134. data/resources/locales/ca/layout.yml +2 -1
  135. data/resources/locales/cs/calendars.yml +10 -11
  136. data/resources/locales/cs/currencies.yml +4 -0
  137. data/resources/locales/cs/layout.yml +2 -1
  138. data/resources/locales/cs/territories.yml +1 -1
  139. data/resources/locales/cy/calendars.yml +22 -12
  140. data/resources/locales/cy/currencies.yml +1080 -3
  141. data/resources/locales/cy/languages.yml +107 -23
  142. data/resources/locales/cy/layout.yml +2 -1
  143. data/resources/locales/cy/lists.yml +1 -1
  144. data/resources/locales/cy/numbers.yml +16 -4
  145. data/resources/locales/cy/territories.yml +257 -1
  146. data/resources/locales/cy/units.yml +175 -28
  147. data/resources/locales/da/calendars.yml +6 -9
  148. data/resources/locales/da/currencies.yml +3 -0
  149. data/resources/locales/da/layout.yml +2 -1
  150. data/resources/locales/da/territories.yml +1 -1
  151. data/resources/locales/de/calendars.yml +8 -11
  152. data/resources/locales/de/currencies.yml +3 -0
  153. data/resources/locales/de/layout.yml +2 -1
  154. data/resources/locales/de/territories.yml +1 -1
  155. data/resources/locales/el/calendars.yml +9 -11
  156. data/resources/locales/el/currencies.yml +3 -0
  157. data/resources/locales/el/layout.yml +2 -1
  158. data/resources/locales/el/numbers.yml +1 -0
  159. data/resources/locales/el/territories.yml +1 -1
  160. data/resources/locales/en/calendars.yml +8 -5
  161. data/resources/locales/en/currencies.yml +3 -0
  162. data/resources/locales/en/languages.yml +2 -1
  163. data/resources/locales/en/layout.yml +2 -1
  164. data/resources/locales/en/territories.yml +3 -3
  165. data/resources/locales/es/calendars.yml +6 -7
  166. data/resources/locales/es/currencies.yml +3 -0
  167. data/resources/locales/es/layout.yml +2 -1
  168. data/resources/locales/es/territories.yml +2 -2
  169. data/resources/locales/eu/calendars.yml +5 -4
  170. data/resources/locales/eu/currencies.yml +2 -0
  171. data/resources/locales/eu/layout.yml +2 -1
  172. data/resources/locales/eu/territories.yml +1 -1
  173. data/resources/locales/fa/calendars.yml +6 -8
  174. data/resources/locales/fa/currencies.yml +2 -0
  175. data/resources/locales/fa/layout.yml +1 -1
  176. data/resources/locales/fa/territories.yml +1 -1
  177. data/resources/locales/fi/calendars.yml +11 -14
  178. data/resources/locales/fi/currencies.yml +3 -0
  179. data/resources/locales/fi/layout.yml +2 -1
  180. data/resources/locales/fil/calendars.yml +5 -5
  181. data/resources/locales/fil/currencies.yml +2 -0
  182. data/resources/locales/fil/layout.yml +2 -1
  183. data/resources/locales/fil/territories.yml +1 -1
  184. data/resources/locales/fr/calendars.yml +9 -16
  185. data/resources/locales/fr/currencies.yml +3 -1
  186. data/resources/locales/fr/layout.yml +2 -1
  187. data/resources/locales/fr/territories.yml +2 -2
  188. data/resources/locales/ga/calendars.yml +13 -12
  189. data/resources/locales/ga/currencies.yml +2 -0
  190. data/resources/locales/ga/layout.yml +2 -1
  191. data/resources/locales/gl/calendars.yml +6 -6
  192. data/resources/locales/gl/currencies.yml +2 -0
  193. data/resources/locales/gl/layout.yml +2 -1
  194. data/resources/locales/gl/territories.yml +1 -1
  195. data/resources/locales/he/calendars.yml +8 -16
  196. data/resources/locales/he/currencies.yml +2 -0
  197. data/resources/locales/he/layout.yml +1 -1
  198. data/resources/locales/he/territories.yml +1 -1
  199. data/resources/locales/hi/calendars.yml +8 -10
  200. data/resources/locales/hi/currencies.yml +2 -0
  201. data/resources/locales/hi/languages.yml +64 -74
  202. data/resources/locales/hi/layout.yml +2 -1
  203. data/resources/locales/hi/territories.yml +32 -32
  204. data/resources/locales/hr/calendars.yml +6 -7
  205. data/resources/locales/hr/currencies.yml +5 -0
  206. data/resources/locales/hr/layout.yml +2 -1
  207. data/resources/locales/hr/territories.yml +1 -1
  208. data/resources/locales/hu/calendars.yml +9 -11
  209. data/resources/locales/hu/currencies.yml +2 -0
  210. data/resources/locales/hu/layout.yml +2 -1
  211. data/resources/locales/hu/territories.yml +1 -1
  212. data/resources/locales/id/calendars.yml +7 -6
  213. data/resources/locales/id/currencies.yml +2 -0
  214. data/resources/locales/id/languages.yml +9 -9
  215. data/resources/locales/id/layout.yml +2 -1
  216. data/resources/locales/id/territories.yml +1 -1
  217. data/resources/locales/is/calendars.yml +7 -8
  218. data/resources/locales/is/currencies.yml +2 -0
  219. data/resources/locales/is/layout.yml +2 -1
  220. data/resources/locales/is/territories.yml +1 -1
  221. data/resources/locales/it/calendars.yml +5 -8
  222. data/resources/locales/it/currencies.yml +3 -0
  223. data/resources/locales/it/layout.yml +2 -1
  224. data/resources/locales/it/territories.yml +1 -1
  225. data/resources/locales/ja/calendars.yml +12 -12
  226. data/resources/locales/ja/currencies.yml +2 -0
  227. data/resources/locales/ja/layout.yml +2 -1
  228. data/resources/locales/ko/calendars.yml +12 -11
  229. data/resources/locales/ko/currencies.yml +2 -0
  230. data/resources/locales/ko/layout.yml +2 -1
  231. data/resources/locales/ko/territories.yml +1 -1
  232. data/resources/locales/lv/calendars.yml +6 -6
  233. data/resources/locales/lv/currencies.yml +4 -0
  234. data/resources/locales/lv/layout.yml +2 -1
  235. data/resources/locales/ms/calendars.yml +5 -4
  236. data/resources/locales/ms/currencies.yml +2 -0
  237. data/resources/locales/ms/layout.yml +2 -1
  238. data/resources/locales/ms/territories.yml +1 -1
  239. data/resources/locales/nb/calendars.yml +7 -7
  240. data/resources/locales/nb/currencies.yml +3 -0
  241. data/resources/locales/nb/layout.yml +2 -1
  242. data/resources/locales/nb/territories.yml +1 -1
  243. data/resources/locales/nl/calendars.yml +5 -8
  244. data/resources/locales/nl/currencies.yml +3 -0
  245. data/resources/locales/nl/layout.yml +2 -1
  246. data/resources/locales/nl/territories.yml +1 -1
  247. data/resources/locales/pl/calendars.yml +9 -10
  248. data/resources/locales/pl/currencies.yml +5 -0
  249. data/resources/locales/pl/layout.yml +2 -1
  250. data/resources/locales/pl/territories.yml +1 -1
  251. data/resources/locales/pt/calendars.yml +9 -14
  252. data/resources/locales/pt/currencies.yml +3 -0
  253. data/resources/locales/pt/layout.yml +2 -1
  254. data/resources/locales/pt/territories.yml +1 -1
  255. data/resources/locales/ro/calendars.yml +10 -12
  256. data/resources/locales/ro/currencies.yml +4 -0
  257. data/resources/locales/ro/layout.yml +2 -1
  258. data/resources/locales/ro/territories.yml +1 -1
  259. data/resources/locales/ru/calendars.yml +8 -13
  260. data/resources/locales/ru/currencies.yml +5 -0
  261. data/resources/locales/ru/languages.yml +1 -1
  262. data/resources/locales/ru/layout.yml +2 -1
  263. data/resources/locales/ru/territories.yml +15 -15
  264. data/resources/locales/sk/calendars.yml +23 -48
  265. data/resources/locales/sk/currencies.yml +5 -1
  266. data/resources/locales/sk/layout.yml +2 -1
  267. data/resources/locales/sk/territories.yml +1 -1
  268. data/resources/locales/sq/calendars.yml +9 -9
  269. data/resources/locales/sq/layout.yml +2 -1
  270. data/resources/locales/sr/calendars.yml +7 -12
  271. data/resources/locales/sr/currencies.yml +5 -0
  272. data/resources/locales/sr/languages.yml +4 -4
  273. data/resources/locales/sr/layout.yml +2 -1
  274. data/resources/locales/sr/territories.yml +1 -1
  275. data/resources/locales/sv/calendars.yml +53 -57
  276. data/resources/locales/sv/currencies.yml +4 -2
  277. data/resources/locales/sv/layout.yml +2 -1
  278. data/resources/locales/sv/numbers.yml +0 -1
  279. data/resources/locales/sv/territories.yml +1 -1
  280. data/resources/locales/ta/calendars.yml +6 -5
  281. data/resources/locales/ta/currencies.yml +2 -0
  282. data/resources/locales/ta/layout.yml +2 -1
  283. data/resources/locales/ta/territories.yml +1 -1
  284. data/resources/locales/th/calendars.yml +7 -8
  285. data/resources/locales/th/currencies.yml +2 -0
  286. data/resources/locales/th/layout.yml +2 -1
  287. data/resources/locales/tr/calendars.yml +8 -11
  288. data/resources/locales/tr/currencies.yml +3 -1
  289. data/resources/locales/tr/layout.yml +2 -1
  290. data/resources/locales/tr/territories.yml +1 -1
  291. data/resources/locales/uk/calendars.yml +8 -10
  292. data/resources/locales/uk/currencies.yml +5 -0
  293. data/resources/locales/uk/layout.yml +2 -1
  294. data/resources/locales/ur/calendars.yml +8 -7
  295. data/resources/locales/ur/currencies.yml +3 -1
  296. data/resources/locales/ur/layout.yml +1 -1
  297. data/resources/locales/ur/territories.yml +1 -1
  298. data/resources/locales/vi/calendars.yml +19 -19
  299. data/resources/locales/vi/currencies.yml +2 -0
  300. data/resources/locales/vi/layout.yml +2 -1
  301. data/resources/locales/vi/territories.yml +1 -1
  302. data/resources/locales/zh-Hant/calendars.yml +7 -10
  303. data/resources/locales/zh-Hant/currencies.yml +2 -0
  304. data/resources/locales/zh-Hant/layout.yml +2 -1
  305. data/resources/locales/zh/calendars.yml +7 -10
  306. data/resources/locales/zh/currencies.yml +2 -0
  307. data/resources/locales/zh/layout.yml +2 -1
  308. data/resources/locales/zh/territories.yml +4 -4
  309. data/resources/shared/currency_digits_and_rounding.yml +4 -1
  310. data/resources/shared/language_codes_table.dump +0 -0
  311. data/resources/shared/phone_codes.yml +1 -0
  312. data/resources/shared/postal_codes.yml +159 -159
  313. data/resources/unicode_data/blocks/alphabetic_presentation_forms.yml +23 -23
  314. data/resources/unicode_data/blocks/arabic.yml +4 -4
  315. data/resources/unicode_data/blocks/arabic_mathematical_alphabetic_symbols.yml +141 -141
  316. data/resources/unicode_data/blocks/arabic_presentation_forms_a.yml +593 -593
  317. data/resources/unicode_data/blocks/arabic_presentation_forms_b.yml +139 -139
  318. data/resources/unicode_data/blocks/armenian.yml +1 -1
  319. data/resources/unicode_data/blocks/basic_latin.yml +33 -33
  320. data/resources/unicode_data/blocks/cjk_compatibility.yml +256 -256
  321. data/resources/unicode_data/blocks/cjk_compatibility_forms.yml +30 -30
  322. data/resources/unicode_data/blocks/cjk_radicals_supplement.yml +2 -2
  323. data/resources/unicode_data/blocks/cjk_symbols_and_punctuation.yml +5 -5
  324. data/resources/unicode_data/blocks/cjk_unified_ideographs.yml +2 -2
  325. data/resources/unicode_data/blocks/cjk_unified_ideographs_extension_a.yml +2 -2
  326. data/resources/unicode_data/blocks/cjk_unified_ideographs_extension_b.yml +2 -2
  327. data/resources/unicode_data/blocks/cjk_unified_ideographs_extension_c.yml +2 -2
  328. data/resources/unicode_data/blocks/cjk_unified_ideographs_extension_d.yml +2 -2
  329. data/resources/unicode_data/blocks/cuneiform_numbers_and_punctuation.yml +4 -4
  330. data/resources/unicode_data/blocks/currency_symbols.yml +17 -1
  331. data/resources/unicode_data/blocks/enclosed_alphanumeric_supplement.yml +77 -77
  332. data/resources/unicode_data/blocks/enclosed_alphanumerics.yml +139 -139
  333. data/resources/unicode_data/blocks/enclosed_cjk_letters_and_months.yml +245 -245
  334. data/resources/unicode_data/blocks/enclosed_ideographic_supplement.yml +57 -57
  335. data/resources/unicode_data/blocks/general_punctuation.yml +26 -26
  336. data/resources/unicode_data/blocks/georgian.yml +1 -1
  337. data/resources/unicode_data/blocks/greek_and_coptic.yml +13 -13
  338. data/resources/unicode_data/blocks/greek_extended.yml +4 -4
  339. data/resources/unicode_data/blocks/halfwidth_and_fullwidth_forms.yml +225 -225
  340. data/resources/unicode_data/blocks/hangul_compatibility_jamo.yml +94 -94
  341. data/resources/unicode_data/blocks/hangul_syllables.yml +2 -2
  342. data/resources/unicode_data/blocks/high_private_use_surrogates.yml +2 -2
  343. data/resources/unicode_data/blocks/high_surrogates.yml +2 -2
  344. data/resources/unicode_data/blocks/hiragana.yml +3 -3
  345. data/resources/unicode_data/blocks/kanbun.yml +14 -14
  346. data/resources/unicode_data/blocks/kangxi_radicals.yml +214 -214
  347. data/resources/unicode_data/blocks/katakana.yml +1 -1
  348. data/resources/unicode_data/blocks/lao.yml +3 -3
  349. data/resources/unicode_data/blocks/latin_1_supplement.yml +46 -46
  350. data/resources/unicode_data/blocks/latin_extended_a.yml +6 -6
  351. data/resources/unicode_data/blocks/latin_extended_additional.yml +1 -1
  352. data/resources/unicode_data/blocks/latin_extended_b.yml +12 -12
  353. data/resources/unicode_data/blocks/latin_extended_c.yml +2 -2
  354. data/resources/unicode_data/blocks/latin_extended_d.yml +3 -3
  355. data/resources/unicode_data/blocks/letterlike_symbols.yml +53 -53
  356. data/resources/unicode_data/blocks/low_surrogates.yml +2 -2
  357. data/resources/unicode_data/blocks/mathematical_alphanumeric_symbols.yml +996 -996
  358. data/resources/unicode_data/blocks/mathematical_operators.yml +4 -4
  359. data/resources/unicode_data/blocks/number_forms.yml +49 -49
  360. data/resources/unicode_data/blocks/phonetic_extensions.yml +61 -61
  361. data/resources/unicode_data/blocks/phonetic_extensions_supplement.yml +37 -37
  362. data/resources/unicode_data/blocks/private_use_area.yml +2 -2
  363. data/resources/unicode_data/blocks/small_form_variants.yml +26 -26
  364. data/resources/unicode_data/blocks/spacing_modifier_letters.yml +20 -20
  365. data/resources/unicode_data/blocks/superscripts_and_subscripts.yml +42 -42
  366. data/resources/unicode_data/blocks/supplemental_mathematical_operators.yml +4 -4
  367. data/resources/unicode_data/blocks/supplementary_private_use_area_a.yml +2 -2
  368. data/resources/unicode_data/blocks/supplementary_private_use_area_b.yml +2 -2
  369. data/resources/unicode_data/blocks/thai.yml +1 -1
  370. data/resources/unicode_data/blocks/tibetan.yml +4 -4
  371. data/resources/unicode_data/blocks/tifinagh.yml +1 -1
  372. data/resources/unicode_data/blocks/vertical_forms.yml +10 -10
  373. data/spec/collation/trie_dumps_spec.rb +1 -1
  374. data/spec/core_ext_spec.rb +1 -1
  375. data/spec/formatters/calendars/datetime_formatter_spec.rb +1 -1
  376. data/spec/formatters/numbers/abbreviated/long_decimal_formatter_spec.rb +4 -0
  377. data/spec/formatters/numbers/abbreviated/short_decimal_formatter_spec.rb +4 -0
  378. data/spec/formatters/numbers/currency_formatter_spec.rb +5 -3
  379. data/spec/localized/localized_date_spec.rb +36 -27
  380. data/spec/localized/localized_datetime_spec.rb +10 -1
  381. data/spec/localized/localized_time_spec.rb +11 -1
  382. data/spec/readme_spec.rb +10 -11
  383. data/spec/resources/loader_spec.rb +18 -8
  384. data/spec/shared/currencies_spec.rb +1 -1
  385. data/spec/tokenizers/calendars/datetime_tokenizer_spec.rb +2 -2
  386. data/twitter_cldr.gemspec +1 -0
  387. metadata +56 -49
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
@@ -10,7 +10,7 @@ end
10
10
 
11
11
  group :development do
12
12
  gem 'nokogiri'
13
- gem 'ruby-cldr', :github => 'svenfuchs/ruby-cldr'
13
+ gem 'ruby-cldr', :github => 'camertron/ruby-cldr'
14
14
  end
15
15
 
16
16
  group :test do
data/History.txt CHANGED
@@ -1,3 +1,14 @@
1
+ == 2.4.0
2
+
3
+ * Upgrade to CLDR v23.
4
+ * Ability to disable loading of any custom locale resources.
5
+ * Long and short decimal formatters now respect the :precision option.
6
+
7
+ == 2.3.0
8
+
9
+ * Adding timezone support to date/time formatting.
10
+ * Removing the localize method from Date objects. Call to_date on a LocalizedDateTime or LocalizedTime object instead.
11
+
1
12
  == 2.2.0
2
13
 
3
14
  * Relaxing JSON dependency to give users more version flexibility. JSON gem now has no version number in twitter-cldr-rb.
data/README.md CHANGED
@@ -89,8 +89,8 @@ In addition to formatting regular decimals, TwitterCLDR supports short and long
89
89
  `Date`, `Time`, and `DateTime` objects are supported:
90
90
 
91
91
  ```ruby
92
- DateTime.now.localize(:es).to_full_s # "lunes, 12 de diciembre de 2011 21:44:57 UTC -0800"
93
- DateTime.now.localize(:es).to_long_s # "12 de diciembre de 2011 21:44:57 -08:00"
92
+ DateTime.now.localize(:es).to_full_s # "lunes, 12 de diciembre de 2011 21:44:57 UTC -08:00"
93
+ DateTime.now.localize(:es).to_long_s # "12 de diciembre de 2011 21:44:57 UTC"
94
94
  DateTime.now.localize(:es).to_medium_s # "12/12/2011 21:44:57"
95
95
  DateTime.now.localize(:es).to_short_s # "12/12/11 21:44"
96
96
 
data/Rakefile CHANGED
@@ -80,7 +80,7 @@ namespace :update do
80
80
  TwitterCldr::Resources::TailoringImporter.new(
81
81
  args[:cldr_path] || './vendor/cldr',
82
82
  './resources/collation/tailoring',
83
- args[:icu4j_jar_path] ||'./vendor/icu4j-49_1.jar'
83
+ args[:icu4j_jar_path] ||'./vendor/icu4j-50_1_1.jar'
84
84
  ).import(TwitterCldr.supported_locales)
85
85
  end
86
86
 
data/lib/twitter_cldr.rb CHANGED
@@ -56,6 +56,7 @@ module TwitterCldr
56
56
  class << self
57
57
 
58
58
  attr_writer :locale
59
+ attr_accessor :disable_custom_locale_resources
59
60
 
60
61
  def resources
61
62
  @resources ||= TwitterCldr::Resources::Loader.new
@@ -7,6 +7,6 @@
7
7
  TwitterCldr::Localized::LocalizedNumber.localize(klass)
8
8
  end
9
9
 
10
- [Array, Date, DateTime, String, Symbol, Time, Hash].each do |klass|
10
+ [Array, DateTime, String, Symbol, Time, Hash].each do |klass|
11
11
  TwitterCldr::Localized::const_get("Localized#{klass}").localize(klass)
12
12
  end
@@ -9,12 +9,12 @@ module TwitterCldr
9
9
  attr_reader :tokenizer
10
10
 
11
11
  def format(obj, options = {})
12
- process_tokens(self.get_tokens(obj, options), obj)
12
+ process_tokens(self.get_tokens(obj, options), obj, options)
13
13
  end
14
14
 
15
15
  protected
16
16
 
17
- def process_tokens(tokens, obj)
17
+ def process_tokens(tokens, obj, options = {})
18
18
  result = ""
19
19
 
20
20
  tokens.each_with_index do |token, index|
@@ -22,7 +22,7 @@ module TwitterCldr
22
22
  when :composite
23
23
  result << eval(process_tokens(token.tokens, obj)).to_s
24
24
  when :pattern
25
- result << self.result_for_token(token, index, obj)
25
+ result << self.result_for_token(token, index, obj, options)
26
26
  else
27
27
  if token.value.size > 0 && token.value[0].chr == "'" && token.value[-1].chr == "'"
28
28
  result << token.value[1..-2]
@@ -6,6 +6,8 @@
6
6
  # This class has been adapted from Sven Fuch's ruby-cldr gem
7
7
  # See LICENSE for the accompanying license for his contributions
8
8
 
9
+ require 'tzinfo'
10
+
9
11
  module TwitterCldr
10
12
  module Formatters
11
13
  class DateTimeFormatter < Base
@@ -49,8 +51,8 @@ module TwitterCldr
49
51
  )
50
52
  end
51
53
 
52
- def result_for_token(token, index, date)
53
- self.send(METHODS[token.value[0].chr], date, token.value, token.value.size)
54
+ def result_for_token(token, index, date, options = {})
55
+ self.send(METHODS[token.value[0].chr], date, token.value, token.value.size, options)
54
56
  end
55
57
 
56
58
  def additional_format_selector
@@ -69,7 +71,7 @@ module TwitterCldr
69
71
 
70
72
  # there is incomplete era data in CLDR for certain locales like Hindi
71
73
  # fall back if that happens
72
- def era(date, pattern, length)
74
+ def era(date, pattern, length, options = {})
73
75
  choices = case length
74
76
  when 0
75
77
  ["", ""]
@@ -86,22 +88,22 @@ module TwitterCldr
86
88
  end
87
89
  end
88
90
 
89
- def year(date, pattern, length)
91
+ def year(date, pattern, length, options = {})
90
92
  year = date.year.to_s
91
93
  year = year.length == 1 ? year : year[-2, 2] if length == 2
92
94
  year = year.rjust(length, '0') if length > 1
93
95
  year
94
96
  end
95
97
 
96
- def year_of_week_of_year(date, pattern, length)
98
+ def year_of_week_of_year(date, pattern, length, options = {})
97
99
  raise NotImplementedError
98
100
  end
99
101
 
100
- def day_of_week_in_month(date, pattern, length) # e.g. 2nd Wed in July
102
+ def day_of_week_in_month(date, pattern, length, options = {}) # e.g. 2nd Wed in July
101
103
  raise NotImplementedError
102
104
  end
103
105
 
104
- def quarter(date, pattern, length)
106
+ def quarter(date, pattern, length, options = {})
105
107
  quarter = (date.month.to_i - 1) / 3 + 1
106
108
  case length
107
109
  when 1
@@ -115,7 +117,7 @@ module TwitterCldr
115
117
  end
116
118
  end
117
119
 
118
- def quarter_stand_alone(date, pattern, length)
120
+ def quarter_stand_alone(date, pattern, length, options = {})
119
121
  quarter = (date.month.to_i - 1) / 3 + 1
120
122
  case length
121
123
  when 1
@@ -133,7 +135,7 @@ module TwitterCldr
133
135
  end
134
136
  end
135
137
 
136
- def month(date, pattern, length)
138
+ def month(date, pattern, length, options = {})
137
139
  case length
138
140
  when 1
139
141
  date.month.to_s
@@ -151,7 +153,7 @@ module TwitterCldr
151
153
  end
152
154
  end
153
155
 
154
- def month_stand_alone(date, pattern, length)
156
+ def month_stand_alone(date, pattern, length, options = {})
155
157
  case length
156
158
  when 1
157
159
  date.month.to_s
@@ -168,7 +170,7 @@ module TwitterCldr
168
170
  end
169
171
  end
170
172
 
171
- def day(date, pattern, length)
173
+ def day(date, pattern, length, options = {})
172
174
  case length
173
175
  when 1
174
176
  date.day.to_s
@@ -177,7 +179,7 @@ module TwitterCldr
177
179
  end
178
180
  end
179
181
 
180
- def weekday(date, pattern, length)
182
+ def weekday(date, pattern, length, options = {})
181
183
  key = WEEKDAY_KEYS[date.wday]
182
184
  case length
183
185
  when 1..3
@@ -189,7 +191,7 @@ module TwitterCldr
189
191
  end
190
192
  end
191
193
 
192
- def weekday_local(date, pattern, length)
194
+ def weekday_local(date, pattern, length, options = {})
193
195
  # "Like E except adds a numeric value depending on the local starting day of the week"
194
196
  # CLDR does not contain data as to which day is the first day of the week, so we will assume Monday (Ruby default)
195
197
  case length
@@ -200,7 +202,7 @@ module TwitterCldr
200
202
  end
201
203
  end
202
204
 
203
- def weekday_local_stand_alone(date, pattern, length)
205
+ def weekday_local_stand_alone(date, pattern, length, options = {})
204
206
  case length
205
207
  when 1
206
208
  weekday_local(date, pattern, length)
@@ -209,14 +211,14 @@ module TwitterCldr
209
211
  end
210
212
  end
211
213
 
212
- def period(time, pattern, length)
214
+ def period(time, pattern, length, options = {})
213
215
  # Always use :wide form. Day-period design was changed in CLDR -
214
216
  # http://cldr.unicode.org/development/development-process/design-proposals/day-period-design that means some
215
217
  # major changes are required for a full support of day periods.
216
218
  @tokenizer.calendar[:periods][:format][:wide][time.strftime('%p').downcase.to_sym]
217
219
  end
218
220
 
219
- def hour(time, pattern, length)
221
+ def hour(time, pattern, length, options = {})
220
222
  hour = time.hour
221
223
  hour = case pattern[0, 1]
222
224
  when 'h' # [1-12]
@@ -231,29 +233,36 @@ module TwitterCldr
231
233
  length == 1 ? hour.to_s : hour.to_s.rjust(length, '0')
232
234
  end
233
235
 
234
- def minute(time, pattern, length)
236
+ def minute(time, pattern, length, options = {})
235
237
  length == 1 ? time.min.to_s : time.min.to_s.rjust(length, '0')
236
238
  end
237
239
 
238
- def second(time, pattern, length)
240
+ def second(time, pattern, length, options = {})
239
241
  length == 1 ? time.sec.to_s : time.sec.to_s.rjust(length, '0')
240
242
  end
241
243
 
242
- def second_fraction(time, pattern, length)
244
+ def second_fraction(time, pattern, length, options = {})
243
245
  raise ArgumentError.new('can not use the S format with more than 6 digits') if length > 6
244
246
  (time.usec.to_f / 10 ** (6 - length)).round.to_s.rjust(length, '0')
245
247
  end
246
248
 
247
- def timezone(time, pattern, length)
249
+ def timezone(time, pattern, length, options = {})
250
+ # ruby is dumb and doesn't let you set non-UTC timezones in dates/times, so we have to pass it as an option instead
251
+ timezone_info = TZInfo::Timezone.get(options[:timezone] || "UTC")
252
+
248
253
  case length
249
254
  when 1..3
250
- time.zone
255
+ timezone_info.current_period.abbreviation.to_s
251
256
  else
252
- "UTC #{time.strftime("%z")}"
257
+ hours = (timezone_info.current_period.utc_offset.to_f / 60 ** 2).abs
258
+ divisor = hours.to_i
259
+ minutes = (hours % (divisor == 0 ? 1 : divisor)) * 60
260
+ sign = timezone_info.current_period.utc_offset < 0 ? "-" : "+"
261
+ "UTC #{sign}#{divisor.to_s.rjust(2, "0")}:#{minutes.floor.to_s.rjust(2, "0")}"
253
262
  end
254
263
  end
255
264
 
256
- def timezone_generic_non_location(time, pattern, length)
265
+ def timezone_generic_non_location(time, pattern, length, options = {})
257
266
  raise NotImplementedError, 'requires timezone translation data'
258
267
  end
259
268
  end
@@ -36,8 +36,9 @@ module TwitterCldr
36
36
 
37
37
  def transform_number(number)
38
38
  if (number < NUMBER_MAX) && (number >= NUMBER_MIN)
39
- sig_figs = ((number.to_i.to_s.size - 1) % 3)
40
- number.to_s[0..sig_figs].to_i
39
+ power = (((number.to_s.length - 1) / 3) * 3).floor
40
+ factor = (10 ** power).to_f
41
+ number / factor
41
42
  else
42
43
  number
43
44
  end
@@ -7,26 +7,45 @@ module TwitterCldr
7
7
  module Localized
8
8
 
9
9
  class LocalizedDate < LocalizedDateTime
10
- def to_datetime(time)
11
- time_obj = time.is_a?(LocalizedTime) ? time.base_obj : time
12
- LocalizedDateTime.new(DateTime.parse("#{@base_obj.strftime("%Y-%m-%d")}T#{time_obj.strftime("%H:%M:%S%z")}"), @locale, :calendar_type => @calendar_type)
10
+ def to_datetime(time = Time.now)
11
+ dt = DateTime.parse("#{@base_obj.strftime("%Y-%m-%d")}T#{unwrap_time_obj(time).strftime("%H:%M:%S%z")}")
12
+ LocalizedDateTime.new(dt, @locale, chain_params)
13
13
  end
14
14
 
15
15
  def to_time(base = Time.now)
16
- time = Time.gm(
17
- @base_obj.year,
18
- @base_obj.month,
19
- @base_obj.day,
20
- base.hour,
21
- base.min,
22
- base.sec
23
- )
24
-
25
- LocalizedTime.new(time, @locale, :calendar_type => @calendar_type)
16
+ case @base_obj
17
+ when Time
18
+ LocalizedTime.new(@base_obj, @locale, chain_params)
19
+ when DateTime
20
+ utc_dt = @base_obj.new_offset(0)
21
+
22
+ time = Time.gm(
23
+ utc_dt.year,
24
+ utc_dt.month,
25
+ utc_dt.day,
26
+ utc_dt.hour,
27
+ utc_dt.min,
28
+ utc_dt.sec,
29
+ utc_dt.sec_fraction * (RUBY_VERSION < '1.9' ? 86400000000 : 1000000)
30
+ )
31
+
32
+ LocalizedTime.new(time, @locale, chain_params)
33
+ else
34
+ nil
35
+ end
26
36
  end
27
37
 
28
38
  protected
29
39
 
40
+ def unwrap_time_obj(time)
41
+ time.is_a?(LocalizedTime) ? time.base_obj : time
42
+ end
43
+
44
+ def base_in_timezone
45
+ time = unwrap_time_obj(to_time)
46
+ timezone_info.utc_to_local(time.is_a?(DateTime) ? time.new_offset(0) : time.utc)
47
+ end
48
+
30
49
  def formatter_const
31
50
  TwitterCldr::Formatters::DateFormatter
32
51
  end
@@ -3,20 +3,23 @@
3
3
  # Copyright 2012 Twitter, Inc
4
4
  # http://www.apache.org/licenses/LICENSE-2.0
5
5
 
6
+ require 'tzinfo'
7
+
6
8
  module TwitterCldr
7
9
  module Localized
8
10
 
9
11
  class LocalizedDateTime < LocalizedObject
10
- attr_reader :calendar_type
12
+ attr_reader :calendar_type, :timezone
11
13
 
12
14
  def initialize(obj, locale, options = {})
13
15
  super
14
16
  @calendar_type = options[:calendar_type] || TwitterCldr::DEFAULT_CALENDAR_TYPE
17
+ @timezone = options[:timezone] || "UTC"
15
18
  end
16
19
 
17
20
  TwitterCldr::Tokenizers::DateTimeTokenizer::VALID_TYPES.each do |format_type|
18
21
  define_method "to_#{format_type}_s" do
19
- @formatter.format(@base_obj, :type => format_type.to_sym)
22
+ @formatter.format(base_in_timezone, chain_params.merge(:type => format_type.to_sym))
20
23
  end
21
24
  end
22
25
 
@@ -42,15 +45,14 @@ module TwitterCldr
42
45
 
43
46
  def to_s(options = {})
44
47
  if options[:format]
45
- @formatter.format(@base_obj, options.merge(:type => :additional))
48
+ @formatter.format(base_in_timezone, options.merge(:type => :additional))
46
49
  else
47
50
  to_default_s
48
51
  end
49
52
  end
50
53
 
51
54
  def to_date
52
- date = Date.new(@base_obj.year, @base_obj.month, @base_obj.day)
53
- LocalizedDate.new(date, @locale, :calendar_type => @calendar_type)
55
+ LocalizedDate.new(@base_obj, @locale, chain_params)
54
56
  end
55
57
 
56
58
  def to_time(base = Time.now)
@@ -66,14 +68,30 @@ module TwitterCldr
66
68
  utc_dt.sec_fraction * (RUBY_VERSION < '1.9' ? 86400000000 : 1000000)
67
69
  )
68
70
 
69
- LocalizedTime.new(time, @locale, :calendar_type => @calendar_type)
71
+ LocalizedTime.new(time, @locale, chain_params)
72
+ end
73
+
74
+ def with_timezone(timezone)
75
+ self.class.new(@base_obj, @locale, chain_params.merge(:timezone => timezone))
70
76
  end
71
77
 
72
78
  protected
73
79
 
80
+ def chain_params
81
+ { :calendar_type => @calendar_type, :timezone => @timezone }
82
+ end
83
+
84
+ def base_in_timezone
85
+ timezone_info.utc_to_local(@base_obj.new_offset(0))
86
+ end
87
+
74
88
  def formatter_const
75
89
  TwitterCldr::Formatters::DateTimeFormatter
76
90
  end
91
+
92
+ def timezone_info
93
+ (@@timezone_info ||= {})[@timezone] ||= TZInfo::Timezone.get(@timezone)
94
+ end
77
95
  end
78
96
 
79
97
  end
@@ -9,23 +9,32 @@ module TwitterCldr
9
9
  class LocalizedTime < LocalizedDateTime
10
10
  def to_datetime(date)
11
11
  date_obj = date.is_a?(LocalizedDate) ? date.base_obj : date
12
- LocalizedDateTime.new(DateTime.parse("#{date_obj.strftime("%Y-%m-%d")}T#{@base_obj.strftime("%H:%M:%S%z")}"), @locale, :calendar_type => @calendar_type)
12
+ dt = DateTime.parse("#{date_obj.strftime("%Y-%m-%d")}T#{@base_obj.strftime("%H:%M:%S%z")}")
13
+ LocalizedDateTime.new(dt, @locale, chain_params)
13
14
  end
14
15
 
15
16
  def to_time(base_time = Time.now)
16
17
  self
17
18
  end
18
19
 
20
+ def to_date
21
+ LocalizedDate.new(@base_obj, @locale, chain_params)
22
+ end
23
+
19
24
  def gmtime
20
- LocalizedTime.new(@base_obj.gmtime, @locale, :calendar_type => @calendar_type)
25
+ LocalizedTime.new(@base_obj.gmtime, @locale, chain_params)
21
26
  end
22
27
 
23
28
  def localtime
24
- LocalizedTime.new(@base_obj.localtime, @locale, :calendar_type => @calendar_type)
29
+ LocalizedTime.new(@base_obj.localtime, @locale, chain_params)
25
30
  end
26
31
 
27
32
  protected
28
33
 
34
+ def base_in_timezone
35
+ timezone_info.utc_to_local(@base_obj.utc)
36
+ end
37
+
29
38
  def formatter_const
30
39
  TwitterCldr::Formatters::TimeFormatter
31
40
  end