twitter_cldr 1.3.0 → 1.3.6

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 (57) hide show
  1. data/README.md +58 -10
  2. data/Rakefile +25 -0
  3. data/lib/twitter_cldr.rb +16 -1
  4. data/lib/twitter_cldr/core_ext.rb +1 -0
  5. data/lib/twitter_cldr/core_ext/calendars/datetime.rb +14 -0
  6. data/lib/twitter_cldr/core_ext/calendars/timespan.rb +26 -0
  7. data/lib/twitter_cldr/formatters.rb +1 -0
  8. data/lib/twitter_cldr/formatters/calendars/datetime_formatter.rb +1 -6
  9. data/lib/twitter_cldr/formatters/calendars/timespan_formatter.rb +67 -0
  10. data/lib/twitter_cldr/formatters/numbers/number_formatter.rb +1 -1
  11. data/lib/twitter_cldr/tokenizers.rb +1 -0
  12. data/lib/twitter_cldr/tokenizers/base.rb +23 -9
  13. data/lib/twitter_cldr/tokenizers/calendars/date_tokenizer.rb +14 -8
  14. data/lib/twitter_cldr/tokenizers/calendars/datetime_tokenizer.rb +13 -9
  15. data/lib/twitter_cldr/tokenizers/calendars/time_tokenizer.rb +13 -7
  16. data/lib/twitter_cldr/tokenizers/calendars/timespan_tokenizer.rb +82 -0
  17. data/lib/twitter_cldr/tokenizers/numbers/number_tokenizer.rb +21 -14
  18. data/lib/twitter_cldr/tokenizers/token.rb +4 -0
  19. data/lib/twitter_cldr/version.rb +1 -1
  20. data/resources/locales/ar/units.yml +149 -0
  21. data/resources/locales/da/units.yml +79 -0
  22. data/resources/locales/de/units.yml +93 -0
  23. data/resources/locales/en/units.yml +65 -0
  24. data/resources/locales/es/units.yml +93 -0
  25. data/resources/locales/fa/units.yml +86 -0
  26. data/resources/locales/fi/units.yml +93 -0
  27. data/resources/locales/fil/units.yml +79 -0
  28. data/resources/locales/fr/units.yml +93 -0
  29. data/resources/locales/he/units.yml +79 -0
  30. data/resources/locales/hi/units.yml +79 -0
  31. data/resources/locales/hu/units.yml +72 -0
  32. data/resources/locales/id/units.yml +72 -0
  33. data/resources/locales/it/units.yml +79 -0
  34. data/resources/locales/ja/units.yml +72 -0
  35. data/resources/locales/ko/units.yml +72 -0
  36. data/resources/locales/ms/units.yml +86 -0
  37. data/resources/locales/nl/units.yml +79 -0
  38. data/resources/locales/pl/units.yml +135 -0
  39. data/resources/locales/pt/units.yml +93 -0
  40. data/resources/locales/ru/units.yml +135 -0
  41. data/resources/locales/sv/units.yml +93 -0
  42. data/resources/locales/th/units.yml +72 -0
  43. data/resources/locales/tr/units.yml +72 -0
  44. data/resources/locales/ur/units.yml +86 -0
  45. data/resources/locales/zh-Hant/units.yml +72 -0
  46. data/resources/locales/zh/units.yml +72 -0
  47. data/spec/core_ext/calendars/date_spec.rb +83 -9
  48. data/spec/core_ext/calendars/datetime_spec.rb +1 -3
  49. data/spec/core_ext/calendars/time_spec.rb +12 -3
  50. data/spec/formatters/calendars/timespan_formatter_spec.rb +39 -0
  51. data/spec/tokenizers/base_spec.rb +10 -10
  52. data/spec/tokenizers/calendars/timespan_tokenizer_spec.rb +24 -0
  53. data/spec/tokenizers/numbers/number_tokenizer_spec.rb +1 -1
  54. data/spec/twitter_cldr_spec.rb +16 -0
  55. metadata +126 -14
  56. data/lib/twitter_cldr/tokenizers/key_path.rb +0 -35
  57. data/spec/tokenizers/key_path_spec.rb +0 -49
data/README.md CHANGED
@@ -33,14 +33,6 @@ TwitterCldr patches core Ruby objects like Fixnum and Date to make localization
33
33
 
34
34
  ### Numbers
35
35
 
36
- **Note**: The CLDR is missing complete number data for:
37
-
38
- * hu (Hungarian)
39
- * id (Indonesian)
40
- * msa (Malay)
41
- * no (Norwegian),
42
- * zh-tw (Traditional Chinese)
43
-
44
36
  Fixnum, Bignum, and Float objects are supported. Here are some examples:
45
37
 
46
38
  ```ruby
@@ -328,6 +320,63 @@ No external requirements.
328
320
 
329
321
  `bundle exec rake` should do the trick. Tests are written in RSpec using RR as the mocking framework.
330
322
 
323
+ ## JavaScript Support
324
+ (Note: These changes have not yet been released as a gem.)
325
+
326
+ TwitterCLDR currently supports localization of dates and times in JavaScript. More awesome features are coming soon.
327
+
328
+ ### Generating the JavaScript
329
+
330
+ You can automatically generate the JavaScript versions of TwitterCLDR using this Rubygem. Here's the one-liner:
331
+
332
+ `bundle exec rake js:build OUTPUT_DIR=/path/to/desired/output/location`
333
+
334
+ If you'd like to customize the generated output further, you'll need to require the `TwitterCldr::Js` namespace. You can choose the locales to export and whether to export a minified version alongside the full version for each locale.
335
+
336
+ ```ruby
337
+ require 'twitter_cldr'
338
+
339
+ TwitterCldr.require_js # require JavaScript environment
340
+ TwitterCldr::Js.output_dir = "/path/to/output/location"
341
+ TwitterCldr::Js.make(:locales => [:de, :sv, :ja, :ar], # generate files for German, Swedish,
342
+ :minify => true) # Japanese, and Arabic
343
+ TwitterCldr::Js.install # copy files to output directory
344
+ ```
345
+
346
+ ### Dates and Times (JS)
347
+
348
+ ```javascript
349
+ // include twitter_cldr_es.js for the Spanish DateTimeFormatter
350
+ var fmt = new TwitterCldr.DateTimeFormatter();
351
+
352
+ fmt.format(new Date(), {"type": "full"}); // "lunes, 12 de diciembre de 2011 21:44:57 UTC -0800"
353
+ fmt.format(new Date(), {"type": "long"}); // "12 de diciembre de 201121:45:42 -08:00"
354
+ fmt.format(new Date(), {"type": "medium"}); // "12/12/2011 21:46:09"
355
+ fmt.format(new Date(), {"type": "short"}); // "12/12/11 21:47"
356
+
357
+ fmt.format(new Date(), {"format": "date", "type": "full"}); // "lunes, 12 de diciembre de 2011"
358
+ fmt.format(new Date(), {"format": "date", "type": "long"}); // "12 de diciembre de 2011"
359
+ fmt.format(new Date(), {"format": "date", "type": "medium"}); // "12/12/2011"
360
+ fmt.format(new Date(), {"format": "date", "type": "short"}); // "12/12/11"
361
+
362
+ fmt.format(new Date(), {"format": "time", "type": "full"}); // "21:44:57 UTC -0800"
363
+ fmt.format(new Date(), {"format": "time", "type": "long"}); // "21:45:42 -08:00"
364
+ fmt.format(new Date(), {"format": "time", "type": "medium"}); // "21:46:09"
365
+ fmt.format(new Date(), {"format": "time", "type": "short"}); // "21:47"
366
+ ```
367
+
368
+ The CLDR data set only includes 4 specific date formats, full, long, medium, and short, so you'll have to choose amongst them for the one that best fits your needs. Yes, it's limiting, but the 4 formats get the job done most of the time :)
369
+
370
+ ### Running Tests (JS)
371
+
372
+ A JavaScript test suite comes with twitter-cldr-rb. You'll need to install the Qt libs to be able to run the suite, as it uses [jasmine](https://github.com/pivotal/jasmine-gem) and [jasmine-headless-webkit](http://johnbintz.github.com/jasmine-headless-webkit/).
373
+
374
+ 1. Install qt (eg. `brew install qt`, `sudo apt-get install qt4`, etc)
375
+ 2. Run `bundle`
376
+ 3. Run `bundle exec rake js:test`
377
+
378
+ The tests are located in `js/spec` and look similar to RSpec tests.
379
+
331
380
  ## Authors
332
381
 
333
382
  * Cameron C. Dutro: http://github.com/camertron
@@ -346,6 +395,5 @@ Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/L
346
395
 
347
396
  ## Future Plans
348
397
 
349
- * Add Javascript support
350
- * Implement algorithms for Unicode normalization, collation, and capitalization
398
+ * Implement Unicode Collation Algorithm (UCA) for sorting/searching.
351
399
  * Patch Ruby 1.8 strings to provide better Unicode support (probably using pack and unpack).
data/Rakefile CHANGED
@@ -1,3 +1,8 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Twitter, Inc
4
+ # http://www.apache.org/licenses/LICENSE-2.0
5
+
1
6
  require 'rubygems' unless ENV['NO_RUBYGEMS']
2
7
 
3
8
  require 'bundler'
@@ -31,4 +36,24 @@ if RUBY_VERSION < '1.9.0'
31
36
  t.pattern = './spec/**/*_spec.rb'
32
37
  t.rcov_opts = %w(-T --sort coverage --exclude gems/,spec/)
33
38
  end
39
+ end
40
+
41
+ namespace :js do
42
+ task :build do
43
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[lib twitter_cldr]))
44
+ TwitterCldr.require_js
45
+ FileUtils.mkdir_p(TwitterCldr::Js.build_dir)
46
+ TwitterCldr::Js.output_dir = File.expand_path(ENV["OUTPUT_DIR"])
47
+ TwitterCldr::Js.make(:locales => TwitterCldr.supported_locales)
48
+ TwitterCldr::Js.install
49
+ end
50
+
51
+ task :test do
52
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[lib twitter_cldr]))
53
+ TwitterCldr.require_js
54
+ FileUtils.mkdir_p(TwitterCldr::Js.build_dir)
55
+ TwitterCldr::Js.make(:locales => [:en])
56
+ TwitterCldr::Js.test
57
+ FileUtils.rm_rf(TwitterCldr::Js.build_dir)
58
+ end
34
59
  end
data/lib/twitter_cldr.rb CHANGED
@@ -4,12 +4,16 @@
4
4
  # http://www.apache.org/licenses/LICENSE-2.0
5
5
 
6
6
  $:.push(File.dirname(__FILE__))
7
+ $:.push(File.dirname(File.dirname(__FILE__)))
7
8
 
8
9
  $KCODE = 'UTF-8' unless RUBY_VERSION >= '1.9.0'
9
10
 
10
11
  require 'yaml'
11
12
  require 'date'
12
13
  require 'time'
14
+ require 'fileutils'
15
+
16
+ # gems
13
17
  require 'forwardable'
14
18
 
15
19
  require 'twitter_cldr/version'
@@ -39,6 +43,9 @@ module TwitterCldr
39
43
  :'zh-tw' => :'zh-Hant'
40
44
  }
41
45
 
46
+ # maps cldr locales to twitter locales
47
+ CLDR_LOCALE_MAP = TWITTER_LOCALE_MAP.invert
48
+
42
49
  def_delegator :resources, :get_resource
43
50
  def_delegator :resources, :get_locale_resource
44
51
 
@@ -64,6 +71,11 @@ module TwitterCldr
64
71
  TWITTER_LOCALE_MAP.fetch(locale, locale)
65
72
  end
66
73
 
74
+ def twitter_locale(locale)
75
+ locale = locale.to_sym
76
+ CLDR_LOCALE_MAP.fetch(locale, locale)
77
+ end
78
+
67
79
  def supported_locales
68
80
  @supported_locales ||= Dir.glob(File.join(RESOURCES_DIR, 'locales', '*')).map { |f| File.basename(f).to_sym }
69
81
  end
@@ -73,8 +85,11 @@ module TwitterCldr
73
85
  supported_locales.include?(locale) || supported_locales.include?(convert_locale(locale))
74
86
  end
75
87
 
88
+ def require_js
89
+ require "js/lib/twitter_cldr_js"
90
+ end
76
91
  end
77
92
 
78
93
  end
79
94
 
80
- require 'twitter_cldr/core_ext'
95
+ require 'twitter_cldr/core_ext'
@@ -2,6 +2,7 @@ require 'twitter_cldr/core_ext/localized_object'
2
2
  require 'twitter_cldr/core_ext/calendars/datetime'
3
3
  require 'twitter_cldr/core_ext/calendars/date'
4
4
  require 'twitter_cldr/core_ext/calendars/time'
5
+ require 'twitter_cldr/core_ext/calendars/timespan'
5
6
  require 'twitter_cldr/core_ext/numbers/localized_number'
6
7
  require 'twitter_cldr/core_ext/numbers/bignum'
7
8
  require 'twitter_cldr/core_ext/numbers/fixnum'
@@ -24,6 +24,20 @@ module TwitterCldr
24
24
  end
25
25
  end
26
26
 
27
+ def ago(options = {})
28
+ base_time = options[:base_time] || Time.now
29
+ seconds = self.to_time.base_obj.to_i - base_time.to_i
30
+ raise ArgumentError.new('Start date is after end date. Consider using "until" function.') if seconds > 0
31
+ TwitterCldr::Shared::LocalizedTimespan.new(seconds, @locale).to_s(options[:unit])
32
+ end
33
+
34
+ def until(options = {})
35
+ base_time = options[:base_time] || Time.now
36
+ seconds = self.to_time.base_obj.to_i - base_time.to_i
37
+ raise ArgumentError.new('End date is before start date. Consider using "ago" function.') if seconds < 0
38
+ TwitterCldr::Shared::LocalizedTimespan.new(seconds, @locale).to_s(options[:unit])
39
+ end
40
+
27
41
  def to_s
28
42
  to_default_s
29
43
  end
@@ -0,0 +1,26 @@
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 Shared
8
+ class LocalizedTimespan < LocalizedObject
9
+
10
+ def initialize(seconds, locale)
11
+ @formatter = TwitterCldr::Formatters::TimespanFormatter.new(:locale => locale)
12
+ @seconds = seconds
13
+ end
14
+
15
+ def to_s(unit = :default)
16
+ @formatter.format(@seconds, unit)
17
+ end
18
+
19
+ protected
20
+
21
+ def formatter_const
22
+ TwitterCldr::Formatters::TimespanFormatter
23
+ end
24
+ end
25
+ end
26
+ end
@@ -10,6 +10,7 @@ module TwitterCldr
10
10
  autoload :DateTimeFormatter, 'twitter_cldr/formatters/calendars/datetime_formatter'
11
11
  autoload :DateFormatter, 'twitter_cldr/formatters/calendars/date_formatter'
12
12
  autoload :TimeFormatter, 'twitter_cldr/formatters/calendars/time_formatter'
13
+ autoload :TimespanFormatter, 'twitter_cldr/formatters/calendars/timespan_formatter'
13
14
 
14
15
  autoload :Numbers, 'twitter_cldr/formatters/numbers'
15
16
  autoload :NumberFormatter, 'twitter_cldr/formatters/numbers/number_formatter'
@@ -113,7 +113,7 @@ module TwitterCldr
113
113
  @tokenizer.calendar[:months][:format][:wide][date.month]
114
114
  when 5
115
115
  raise NotImplementedError, 'requires cldr\'s "multiple inheritance"'
116
- @tokenizer.calendar[:months][:format][:narrow][date.month]
116
+ # @tokenizer.calendar[:months][:format][:narrow][date.month]
117
117
  else
118
118
  # raise unknown date format
119
119
  end
@@ -215,11 +215,6 @@ module TwitterCldr
215
215
  def timezone_generic_non_location(time, pattern, length)
216
216
  raise NotImplementedError, 'requires timezone translation data'
217
217
  end
218
-
219
- def round_to(number, precision)
220
- factor = 10 ** precision
221
- (number * factor).round.to_f / factor
222
- end
223
218
  end
224
219
  end
225
220
  end
@@ -0,0 +1,67 @@
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 TimespanFormatter < Base
9
+ TIME_IN_SECONDS = {
10
+ :second => 1,
11
+ :minute => 60,
12
+ :hour => 3600,
13
+ :day => 86400,
14
+ :week => 604800,
15
+ :month => 2629743.83,
16
+ :year => 31556926
17
+ }
18
+
19
+ def initialize(options = {})
20
+ @tokenizer = TwitterCldr::Tokenizers::TimespanTokenizer.new(:locale => extract_locale(options))
21
+ end
22
+
23
+ def format(seconds, unit)
24
+ direction = seconds < 0 ? :ago : :until
25
+
26
+ if unit.nil? || unit == :default
27
+ unit = self.calculate_unit(seconds.abs)
28
+ end
29
+
30
+ number = calculate_time(seconds.abs, unit)
31
+
32
+ tokens = @tokenizer.tokens(:direction => direction, :unit => unit, :number => number)
33
+ strings = tokens.map { |token| token[:value]}
34
+ strings.join.gsub(/\{[0-9]\}/, number.to_s)
35
+ end
36
+
37
+ def calculate_unit(seconds)
38
+ if seconds < 30
39
+ :second
40
+ elsif seconds < 2670
41
+ :minute
42
+ elsif seconds < 86369
43
+ :hour
44
+ elsif seconds < 604800
45
+ :day
46
+ elsif seconds < 2591969
47
+ :week
48
+ elsif seconds < 31556926
49
+ :month
50
+ else
51
+ :year
52
+ end
53
+ end
54
+
55
+ # 0 <-> 29 secs # => seconds
56
+ # 30 secs <-> 44 mins, 29 secs # => minutes
57
+ # 44 mins, 30 secs <-> 23 hrs, 59 mins, 29 secs # => hours
58
+ # 23 hrs, 59 mins, 29 secs <-> 29 days, 23 hrs, 59 mins, 29 secs # => days
59
+ # 29 days, 23 hrs, 59 mins, 29 secs <-> 1 yr minus 1 sec # => months
60
+ # 1 yr <-> max time or date # => years
61
+ def calculate_time(seconds, unit)
62
+ (seconds / TIME_IN_SECONDS[unit]).round.to_i
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -17,8 +17,8 @@ module TwitterCldr
17
17
  def format(number, options = {})
18
18
  opts = self.default_format_options_for(number).merge(options)
19
19
  prefix, suffix, integer_format, fraction_format = *partition_tokens(self.get_tokens(number, opts))
20
+
20
21
  int, fraction = parse_number(number, opts)
21
-
22
22
  result = integer_format.apply(int, opts)
23
23
  result << fraction_format.apply(fraction, opts) if fraction
24
24
  "#{prefix.to_s}#{result}#{suffix.to_s}"
@@ -13,5 +13,6 @@ module TwitterCldr
13
13
  autoload :DateTokenizer, 'twitter_cldr/tokenizers/calendars/date_tokenizer'
14
14
  autoload :TimeTokenizer, 'twitter_cldr/tokenizers/calendars/time_tokenizer'
15
15
  autoload :NumberTokenizer, 'twitter_cldr/tokenizers/numbers/number_tokenizer'
16
+ autoload :TimespanTokenizer, 'twitter_cldr/tokenizers/calendars/timespan_tokenizer'
16
17
  end
17
18
  end
@@ -41,13 +41,13 @@ module TwitterCldr
41
41
  final
42
42
  end
43
43
 
44
- def tokens_for(key, type)
44
+ def tokens_for(path, type)
45
45
  @@token_cache ||= {}
46
- cache_key = self.compute_cache_key(@locale, key, type)
46
+ cache_key = compute_cache_key(@locale, path.join('.'), type)
47
47
 
48
48
  unless @@token_cache.include?(cache_key)
49
49
  result = []
50
- tokens = self.expand_pattern(self.pattern_for(self.traverse(key)), type)
50
+ tokens = expand_pattern(pattern_for(traverse(path)), type)
51
51
 
52
52
  tokens.each do |token|
53
53
  if token.is_a?(Token) || token.is_a?(CompositeToken)
@@ -63,6 +63,21 @@ module TwitterCldr
63
63
  @@token_cache[cache_key]
64
64
  end
65
65
 
66
+ def tokens_with_placeholders_for(key)
67
+ @@token_cache ||= {}
68
+ cache_key = self.compute_cache_key(@locale, key, type)
69
+
70
+ unless @@token_cache.include?(cache_key)
71
+ result = []
72
+ tokens = self.tokenize_pattern(self.pattern_for(self.traverse(key)))
73
+ tokens.each do |token|
74
+ result << token
75
+ end
76
+ @@token_cache[cache_key] = result
77
+ end
78
+ @@token_cache[cache_key]
79
+ end
80
+
66
81
  def compute_cache_key(*pieces)
67
82
  if pieces && pieces.size > 0
68
83
  pieces.join("|").hash
@@ -75,11 +90,10 @@ module TwitterCldr
75
90
  @placeholders = {}
76
91
  end
77
92
 
78
- def traverse(needle, haystack = @resource)
79
- needle.to_s.split('.').inject(haystack) do |current, segment|
80
- key = segment.to_sym
81
- if current.is_a?(Hash) && current.has_key?(key)
82
- current[key]
93
+ def traverse(path, haystack = @resource)
94
+ path.inject(haystack) do |current, segment|
95
+ if current.is_a?(Hash) && current.has_key?(segment)
96
+ current[segment]
83
97
  else
84
98
  return
85
99
  end
@@ -89,7 +103,7 @@ module TwitterCldr
89
103
  def expand_pattern(format_str, type)
90
104
  if format_str.is_a?(Symbol)
91
105
  # symbols mean another path was given
92
- self.expand_pattern(self.pattern_for(self.traverse(format_str)), type)
106
+ self.expand_pattern(self.pattern_for(self.traverse(format_str.to_s.split('.').map(&:to_sym))), type)
93
107
  else
94
108
  parts = tokenize_pattern(format_str)
95
109
  final = []
@@ -9,14 +9,20 @@ module TwitterCldr
9
9
  def initialize(options = {})
10
10
  super(options)
11
11
  @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}|\#\{[^\}]+\})/
12
- @token_type_regexes = [ { :type => :composite, :regex => /^\#\{[^\}]+\}/, :content => /^\#\{([^\}]+)\}/ },
13
- { :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})/ },
14
- { :type => :plaintext, :regex => // }]
15
- @paths = { :default => "formats.date.default",
16
- :full => "formats.date.full",
17
- :long => "formats.date.long",
18
- :medium => "formats.date.medium",
19
- :short => "formats.date.short" }
12
+
13
+ @token_type_regexes = [
14
+ { :type => :composite, :regex => /^\#\{[^\}]+\}/, :content => /^\#\{([^\}]+)\}/ },
15
+ { :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})/ },
16
+ { :type => :plaintext, :regex => // }
17
+ ]
18
+
19
+ @paths = {
20
+ :default => [:formats, :date, :default],
21
+ :full => [:formats, :date, :full],
22
+ :long => [:formats, :date, :long],
23
+ :medium => [:formats, :date, :medium],
24
+ :short => [:formats, :date, :short]
25
+ }
20
26
  end
21
27
 
22
28
  protected
@@ -12,22 +12,26 @@ module TwitterCldr
12
12
 
13
13
  def initialize(options = {})
14
14
  @calendar_type = options[:calendar_type] || TwitterCldr::DEFAULT_CALENDAR_TYPE
15
+
15
16
  @token_splitter_regex = //
16
- @token_type_regexes = [{ :type => :plaintext, :regex => // }]
17
+ @token_type_regexes = [{ :type => :plaintext, :regex => // }]
18
+
19
+ @base_path = [:calendars]
17
20
 
18
- @base_path = "calendars"
19
- @paths = { :default => "formats.datetime.default",
20
- :full => "formats.datetime.full",
21
- :long => "formats.datetime.long",
22
- :medium => "formats.datetime.medium",
23
- :short => "formats.datetime.short" }
21
+ @paths = {
22
+ :default => [:formats, :datetime, :default],
23
+ :full => [:formats, :datetime, :full],
24
+ :long => [:formats, :datetime, :long],
25
+ :medium => [:formats, :datetime, :medium],
26
+ :short => [:formats, :datetime, :short]
27
+ }
24
28
 
25
29
  super(options)
26
30
  end
27
31
 
28
32
  def tokens(options = {})
29
33
  type = options[:type] || :default
30
- self.tokens_for(self.full_path_for(self.paths[type]), type)
34
+ tokens_for(full_path_for(paths[type]), type)
31
35
  end
32
36
 
33
37
  def calendar
@@ -37,7 +41,7 @@ module TwitterCldr
37
41
  protected
38
42
 
39
43
  def full_path_for(path, calendar_type = @calendar_type)
40
- KeyPath.join(@base_path, calendar_type.to_s, path)
44
+ @base_path + [calendar_type] + path
41
45
  end
42
46
 
43
47
  def init_resources