twitter_cldr 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. data/LICENSE +177 -0
  2. data/NOTICE +26 -0
  3. data/README.md +83 -0
  4. data/Rakefile +36 -0
  5. data/lib/ext/calendars/date.rb +20 -0
  6. data/lib/ext/calendars/datetime.rb +36 -0
  7. data/lib/ext/calendars/time.rb +20 -0
  8. data/lib/ext/localized_object.rb +15 -0
  9. data/lib/ext/numbers/bignum.rb +3 -0
  10. data/lib/ext/numbers/fixnum.rb +3 -0
  11. data/lib/ext/numbers/float.rb +3 -0
  12. data/lib/ext/numbers/localized_number.rb +53 -0
  13. data/lib/ext/strings/symbol.rb +17 -0
  14. data/lib/formatters/base.rb +36 -0
  15. data/lib/formatters/calendars/date_formatter.rb +9 -0
  16. data/lib/formatters/calendars/datetime_formatter.rb +217 -0
  17. data/lib/formatters/calendars/time_formatter.rb +9 -0
  18. data/lib/formatters/numbers/currency_formatter.rb +25 -0
  19. data/lib/formatters/numbers/decimal_formatter.rb +22 -0
  20. data/lib/formatters/numbers/helpers/base.rb +18 -0
  21. data/lib/formatters/numbers/helpers/fraction.rb +29 -0
  22. data/lib/formatters/numbers/helpers/integer.rb +46 -0
  23. data/lib/formatters/numbers/number_formatter.rb +48 -0
  24. data/lib/formatters/numbers/percent_formatter.rb +18 -0
  25. data/lib/formatters/plurals/rules.rb +34 -0
  26. data/lib/shared/currencies.rb +33 -0
  27. data/lib/shared/languages.rb +48 -0
  28. data/lib/shared/resources.rb +45 -0
  29. data/lib/shared/timezones.rb +1 -0
  30. data/lib/tokenizers/base.rb +112 -0
  31. data/lib/tokenizers/calendars/date_tokenizer.rb +24 -0
  32. data/lib/tokenizers/calendars/datetime_tokenizer.rb +46 -0
  33. data/lib/tokenizers/calendars/time_tokenizer.rb +24 -0
  34. data/lib/tokenizers/key_path.rb +30 -0
  35. data/lib/tokenizers/numbers/number_tokenizer.rb +50 -0
  36. data/lib/tokenizers/token.rb +17 -0
  37. data/lib/twitter_cldr.rb +104 -0
  38. data/lib/version.rb +3 -0
  39. data/resources/ar/calendars.yml +145 -0
  40. data/resources/ar/languages.yml +498 -0
  41. data/resources/ar/numbers.yml +35 -0
  42. data/resources/ar/plurals.yml +1 -0
  43. data/resources/da/calendars.yml +157 -0
  44. data/resources/da/languages.yml +508 -0
  45. data/resources/da/numbers.yml +31 -0
  46. data/resources/da/plurals.yml +1 -0
  47. data/resources/de/calendars.yml +152 -0
  48. data/resources/de/languages.yml +508 -0
  49. data/resources/de/numbers.yml +31 -0
  50. data/resources/de/plurals.yml +1 -0
  51. data/resources/en/calendars.yml +145 -0
  52. data/resources/en/languages.yml +510 -0
  53. data/resources/en/numbers.yml +31 -0
  54. data/resources/en/plurals.yml +1 -0
  55. data/resources/es/calendars.yml +145 -0
  56. data/resources/es/languages.yml +508 -0
  57. data/resources/es/numbers.yml +30 -0
  58. data/resources/es/plurals.yml +1 -0
  59. data/resources/fa/calendars.yml +150 -0
  60. data/resources/fa/languages.yml +484 -0
  61. data/resources/fa/numbers.yml +30 -0
  62. data/resources/fa/plurals.yml +1 -0
  63. data/resources/fi/calendars.yml +176 -0
  64. data/resources/fi/languages.yml +508 -0
  65. data/resources/fi/numbers.yml +31 -0
  66. data/resources/fi/plurals.yml +1 -0
  67. data/resources/fil/calendars.yml +159 -0
  68. data/resources/fil/languages.yml +115 -0
  69. data/resources/fil/numbers.yml +31 -0
  70. data/resources/fil/plurals.yml +1 -0
  71. data/resources/fr/calendars.yml +149 -0
  72. data/resources/fr/languages.yml +508 -0
  73. data/resources/fr/numbers.yml +31 -0
  74. data/resources/fr/plurals.yml +1 -0
  75. data/resources/he/calendars.yml +145 -0
  76. data/resources/he/languages.yml +266 -0
  77. data/resources/he/numbers.yml +31 -0
  78. data/resources/he/plurals.yml +1 -0
  79. data/resources/hi/calendars.yml +144 -0
  80. data/resources/hi/languages.yml +505 -0
  81. data/resources/hi/numbers.yml +31 -0
  82. data/resources/hi/plurals.yml +1 -0
  83. data/resources/hu/calendars.yml +145 -0
  84. data/resources/hu/languages.yml +508 -0
  85. data/resources/hu/numbers.yml +30 -0
  86. data/resources/hu/plurals.yml +1 -0
  87. data/resources/id/calendars.yml +145 -0
  88. data/resources/id/languages.yml +506 -0
  89. data/resources/id/numbers.yml +30 -0
  90. data/resources/id/plurals.yml +1 -0
  91. data/resources/it/calendars.yml +164 -0
  92. data/resources/it/languages.yml +503 -0
  93. data/resources/it/numbers.yml +30 -0
  94. data/resources/it/plurals.yml +1 -0
  95. data/resources/ja/calendars.yml +157 -0
  96. data/resources/ja/languages.yml +502 -0
  97. data/resources/ja/numbers.yml +30 -0
  98. data/resources/ja/plurals.yml +1 -0
  99. data/resources/ko/calendars.yml +133 -0
  100. data/resources/ko/languages.yml +505 -0
  101. data/resources/ko/numbers.yml +30 -0
  102. data/resources/ko/plurals.yml +1 -0
  103. data/resources/ms/calendars.yml +145 -0
  104. data/resources/ms/languages.yml +54 -0
  105. data/resources/ms/numbers.yml +30 -0
  106. data/resources/ms/plurals.yml +1 -0
  107. data/resources/nl/calendars.yml +145 -0
  108. data/resources/nl/languages.yml +508 -0
  109. data/resources/nl/numbers.yml +31 -0
  110. data/resources/nl/plurals.yml +1 -0
  111. data/resources/no/calendars.yml +122 -0
  112. data/resources/no/languages.yml +508 -0
  113. data/resources/no/numbers.yml +30 -0
  114. data/resources/no/plurals.yml +1 -0
  115. data/resources/pl/calendars.yml +161 -0
  116. data/resources/pl/languages.yml +504 -0
  117. data/resources/pl/numbers.yml +31 -0
  118. data/resources/pl/plurals.yml +1 -0
  119. data/resources/pt/calendars.yml +145 -0
  120. data/resources/pt/languages.yml +508 -0
  121. data/resources/pt/numbers.yml +31 -0
  122. data/resources/pt/plurals.yml +1 -0
  123. data/resources/ru/calendars.yml +176 -0
  124. data/resources/ru/languages.yml +508 -0
  125. data/resources/ru/numbers.yml +30 -0
  126. data/resources/ru/plurals.yml +1 -0
  127. data/resources/shared/currencies.yml +451 -0
  128. data/resources/sv/calendars.yml +145 -0
  129. data/resources/sv/languages.yml +508 -0
  130. data/resources/sv/numbers.yml +31 -0
  131. data/resources/sv/plurals.yml +1 -0
  132. data/resources/th/calendars.yml +145 -0
  133. data/resources/th/languages.yml +507 -0
  134. data/resources/th/numbers.yml +30 -0
  135. data/resources/th/plurals.yml +1 -0
  136. data/resources/tr/calendars.yml +145 -0
  137. data/resources/tr/languages.yml +508 -0
  138. data/resources/tr/numbers.yml +30 -0
  139. data/resources/tr/plurals.yml +1 -0
  140. data/resources/ur/calendars.yml +133 -0
  141. data/resources/ur/languages.yml +81 -0
  142. data/resources/ur/numbers.yml +31 -0
  143. data/resources/ur/plurals.yml +1 -0
  144. data/resources/zh/calendars.yml +169 -0
  145. data/resources/zh/languages.yml +506 -0
  146. data/resources/zh/numbers.yml +30 -0
  147. data/resources/zh/plurals.yml +1 -0
  148. data/resources/zh-Hant/calendars.yml +141 -0
  149. data/resources/zh-Hant/languages.yml +409 -0
  150. data/resources/zh-Hant/numbers.yml +30 -0
  151. data/spec/ext/calendars/date_spec.rb +45 -0
  152. data/spec/ext/calendars/datetime_spec.rb +43 -0
  153. data/spec/ext/calendars/time_spec.rb +45 -0
  154. data/spec/ext/numbers/bignum_spec.rb +19 -0
  155. data/spec/ext/numbers/fixnum_spec.rb +19 -0
  156. data/spec/ext/numbers/float_spec.rb +19 -0
  157. data/spec/ext/numbers/localized_number_spec.rb +53 -0
  158. data/spec/ext/strings/symbol_spec.rb +23 -0
  159. data/spec/formatters/base_spec.rb +12 -0
  160. data/spec/formatters/calendars/datetime_formatter_spec.rb +324 -0
  161. data/spec/formatters/numbers/currency_formatter_spec.rb +27 -0
  162. data/spec/formatters/numbers/decimal_formatter_spec.rb +30 -0
  163. data/spec/formatters/numbers/helpers/fraction_spec.rb +22 -0
  164. data/spec/formatters/numbers/helpers/integer_spec.rb +99 -0
  165. data/spec/formatters/numbers/number_formatter_spec.rb +79 -0
  166. data/spec/formatters/numbers/percent_formatter_spec.rb +12 -0
  167. data/spec/formatters/plurals/rules_spec.rb +73 -0
  168. data/spec/shared/currencies_spec.rb +55 -0
  169. data/spec/shared/languages_spec.rb +82 -0
  170. data/spec/shared/resources_spec.rb +44 -0
  171. data/spec/spec_helper.rb +31 -0
  172. data/spec/tokenizers/base_spec.rb +134 -0
  173. data/spec/tokenizers/calendars/date_tokenizer_spec.rb +36 -0
  174. data/spec/tokenizers/calendars/datetime_tokenizer_spec.rb +52 -0
  175. data/spec/tokenizers/calendars/time_tokenizer_spec.rb +34 -0
  176. data/spec/tokenizers/key_path_spec.rb +44 -0
  177. data/spec/tokenizers/numbers/number_tokenizer_spec.rb +60 -0
  178. data/spec/tokenizers/token_spec.rb +18 -0
  179. data/spec/twitter_cldr_spec.rb +53 -0
  180. metadata +293 -0
@@ -0,0 +1,112 @@
1
+ module TwitterCldr
2
+ module Tokenizers
3
+ class Base
4
+ attr_reader :resource, :locale
5
+ attr_reader :token_splitter_regex, :token_type_regexes, :paths
6
+ attr_accessor :type, :placeholders
7
+
8
+ def initialize(options = {})
9
+ @locale = (options[:locale] || TwitterCldr::DEFAULT_LOCALE).to_sym
10
+ self.init_resources
11
+ self.init_placeholders
12
+ end
13
+
14
+ protected
15
+
16
+ # Not to be confused with tokenize_pattern, which pulls out placeholders. Tokenize_format actually splits a completely
17
+ # expanded format string into whatever parts are defined by the subclass's token type and token splitter regexes.
18
+ def tokenize_format(text)
19
+ final = []
20
+ text.split(self.token_splitter_regex).each_with_index do |token, index|
21
+ unless index == 0 && token == ""
22
+ self.token_type_regexes.each do |token_type|
23
+ if token =~ token_type[:regex]
24
+ final << Token.new(:value => token, :type => token_type[:type])
25
+ break
26
+ end
27
+ end
28
+ end
29
+ end
30
+ final
31
+ end
32
+
33
+ def tokens_for(key, type)
34
+ final = []
35
+ tokens = self.expand_pattern(self.pattern_for(self.traverse(key)), type)
36
+
37
+ tokens.each do |token|
38
+ if token.is_a?(Token)
39
+ final << token
40
+ else
41
+ final += tokenize_format(token[:value])
42
+ end
43
+ end
44
+
45
+ final
46
+ end
47
+
48
+ def init_placeholders
49
+ @placeholders = {}
50
+ end
51
+
52
+ def traverse(needle, haystack = @resource)
53
+ segments = needle.to_s.split(".")
54
+ final = haystack
55
+ segments.each { |segment| final = final[segment.to_sym] }
56
+ final
57
+ rescue NameError
58
+ nil
59
+ end
60
+
61
+ def expand_pattern(format_str, type)
62
+ if format_str.is_a?(Symbol)
63
+ # symbols mean another path was given
64
+ self.expand_pattern(self.pattern_for(self.traverse(format_str)), type)
65
+ else
66
+ parts = tokenize_pattern(format_str)
67
+ final = []
68
+
69
+ parts.each do |part|
70
+ case part[:type]
71
+ when :placeholder then
72
+ placeholder = self.choose_placeholder(part[:value], @placeholders)
73
+ final += placeholder ? placeholder.tokens(:type => type) : []
74
+ else
75
+ final << part
76
+ end
77
+ end
78
+
79
+ final
80
+ end
81
+ end
82
+
83
+ # Tokenize_pattern is supposed to take a pattern found in the YAML resource files and break it into placeholders and plaintext.
84
+ # Placeholders are delimited by single and double curly braces, plaintext is everything else.
85
+ def tokenize_pattern(pattern_str)
86
+ results = []
87
+ pattern_str.split(/(\{\{?\w*\}?\}|\'\w+\')/).each do |piece|
88
+ unless piece.empty?
89
+ case piece[0].chr
90
+ when "{"
91
+ results << { :value => piece, :type => :placeholder }
92
+ else
93
+ results << { :value => piece, :type => :plaintext }
94
+ end
95
+ end
96
+ end
97
+ results
98
+ end
99
+
100
+ def choose_placeholder(token, placeholders)
101
+ if token[0..1] == "{{"
102
+ token_value = token[2..-3]
103
+ found = placeholders.find { |placeholder| placeholder[:name].to_s == token_value }
104
+ else
105
+ found = placeholders[token[1..-2].to_i]
106
+ end
107
+
108
+ found ? found[:object] : nil
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,24 @@
1
+ module TwitterCldr
2
+ module Tokenizers
3
+ class DateTokenizer < TwitterCldr::Tokenizers::DateTimeTokenizer
4
+ def initialize(options = {})
5
+ super(options)
6
+ @token_splitter_regex = /(\s*\'[\w\s-]+\'\s*|G{1,5}|y+|Y+|Q{1,4}|q{1,5}|M{1,5}|L{1,5}|d{1,2}|F{1}|E{1,5}|e{1,5}|c{1,5})/
7
+ @token_type_regexes = [{ :type => :pattern, :regex => /^(?:G{1,5}|y+|Y+|Q{1,4}|q{1,5}|M{1,5}|L{1,5}|d{1,2}|F{1}|E{1,5}|e{1,5}|c{1,5})/ },
8
+ { :type => :plaintext, :regex => // }]
9
+ @paths = { :default => "calendars.gregorian.formats.date.default",
10
+ :full => "calendars.gregorian.formats.date.full",
11
+ :long => "calendars.gregorian.formats.date.long",
12
+ :medium => "calendars.gregorian.formats.date.medium",
13
+ :short => "calendars.gregorian.formats.date.short" }
14
+ end
15
+
16
+ protected
17
+
18
+ # must override this because DateTimeTokenizer will set them otherwise
19
+ def init_placeholders
20
+ @placeholders = {}
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,46 @@
1
+ module TwitterCldr
2
+ module Tokenizers
3
+ class DateTimeTokenizer < Base
4
+ attr_reader :placeholders, :calendar_type
5
+
6
+ DEFAULT_CALENDAR_TYPE = :gregorian
7
+ VALID_TYPES = [:default, :full, :long, :medium, :short]
8
+
9
+ def initialize(options = {})
10
+ super(options)
11
+ @calendar_type = options[:calendar_type] || DEFAULT_CALENDAR_TYPE
12
+ @token_splitter_regex = //
13
+ @token_type_regexes = [{ :type => :plaintext, :regex => // }]
14
+ @paths = { :default => "calendars.gregorian.formats.datetime.default",
15
+ :full => "calendars.gregorian.formats.datetime.full",
16
+ :long => "calendars.gregorian.formats.datetime.long",
17
+ :medium => "calendars.gregorian.formats.datetime.medium",
18
+ :short => "calendars.gregorian.formats.datetime.short" }
19
+ end
20
+
21
+ def tokens(options = {})
22
+ type = options[:type] || :default
23
+ self.tokens_for(self.paths[type], type)
24
+ end
25
+
26
+ def calendar
27
+ @resource[:calendars][@calendar_type]
28
+ end
29
+
30
+ protected
31
+
32
+ def init_resources
33
+ @resource = TwitterCldr.resources.resource_for(@locale, "calendars")[TwitterCldr.convert_locale(@locale)]
34
+ end
35
+
36
+ def init_placeholders
37
+ @placeholders = [{ :name => :date, :object => TwitterCldr::Tokenizers::DateTokenizer.new(:locale => @locale) },
38
+ { :name => :time, :object => TwitterCldr::Tokenizers::TimeTokenizer.new(:locale => @locale) }]
39
+ end
40
+
41
+ def pattern_for(resource)
42
+ resource.is_a?(Hash) ? resource[:pattern] : resource
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,24 @@
1
+ module TwitterCldr
2
+ module Tokenizers
3
+ class TimeTokenizer < TwitterCldr::Tokenizers::DateTimeTokenizer
4
+ def initialize(options = {})
5
+ super(options)
6
+ @token_splitter_regex = /(\'[\w\s-]+\'|a{1}|h{1,2}|H{1,2}|K{1,2}|k{1,2}|m{1,2}|s{1,2}|S+|z{1,4}|Z{1,4})/
7
+ @token_type_regexes = [{ :type => :pattern, :regex => /^a{1}|h{1,2}|H{1,2}|K{1,2}|k{1,2}|m{1,2}|s{1,2}|S+|z{1,4}|Z{1,4}/ },
8
+ { :type => :plaintext, :regex => // }]
9
+ @paths = { :default => "calendars.gregorian.formats.time.default",
10
+ :full => "calendars.gregorian.formats.time.full",
11
+ :long => "calendars.gregorian.formats.time.long",
12
+ :medium => "calendars.gregorian.formats.time.medium",
13
+ :short => "calendars.gregorian.formats.time.short" }
14
+ end
15
+
16
+ protected
17
+
18
+ # must override this because DateTimeTokenizer will set them otherwise
19
+ def init_placeholders
20
+ @placeholders = {}
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ module TwitterCldr
2
+ module Tokenizers
3
+ class KeyPath
4
+ class << self
5
+ def dirname(path)
6
+ self.join_path(self.split_path(path)[0..-2])
7
+ end
8
+
9
+ def join(*args)
10
+ final = ""
11
+ args.each do |arg|
12
+ fixed_arg = arg.chomp(".")
13
+ fixed_arg = arg[1..-1] if fixed_arg[0].chr == "."
14
+ final << "." if final.size > 0
15
+ final << fixed_arg
16
+ end
17
+ final
18
+ end
19
+
20
+ def split_path(path)
21
+ path.split(/\./)
22
+ end
23
+
24
+ def join_path(path_arr)
25
+ path_arr.join(".")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,50 @@
1
+ module TwitterCldr
2
+ module Tokenizers
3
+ class NumberTokenizer < Base
4
+ def initialize(options = {})
5
+ super(options)
6
+ @type = options[:type] || :decimal
7
+ @token_splitter_regex = /([^0*#,\.]*)([0#,\.]+)([^0*#,\.]*)$/
8
+ @token_type_regexes = [{ :type => :pattern, :regex => /[0?#,\.]*/ },
9
+ { :type => :plaintext, :regex => // }]
10
+ @base_path = "numbers.formats"
11
+ @symbol_path = "numbers.symbols"
12
+ @paths = { :default => "patterns.default",
13
+ :positive => "patterns.positive",
14
+ :negative => "patterns.negative" }
15
+ end
16
+
17
+ def tokens(options = {})
18
+ unless self.traverse(self.full_path_for(:positive))
19
+ key_path = self.full_path_for(:default)
20
+ positive, negative = self.traverse(key_path).split(/;/)
21
+ insert_point = self.traverse(KeyPath.dirname(key_path))
22
+ insert_point[:positive] = positive
23
+ insert_point[:negative] = negative ? negative : "#{self.symbols[:minus] || '-'}#{positive}"
24
+ end
25
+
26
+ sign = options[:sign] || :positive
27
+ self.tokens_for(self.full_path_for(sign), nil)
28
+ end
29
+
30
+ def symbols
31
+ self.traverse(@symbol_path)
32
+ end
33
+
34
+ protected
35
+
36
+ def full_path_for(path)
37
+ KeyPath.join(@base_path, @type.to_s, self.paths[path])
38
+ end
39
+
40
+ def init_resources
41
+ @resource = TwitterCldr.resources.resource_for(@locale, "numbers")[TwitterCldr.convert_locale(@locale)]
42
+ end
43
+
44
+ def pattern_for(resource)
45
+ # can't go any deeper, so return original pattern (which should NOT be a hash, by the way)
46
+ resource
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,17 @@
1
+ module TwitterCldr
2
+ module Tokenizers
3
+ class Token
4
+ attr_accessor :value, :type
5
+
6
+ def initialize(options = {})
7
+ options.each_pair do |key, val|
8
+ self.send("#{key.to_s}=", val)
9
+ end
10
+ end
11
+
12
+ def to_s
13
+ @value
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,104 @@
1
+ $:.push(File.dirname(__FILE__))
2
+
3
+ require 'yaml'
4
+ require 'date'
5
+ require 'time'
6
+
7
+ require 'version'
8
+
9
+ # patches for extending Ruby functionality
10
+ require 'ext/localized_object'
11
+ require 'ext/calendars/datetime'
12
+ require 'ext/calendars/date'
13
+ require 'ext/calendars/time'
14
+ require 'ext/numbers/localized_number'
15
+ require 'ext/numbers/bignum'
16
+ require 'ext/numbers/fixnum'
17
+ require 'ext/numbers/float'
18
+ require 'ext/strings/symbol'
19
+
20
+ # manages access to CLDR resources (yaml files in resources dir)
21
+ require 'shared/resources'
22
+
23
+
24
+ module TwitterCldr
25
+ DEFAULT_LOCALE = :en
26
+ RESOURCE_DIR = File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), "resources")
27
+
28
+ # maps twitter locales to cldr locales
29
+ TWITTER_LOCALE_MAP = { :msa => :ms,
30
+ :'zh-cn' => :zh,
31
+ :'zh-tw' => :'zh-Hant' }
32
+
33
+ @@resources = TwitterCldr::Shared::Resources.new
34
+
35
+ def self.get_resource_file(locale, resource)
36
+ File.join(RESOURCE_DIR, self.convert_locale(locale).to_s, "#{resource}.yml")
37
+ end
38
+
39
+ def self.resources
40
+ @@resources
41
+ end
42
+
43
+ def self.get_locale
44
+ if defined?(FastGettext)
45
+ locale = FastGettext.locale
46
+ locale = DEFAULT_LOCALE if locale.to_s.empty?
47
+ else
48
+ locale = DEFAULT_LOCALE
49
+ end
50
+
51
+ (self.supported_locale?(locale) ? locale : DEFAULT_LOCALE).to_sym
52
+ end
53
+
54
+ def self.convert_locale(locale)
55
+ locale = locale.to_sym
56
+ TWITTER_LOCALE_MAP.include?(locale) ? TWITTER_LOCALE_MAP[locale] : locale
57
+ end
58
+
59
+ def self.supported_locales
60
+ unless defined?(@@supported_locales)
61
+ rejectable = [:shared]
62
+ @@supported_locales = Dir.glob(File.join(File.dirname(File.dirname(__FILE__)), "resources/*")).map do |file|
63
+ File.basename(file).to_sym
64
+ end.reject { |file| rejectable.include?(file) }
65
+ end
66
+
67
+ @@supported_locales
68
+ end
69
+
70
+ def self.supported_locale?(locale)
71
+ locale = locale.to_sym
72
+ self.supported_locales.include?(locale) || self.supported_locales.include?(self.convert_locale(locale))
73
+ end
74
+ end
75
+
76
+
77
+ # other shared libraries (most access shared resource data in resources/shared)
78
+ require 'shared/currencies'
79
+ require 'shared/languages'
80
+
81
+ # all tokenizers
82
+ require 'tokenizers/base'
83
+ require 'tokenizers/key_path'
84
+ require 'tokenizers/token'
85
+ require 'tokenizers/calendars/datetime_tokenizer'
86
+ require 'tokenizers/calendars/date_tokenizer'
87
+ require 'tokenizers/calendars/time_tokenizer'
88
+ require 'tokenizers/numbers/number_tokenizer'
89
+
90
+ # all formatters
91
+ require 'formatters/base'
92
+ require 'formatters/calendars/datetime_formatter'
93
+ require 'formatters/calendars/date_formatter'
94
+ require 'formatters/calendars/time_formatter'
95
+ require 'formatters/numbers/number_formatter'
96
+ require 'formatters/numbers/decimal_formatter'
97
+ require 'formatters/numbers/currency_formatter'
98
+ require 'formatters/numbers/percent_formatter'
99
+ require 'formatters/plurals/rules'
100
+
101
+ # formatter helpers
102
+ require 'formatters/numbers/helpers/base'
103
+ require 'formatters/numbers/helpers/fraction'
104
+ require 'formatters/numbers/helpers/integer'
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module TwitterCldr
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,145 @@
1
+ ar:
2
+ calendars:
3
+ gregorian:
4
+ days:
5
+ format:
6
+ abbreviated:
7
+ fri: جمعة
8
+ mon: اثنين
9
+ sat: سبت
10
+ sun: أحد
11
+ thu: خميس
12
+ tue: ثلاثاء
13
+ wed: أربعاء
14
+ narrow: :"calendars.gregorian.days.stand-alone.narrow"
15
+ wide:
16
+ fri: الجمعة
17
+ mon: الاثنين
18
+ sat: السبت
19
+ sun: الأحد
20
+ thu: الخميس
21
+ tue: الثلاثاء
22
+ wed: الأربعاء
23
+ stand-alone:
24
+ abbreviated: :"calendars.gregorian.days.format.abbreviated"
25
+ narrow:
26
+ fri: ج
27
+ mon: ن
28
+ sat: س
29
+ sun: ح
30
+ thu: خ
31
+ tue: ث
32
+ wed: ر
33
+ wide: :"calendars.gregorian.days.format.wide"
34
+ fields:
35
+ day: يوم
36
+ dayperiod: ص/م
37
+ era: العصر
38
+ hour: الساعات
39
+ minute: الدقائق
40
+ month: الشهر
41
+ second: الثواني
42
+ week: الأسبوع
43
+ weekday: اليوم
44
+ year: السنة
45
+ zone: التوقيت
46
+ formats:
47
+ date:
48
+ default: :"calendars.gregorian.formats.date.medium"
49
+ full:
50
+ pattern: "EEEE، d MMMM، y"
51
+ long:
52
+ pattern: "d MMMM، y"
53
+ medium:
54
+ pattern: dd‏/MM‏/yyyy
55
+ short:
56
+ pattern: d‏/M‏/yyyy
57
+ datetime:
58
+ default: :"calendars.gregorian.formats.datetime.medium"
59
+ full:
60
+ pattern: "{1} {0}"
61
+ long:
62
+ pattern: "{1} {0}"
63
+ medium:
64
+ pattern: "{1} {0}"
65
+ short:
66
+ pattern: "{1} {0}"
67
+ time:
68
+ default: :"calendars.gregorian.formats.time.medium"
69
+ full:
70
+ pattern: "zzzz h:mm:ss a"
71
+ long:
72
+ pattern: "z h:mm:ss a"
73
+ medium:
74
+ pattern: "h:mm:ss a"
75
+ short:
76
+ pattern: "h:mm a"
77
+ months:
78
+ format:
79
+ abbreviated:
80
+ 1: يناير
81
+ 10: أكتوبر
82
+ 11: نوفمبر
83
+ 12: ديسمبر
84
+ 2: فبراير
85
+ 3: مارس
86
+ 4: أبريل
87
+ 5: مايو
88
+ 6: يونيو
89
+ 7: يوليو
90
+ 8: أغسطس
91
+ 9: سبتمبر
92
+ narrow: :"calendars.gregorian.months.stand-alone.narrow"
93
+ wide:
94
+ 1: يناير
95
+ 10: أكتوبر
96
+ 11: نوفمبر
97
+ 12: ديسمبر
98
+ 2: فبراير
99
+ 3: مارس
100
+ 4: أبريل
101
+ 5: مايو
102
+ 6: يونيو
103
+ 7: يوليو
104
+ 8: أغسطس
105
+ 9: سبتمبر
106
+ stand-alone:
107
+ abbreviated: :"calendars.gregorian.months.format.abbreviated"
108
+ narrow:
109
+ 1: ي
110
+ 10: ك
111
+ 11: ب
112
+ 12: د
113
+ 2: ف
114
+ 3: م
115
+ 4: أ
116
+ 5: و
117
+ 6: ن
118
+ 7: ل
119
+ 8: غ
120
+ 9: س
121
+ wide: :"calendars.gregorian.months.format.wide"
122
+ periods:
123
+ am: ص
124
+ pm: م
125
+ quarters:
126
+ format:
127
+ abbreviated:
128
+ 1: "الربع الأول"
129
+ 2: "الربع الثاني"
130
+ 3: "الربع الثالث"
131
+ 4: "الربع الرابع"
132
+ narrow: :"calendars.gregorian.quarters.stand-alone.narrow"
133
+ wide:
134
+ 1: "الربع الأول"
135
+ 2: "الربع الثاني"
136
+ 3: "الربع الثالث"
137
+ 4: "الربع الرابع"
138
+ stand-alone:
139
+ abbreviated: :"calendars.gregorian.quarters.format.abbreviated"
140
+ narrow:
141
+ 1: ١
142
+ 2: ٢
143
+ 3: ٣
144
+ 4: ٤
145
+ wide: :"calendars.gregorian.quarters.format.wide"