i18n-js 2.0.1 → 2.1.1

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.
@@ -1,40 +1,40 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- i18n-js (2.0.1)
4
+ i18n-js (2.1.1)
5
5
  i18n
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- activesupport (3.0.9)
11
- archive-tar-minitar (0.5.2)
12
- columnize (0.3.4)
13
- diff-lcs (1.1.2)
10
+ activesupport (3.1.1)
11
+ multi_json (~> 1.0)
12
+ coderay (0.9.8)
13
+ diff-lcs (1.1.3)
14
14
  fakeweb (1.3.0)
15
15
  i18n (0.6.0)
16
- linecache19 (0.5.12)
17
- ruby_core_source (>= 0.1.4)
18
- notifier (0.1.3)
19
- rake (0.8.7)
20
- rspec (2.6.0)
21
- rspec-core (~> 2.6.0)
22
- rspec-expectations (~> 2.6.0)
23
- rspec-mocks (~> 2.6.0)
24
- rspec-core (2.6.4)
25
- rspec-expectations (2.6.0)
16
+ method_source (0.6.7)
17
+ ruby_parser (>= 2.3.1)
18
+ multi_json (1.0.3)
19
+ notifier (0.1.4)
20
+ pry (0.9.7.4)
21
+ coderay (~> 0.9.8)
22
+ method_source (~> 0.6.7)
23
+ ruby_parser (>= 2.3.1)
24
+ slop (~> 2.1.0)
25
+ rake (0.9.2.2)
26
+ rspec (2.7.0)
27
+ rspec-core (~> 2.7.0)
28
+ rspec-expectations (~> 2.7.0)
29
+ rspec-mocks (~> 2.7.0)
30
+ rspec-core (2.7.1)
31
+ rspec-expectations (2.7.0)
26
32
  diff-lcs (~> 1.1.2)
27
- rspec-mocks (2.6.0)
28
- ruby-debug-base19 (0.11.25)
29
- columnize (>= 0.3.1)
30
- linecache19 (>= 0.5.11)
31
- ruby_core_source (>= 0.1.4)
32
- ruby-debug19 (0.11.6)
33
- columnize (>= 0.3.1)
34
- linecache19 (>= 0.5.11)
35
- ruby-debug-base19 (>= 0.11.19)
36
- ruby_core_source (0.1.5)
37
- archive-tar-minitar (>= 0.5.2)
33
+ rspec-mocks (2.7.0)
34
+ ruby_parser (2.3.1)
35
+ sexp_processor (~> 3.0)
36
+ sexp_processor (3.0.8)
37
+ slop (2.1.0)
38
38
  spec-js (0.1.0.beta.3)
39
39
  notifier
40
40
 
@@ -45,7 +45,7 @@ DEPENDENCIES
45
45
  activesupport (>= 3.0.0)
46
46
  fakeweb
47
47
  i18n-js!
48
+ pry
48
49
  rake
49
50
  rspec (~> 2.6)
50
- ruby-debug19
51
51
  spec-js (~> 0.1.0.beta.0)
@@ -18,18 +18,16 @@ Run <tt>rake i18n:js:setup</tt> to copy <tt>i18n.js</tt> to your javascript dire
18
18
 
19
19
  ==== Rails >= 3.1
20
20
 
21
- Run <tt>rake i18n:js:setup</tt> to copy <tt>i18n-js.yml</tt> to your config folder (if not already present). You should change the path in <tt>i18n.js.yml</tt> to <tt>app/assets/javascripts/i18n</tt> to make full use of the asset pipeline.
22
-
23
- Next add the following lines to your application.js to make the javascripts and translations available to your app:
21
+ Add the following lines to your application.js to make the javascripts and translations available to your app:
24
22
 
25
23
  //= require i18n
26
24
  //= require i18n/translations
27
25
 
28
- If you don't want to use the asset pipeline, just disable it on your Rails application by setting <tt>config.assets.enabled</tt> to +false+ on your <tt>config/application.rb</tt> file.
26
+ If asset pipeline has been disabled for your Rails application, then you will need to run <tt>rake i18n:js:setup</tt> to copy <tt>i18n-js.yml</tt> to your config folder (if not already present).
29
27
 
30
28
  ==== Exporting translations
31
29
 
32
- You can export the translations file by running `rake i18n:js:export`.
30
+ You can export the translations file by running <tt>rake i18n:js:export</tt>.
33
31
  Translations will be automatically exported in development mode.
34
32
 
35
33
  ==== Configuration
@@ -52,6 +50,14 @@ If <tt>only</tt> is omitted all the translations will be saved. Also, make sure
52
50
  - file: 'public/javascripts/pt-BR.js'
53
51
  only: 'pt-BR.*'
54
52
 
53
+ Optionaly, you can auto generate a translation file per available locale if you specify the <tt>%{locale}</tt> placeholder.
54
+
55
+ translations:
56
+ - file: "public/javascripts/i18n/%{locale}.js"
57
+ only: '*'
58
+ - file: "public/javascripts/frontend/i18n/%{locale}.js"
59
+ only: ['frontend', 'users']
60
+
55
61
  To find more examples on how to use the configuration file please refer to the tests.
56
62
 
57
63
  === On the Javascript
@@ -63,7 +69,7 @@ Set your locale is easy as
63
69
  I18n.currentLocale();
64
70
  // pt-BR
65
71
 
66
- In practice, you'll have something like the following in your application.html.erb:
72
+ In practice, you'll have something like the following in your <tt>application.html.erb</tt>:
67
73
 
68
74
  <script type="text/javascript">
69
75
  I18n.defaultLocale = "<%= I18n.default_locale %>";
@@ -73,6 +79,8 @@ In practice, you'll have something like the following in your application.html.e
73
79
  You can use translate your messages:
74
80
 
75
81
  I18n.t("some.scoped.translation");
82
+ // or translate with explicite setting of locale
83
+ I18n.t("some.scoped.translation", {locale: "fr"});
76
84
 
77
85
  You can also interpolate values:
78
86
 
@@ -92,6 +100,19 @@ You can set default values for missing scopes:
92
100
  // with interpolation
93
101
  I18n.t("noun", {defaultValue: "I'm a {{noun}}", noun: "Mac"});
94
102
 
103
+ Translation fallback can be handled by taking from I18n.defaultLocale.
104
+ To allow this in your application.html.erb specify:
105
+
106
+ <script type="text/javascript">
107
+ I18n.fallbacks = true;
108
+ </script>
109
+
110
+ Then missing translation will be taken from your I18n.defaultLocale.
111
+ Example:
112
+ // if I18n.defaultLocale = "en" and translation doesn't exist for I18n.locale = "de"
113
+ I18n.t("some.missing.scope");
114
+ // this key will be taken from "en" locale scope
115
+
95
116
  Pluralization is possible as well:
96
117
 
97
118
  I18n.t("inbox.counting", {count: 10}); // You have 10 messages
@@ -258,7 +279,7 @@ First, install all dependencies.
258
279
 
259
280
  bundle install
260
281
 
261
- Then just run `rake spec`.
282
+ Then just run <tt>rake spec</tt>.
262
283
 
263
284
  == License
264
285
 
@@ -21,8 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_development_dependency "fakeweb"
22
22
  s.add_development_dependency "activesupport", ">= 3.0.0"
23
23
  s.add_development_dependency "rspec", "~> 2.6"
24
- s.add_development_dependency "ruby-debug19"
25
24
  s.add_development_dependency "spec-js", "~> 0.1.0.beta.0"
26
25
  s.add_development_dependency "rake"
27
- s.add_development_dependency "ruby-debug19"
26
+ s.add_development_dependency "pry"
28
27
  end
@@ -11,12 +11,25 @@ module SimplesIdeias
11
11
  # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
12
12
  MERGER = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2 }
13
13
 
14
+ # Under rails 3.1.1 and higher, perform a check to ensure that the
15
+ # full environment will be available during asset compilation.
16
+ # This is required to ensure I18n is loaded.
17
+ def assert_usable_configuration!
18
+ @usable_configuration ||= Rails.version >= "3.1.1" &&
19
+ Rails.configuration.assets.initialize_on_precompile ||
20
+ raise("Cannot precompile i18n-js translations unless environment is initialized. Please set config.assets.initialize_on_precompile to true.")
21
+ end
22
+
23
+ def has_asset_pipeline?
24
+ Rails.configuration.respond_to?(:assets) && Rails.configuration.assets.enabled
25
+ end
26
+
14
27
  def config_file
15
28
  Rails.root.join("config/i18n-js.yml")
16
29
  end
17
30
 
18
31
  def export_dir
19
- if Rails.version >= "3.1" && Rails.configuration.assets.enabled
32
+ if has_asset_pipeline?
20
33
  "app/assets/javascripts/i18n"
21
34
  else
22
35
  "public/javascripts"
@@ -30,25 +43,46 @@ module SimplesIdeias
30
43
  # Export translations to JavaScript, considering settings
31
44
  # from configuration file
32
45
  def export!
33
- if config?
34
- for options in config[:translations]
35
- if options[:file] =~ ::I18n::INTERPOLATION_PATTERN
36
- ::I18n.available_locales.each do |locale|
37
- result = scoped_translations("#{locale}.#{options[:only]}")
38
- save result, ::I18n.interpolate(options[:file],{:locale => locale}) unless result.empty?
39
- end
40
- else
41
- options.reverse_merge!(:only => "*")
42
- if options[:only] == "*"
43
- save translations, options[:file]
44
- else
45
- result = scoped_translations(options[:only])
46
- save result, options[:file] unless result.empty?
47
- end
48
- end
46
+ translation_segments.each do |filename, translations|
47
+ save(translations, filename)
48
+ end
49
+ end
50
+
51
+ def segments_per_locale(pattern,scope)
52
+ ::I18n.available_locales.each_with_object({}) do |locale,segments|
53
+ result = scoped_translations("#{locale}.#{scope}")
54
+ unless result.empty?
55
+ segment_name = ::I18n.interpolate(pattern,{:locale => locale})
56
+ segments[segment_name] = result
57
+ end
58
+ end
59
+ end
60
+
61
+ def segment_for_scope(scope)
62
+ if scope == "*"
63
+ translations
64
+ else
65
+ scoped_translations(scope)
66
+ end
67
+ end
68
+
69
+ def configured_segments
70
+ config[:translations].each_with_object({}) do |options,segments|
71
+ options.reverse_merge!(:only => "*")
72
+ if options[:file] =~ ::I18n::INTERPOLATION_PATTERN
73
+ segments.merge!(segments_per_locale(options[:file],options[:only]))
74
+ else
75
+ result = segment_for_scope(options[:only])
76
+ segments[options[:file]] = result unless result.empty?
49
77
  end
78
+ end
79
+ end
80
+
81
+ def translation_segments
82
+ if config? && config[:translations]
83
+ configured_segments
50
84
  else
51
- save translations, "#{export_dir}/translations.js"
85
+ {"#{export_dir}/translations.js" => translations}
52
86
  end
53
87
  end
54
88
 
@@ -77,7 +111,7 @@ module SimplesIdeias
77
111
  # Retrieve an updated JavaScript library from Github.
78
112
  def update!
79
113
  require "open-uri"
80
- contents = open("http://github.com/fnando/i18n-js/raw/master/lib/i18n.js").read
114
+ contents = open("https://raw.github.com/fnando/i18n-js/master/vendor/assets/javascripts/i18n.js").read
81
115
  File.open(javascript_file, "w+") {|f| f << contents}
82
116
  end
83
117
 
@@ -140,3 +174,4 @@ module SimplesIdeias
140
174
  end
141
175
  end
142
176
  end
177
+
@@ -1,7 +1,59 @@
1
1
  module SimplesIdeias
2
2
  module I18n
3
3
  class Engine < ::Rails::Engine
4
- # Engine so the vendor directory gets recognized by the asset pipeline
4
+ I18N_TRANSLATIONS_ASSET = "i18n/translations"
5
+
6
+ initializer "i18n-js.asset_dependencies", :after => "sprockets.environment" do
7
+ next unless SimplesIdeias::I18n.has_asset_pipeline?
8
+
9
+ config = Rails.root.join("config", "i18n-js.yml")
10
+ cache_file = I18n::Engine.load_path_hash_cache
11
+
12
+ Rails.application.assets.register_preprocessor "application/javascript", :"i18n-js_dependencies" do |context, data|
13
+ if context.logical_path == I18N_TRANSLATIONS_ASSET
14
+ context.depend_on(config)
15
+ # also set up dependencies on every locale file
16
+ ::I18n.load_path.each {|path| context.depend_on(path)}
17
+
18
+ # Set up a dependency on the contents of the load path
19
+ # itself. In some situations it is possible to get here
20
+ # before the path hash cache file has been written; in
21
+ # this situation, write it now.
22
+ I18n::Engine.write_hash! unless File.exists?(cache_file)
23
+ context.depend_on(cache_file)
24
+ end
25
+
26
+ data
27
+ end
28
+ end
29
+
30
+ # rewrite path cache hash at startup and before each request in development
31
+ config.to_prepare do
32
+ SimplesIdeias::I18n::Engine.write_hash_if_changed unless Rails.env.production?
33
+ end
34
+
35
+ def self.load_path_hash_cache
36
+ @load_path_hash_cache ||= File.join(Rails.application.paths["tmp"].first, "i18n-js.i18n_path_cache.dat")
37
+ end
38
+
39
+ def self.write_hash_if_changed
40
+ load_path_hash = ::I18n.load_path.hash
41
+
42
+ if load_path_hash != cached_load_path_hash
43
+ self.cached_load_path_hash = load_path_hash
44
+ write_hash!
45
+ end
46
+ end
47
+
48
+ def self.write_hash!
49
+ File.open(load_path_hash_cache, "w") do |f|
50
+ f.write(cached_load_path_hash)
51
+ end
52
+ end
53
+
54
+ class << self
55
+ attr_accessor :cached_load_path_hash
56
+ end
5
57
  end
6
58
  end
7
59
  end
@@ -26,26 +26,33 @@ module SimplesIdeias
26
26
  end
27
27
  end
28
28
 
29
+ # Check if translations should be regenerated.
30
+ # ONLY REGENERATE when these conditions are met:
31
+ #
32
+ # # Cache file doesn't exist
33
+ # # Translations and cache size are different (files were removed/added)
34
+ # # Translation file has been updated
35
+ #
29
36
  def verify_locale_files!
30
37
  valid_cache = []
31
- changed_files = []
38
+ new_cache = {}
32
39
 
33
40
  valid_cache.push cache_path.exist?
34
- valid_cache.push ::I18n.load_path.size == cache.size
41
+ valid_cache.push ::I18n.load_path.uniq.size == cache.size
35
42
 
36
43
  ::I18n.load_path.each do |path|
37
- change = File.mtime(path).to_i
38
- file_has_changed = change != cache[path]
39
- valid_cache.push file_has_changed
40
- changed_files << path if file_has_changed
41
- cache[path] = change
44
+ changed_at = File.mtime(path).to_i
45
+ valid_cache.push changed_at == cache[path]
46
+ new_cache[path] = changed_at
42
47
  end
43
48
 
44
- File.open(cache_path, "w+") do |file|
45
- file << cache.to_yaml
46
- end
49
+ unless valid_cache.all?
50
+ File.open(cache_path, "w+") do |file|
51
+ file << new_cache.to_yaml
52
+ end
47
53
 
48
- SimplesIdeias::I18n.export! unless valid_cache.all?
54
+ SimplesIdeias::I18n.export!
55
+ end
49
56
  end
50
57
  end
51
58
  end
@@ -6,7 +6,7 @@ module SimplesIdeias
6
6
  end
7
7
 
8
8
  initializer "i18n-js.initialize" do |app|
9
- app.config.middleware.use(Middleware) if Rails.env.development?
9
+ app.config.middleware.use(Middleware) if Rails.env.development? && !SimplesIdeias::I18n.has_asset_pipeline?
10
10
  end
11
11
  end
12
12
  end
@@ -2,7 +2,7 @@ module SimplesIdeias
2
2
  module I18n
3
3
  module Version
4
4
  MAJOR = 2
5
- MINOR = 0
5
+ MINOR = 1
6
6
  PATCH = 1
7
7
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
8
8
  end
@@ -135,6 +135,22 @@ describe("I18n.js", function(){
135
135
  expect(I18n.t("greetings.stranger")).toBeEqualTo("Hello stranger!");
136
136
  });
137
137
 
138
+ specify("translation with default locale option", function(){
139
+ expect(I18n.t("hello", {locale: "en"})).toBeEqualTo("Hello World!");
140
+ expect(I18n.t("hello", {locale: "pt-BR"})).toBeEqualTo("Olá Mundo!");
141
+ });
142
+
143
+ specify("translation should fall if locale is missing", function(){
144
+ I18n.locale = "pt-BR";
145
+ expect(I18n.t("greetings.stranger")).toBeEqualTo("[missing \"pt-BR.greetings.stranger\" translation]");
146
+ });
147
+
148
+ specify("translation should handle fallback if I18n.fallbacks == true", function(){
149
+ I18n.locale = "pt-BR";
150
+ I18n.fallbacks = true;
151
+ expect(I18n.t("greetings.stranger")).toBeEqualTo("Hello stranger!");
152
+ });
153
+
138
154
  specify("single interpolation", function(){
139
155
  actual = I18n.t("greetings.name", {name: "John Doe"});
140
156
  expect(actual).toBeEqualTo("Hello John Doe!");
@@ -1,12 +1,11 @@
1
1
  require "spec_helper"
2
2
 
3
3
  if File.basename(Rails.root) != "tmp"
4
- warn <<-TXT
4
+ abort <<-TXT
5
5
  \e[31;5m
6
6
  WARNING: That will remove your project!
7
7
  Please go to #{File.expand_path(File.dirname(__FILE__) + "/..")} and run `rake spec`\e[0m
8
8
  TXT
9
- exit 1
10
9
  end
11
10
 
12
11
  describe SimplesIdeias::I18n do
@@ -88,10 +87,16 @@ describe SimplesIdeias::I18n do
88
87
  File.should be_file(Rails.root.join("public/javascripts/tudo.js"))
89
88
  end
90
89
 
90
+ it "ignores an empty config file" do
91
+ set_config "no_config.yml"
92
+ SimplesIdeias::I18n.export!
93
+ Rails.root.join(SimplesIdeias::I18n.export_dir, "translations.js").should be_file
94
+ end
95
+
91
96
  it "exports to a JS file per available locale" do
92
97
  set_config "js_file_per_locale.yml"
93
98
  SimplesIdeias::I18n.export!
94
-
99
+
95
100
  File.should be_file(Rails.root.join("public/javascripts/i18n/en.js"))
96
101
  end
97
102
 
@@ -154,7 +159,7 @@ describe SimplesIdeias::I18n do
154
159
  end
155
160
 
156
161
  it "updates the javascript library" do
157
- FakeWeb.register_uri(:get, "http://github.com/fnando/i18n-js/raw/master/lib/i18n.js", :body => "UPDATED")
162
+ FakeWeb.register_uri(:get, "https://raw.github.com/fnando/i18n-js/master/vendor/assets/javascripts/i18n.js", :body => "UPDATED")
158
163
 
159
164
  SimplesIdeias::I18n.setup!
160
165
  SimplesIdeias::I18n.update!
@@ -162,24 +167,28 @@ describe SimplesIdeias::I18n do
162
167
  end
163
168
 
164
169
  describe "#export_dir" do
165
- it "detects Rails 3.1 with asset pipeline enabled" do
166
- Rails.version = "3.1"
167
- Rails.stub_chain(:configuration, :assets, :enabled => true)
170
+ it "detects asset pipeline support" do
171
+ SimplesIdeias::I18n.stub :has_asset_pipeline? => true
168
172
  SimplesIdeias::I18n.export_dir == "vendor/assets/javascripts"
169
173
  end
170
174
 
171
- it "detects Rails 3.1 with asset pipeline disabled" do
172
- Rails.version = "3.1"
173
- Rails.stub_chain(:configuration, :assets, :enabled => false)
174
- SimplesIdeias::I18n.export_dir == "public/javascripts"
175
- end
176
-
177
175
  it "detects older Rails" do
178
- Rails.version = "3.0.9"
176
+ SimplesIdeias::I18n.stub :has_asset_pipeline? => false
179
177
  SimplesIdeias::I18n.export_dir.to_s.should == "public/javascripts"
180
178
  end
181
179
  end
182
180
 
181
+ describe "#has_asset_pipeline?" do
182
+ it "detects support" do
183
+ Rails.stub_chain(:configuration, :assets, :enabled => true)
184
+ SimplesIdeias::I18n.should have_asset_pipeline
185
+ end
186
+
187
+ it "skips support" do
188
+ SimplesIdeias::I18n.should_not have_asset_pipeline
189
+ end
190
+ end
191
+
183
192
  private
184
193
  # Set the configuration as the current one
185
194
  def set_config(path)
@@ -193,3 +202,4 @@ describe SimplesIdeias::I18n do
193
202
  SimplesIdeias::I18n.translations
194
203
  end
195
204
  end
205
+
@@ -0,0 +1,2 @@
1
+ #This file has no config
2
+
@@ -4,6 +4,9 @@ var I18n = I18n || {};
4
4
  // Set default locale to english
5
5
  I18n.defaultLocale = "en";
6
6
 
7
+ // Set default handling of translation fallbacks to false
8
+ I18n.fallbacks = false;
9
+
7
10
  // Set default separator
8
11
  I18n.defaultSeparator = ".";
9
12
 
@@ -13,18 +16,20 @@ I18n.locale = null;
13
16
  // Set the placeholder format. Accepts `{{placeholder}}` and `%{placeholder}`.
14
17
  I18n.PLACEHOLDER = /(?:\{\{|%\{)(.*?)(?:\}\}?)/gm;
15
18
 
16
- I18n.isValidNode = function(obj, node) {
17
- // local undefined variable in case another library corrupts window.undefined
18
- var undef;
19
- return obj[node] !== null && obj[node] !== undef;
19
+ I18n.isValidNode = function(obj, node, undefined) {
20
+ return obj[node] !== null && obj[node] !== undefined;
20
21
  }
21
22
 
22
23
  I18n.lookup = function(scope, options) {
23
- var translations = this.prepareOptions(I18n.translations);
24
- var messages = translations[I18n.currentLocale()];
25
- options = this.prepareOptions(options);
24
+ var options = options || {}
25
+ , lookupInitialScope = scope
26
+ , translations = this.prepareOptions(I18n.translations)
27
+ , messages = translations[options.locale || I18n.currentLocale()]
28
+ , options = this.prepareOptions(options)
29
+ , currentScope
30
+ ;
26
31
 
27
- if (!messages) {
32
+ if (!messages){
28
33
  return;
29
34
  }
30
35
 
@@ -39,10 +44,13 @@ I18n.lookup = function(scope, options) {
39
44
  scope = scope.split(this.defaultSeparator);
40
45
 
41
46
  while (scope.length > 0) {
42
- var currentScope = scope.shift();
47
+ currentScope = scope.shift();
43
48
  messages = messages[currentScope];
44
49
 
45
50
  if (!messages) {
51
+ if (I18n.fallbacks && !options.fallback) {
52
+ messages = I18n.lookup(lookupInitialScope, this.prepareOptions({ locale: I18n.defaultLocale, fallback: true }, options));
53
+ }
46
54
  break;
47
55
  }
48
56
  }
@@ -61,9 +69,10 @@ I18n.lookup = function(scope, options) {
61
69
  // #=> {name: "John Doe", role: "user"}
62
70
  //
63
71
  I18n.prepareOptions = function() {
64
- var options = {};
65
- var opts;
66
- var count = arguments.length;
72
+ var options = {}
73
+ , opts
74
+ , count = arguments.length
75
+ ;
67
76
 
68
77
  for (var i = 0; i < count; i++) {
69
78
  opts = arguments[i];
@@ -84,14 +93,16 @@ I18n.prepareOptions = function() {
84
93
 
85
94
  I18n.interpolate = function(message, options) {
86
95
  options = this.prepareOptions(options);
87
- var matches = message.match(this.PLACEHOLDER);
96
+ var matches = message.match(this.PLACEHOLDER)
97
+ , placeholder
98
+ , value
99
+ , name
100
+ ;
88
101
 
89
102
  if (!matches) {
90
103
  return message;
91
104
  }
92
105
 
93
- var placeholder, value, name;
94
-
95
106
  for (var i = 0; placeholder = matches[i]; i++) {
96
107
  name = placeholder.replace(this.PLACEHOLDER, "$1");
97
108
 
@@ -193,8 +204,9 @@ I18n.parseDate = function(date) {
193
204
  };
194
205
 
195
206
  I18n.toTime = function(scope, d) {
196
- var date = this.parseDate(d);
197
- var format = this.lookup(scope);
207
+ var date = this.parseDate(d)
208
+ , format = this.lookup(scope)
209
+ ;
198
210
 
199
211
  if (date.toString().match(/invalid/i)) {
200
212
  return date.toString();
@@ -213,21 +225,23 @@ I18n.strftime = function(date, format) {
213
225
  if (!options) {
214
226
  return date.toString();
215
227
  }
228
+
216
229
  options.meridian = options.meridian || ["AM", "PM"];
217
230
 
218
- var weekDay = date.getDay();
219
- var day = date.getDate();
220
- var year = date.getFullYear();
221
- var month = date.getMonth() + 1;
222
- var hour = date.getHours();
223
- var hour12 = hour;
224
- var meridian = hour > 11 ? 1 : 0;
225
- var secs = date.getSeconds();
226
- var mins = date.getMinutes();
227
- var offset = date.getTimezoneOffset();
228
- var absOffsetHours = Math.floor(Math.abs(offset / 60));
229
- var absOffsetMinutes = Math.abs(offset) - (absOffsetHours * 60);
230
- var timezoneoffset = (offset > 0 ? "-" : "+") + (absOffsetHours.toString().length < 2 ? "0" + absOffsetHours : absOffsetHours) + (absOffsetMinutes.toString().length < 2 ? "0" + absOffsetMinutes : absOffsetMinutes);
231
+ var weekDay = date.getDay()
232
+ , day = date.getDate()
233
+ , year = date.getFullYear()
234
+ , month = date.getMonth() + 1
235
+ , hour = date.getHours()
236
+ , hour12 = hour
237
+ , meridian = hour > 11 ? 1 : 0
238
+ , secs = date.getSeconds()
239
+ , mins = date.getMinutes()
240
+ , offset = date.getTimezoneOffset()
241
+ , absOffsetHours = Math.floor(Math.abs(offset / 60))
242
+ , absOffsetMinutes = Math.abs(offset) - (absOffsetHours * 60)
243
+ , timezoneoffset = (offset > 0 ? "-" : "+") + (absOffsetHours.toString().length < 2 ? "0" + absOffsetHours : absOffsetHours) + (absOffsetMinutes.toString().length < 2 ? "0" + absOffsetMinutes : absOffsetMinutes)
244
+ ;
231
245
 
232
246
  if (hour12 > 12) {
233
247
  hour12 = hour12 - 12;
@@ -275,21 +289,23 @@ I18n.toNumber = function(number, options) {
275
289
  {precision: 3, separator: ".", delimiter: ",", strip_insignificant_zeros: false}
276
290
  );
277
291
 
278
- var negative = number < 0;
279
- var string = Math.abs(number).toFixed(options.precision).toString();
280
- var parts = string.split(".");
292
+ var negative = number < 0
293
+ , string = Math.abs(number).toFixed(options.precision).toString()
294
+ , parts = string.split(".")
295
+ , precision
296
+ , buffer = []
297
+ , formattedNumber
298
+ ;
281
299
 
282
300
  number = parts[0];
283
- var precision = parts[1];
284
-
285
- var n = [];
301
+ precision = parts[1];
286
302
 
287
303
  while (number.length > 0) {
288
- n.unshift(number.substr(Math.max(0, number.length - 3), 3));
304
+ buffer.unshift(number.substr(Math.max(0, number.length - 3), 3));
289
305
  number = number.substr(0, number.length -3);
290
306
  }
291
307
 
292
- var formattedNumber = n.join(options.delimiter);
308
+ formattedNumber = buffer.join(options.delimiter);
293
309
 
294
310
  if (options.precision > 0) {
295
311
  formattedNumber += options.separator + parts[1];
@@ -307,7 +323,8 @@ I18n.toNumber = function(number, options) {
307
323
 
308
324
  formattedNumber = formattedNumber
309
325
  .replace(regex.zeros, "")
310
- .replace(regex.separator, "");
326
+ .replace(regex.separator, "")
327
+ ;
311
328
  }
312
329
 
313
330
  return formattedNumber;
@@ -324,7 +341,8 @@ I18n.toCurrency = function(number, options) {
324
341
  number = this.toNumber(number, options);
325
342
  number = options.format
326
343
  .replace("%u", options.unit)
327
- .replace("%n", number);
344
+ .replace("%n", number)
345
+ ;
328
346
 
329
347
  return number;
330
348
  };
@@ -358,7 +376,8 @@ I18n.toHumanSize = function(number, options) {
358
376
  number = this.toNumber(size, options);
359
377
  number = options.format
360
378
  .replace("%u", unit)
361
- .replace("%n", number);
379
+ .replace("%n", number)
380
+ ;
362
381
 
363
382
  return number;
364
383
  };
@@ -408,8 +427,9 @@ I18n.pluralize = function(count, scope, options) {
408
427
  };
409
428
 
410
429
  I18n.missingTranslation = function() {
411
- var message = '[missing "' + this.currentLocale();
412
- var count = arguments.length;
430
+ var message = '[missing "' + this.currentLocale()
431
+ , count = arguments.length
432
+ ;
413
433
 
414
434
  for (var i = 0; i < count; i++) {
415
435
  message += "." + arguments[i];
@@ -0,0 +1,7 @@
1
+ <% SimplesIdeias::I18n.assert_usable_configuration! %>
2
+ var I18n = I18n || {};
3
+ I18n.translations = <%=
4
+ SimplesIdeias::I18n.translation_segments.each_with_object({}) do |(name, segment),translations|
5
+ translations.merge!(segment)
6
+ end.to_json
7
+ %>;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-js
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-29 00:00:00.000000000Z
12
+ date: 2011-11-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
16
- requirement: &70095310296720 !ruby/object:Gem::Requirement
16
+ requirement: &70281327448420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70095310296720
24
+ version_requirements: *70281327448420
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fakeweb
27
- requirement: &70095310295900 !ruby/object:Gem::Requirement
27
+ requirement: &70281327447820 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70095310295900
35
+ version_requirements: *70281327447820
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activesupport
38
- requirement: &70095310294720 !ruby/object:Gem::Requirement
38
+ requirement: &70281327437540 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 3.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70095310294720
46
+ version_requirements: *70281327437540
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70095310293520 !ruby/object:Gem::Requirement
49
+ requirement: &70281327436980 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,21 +54,10 @@ dependencies:
54
54
  version: '2.6'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70095310293520
58
- - !ruby/object:Gem::Dependency
59
- name: ruby-debug19
60
- requirement: &70095310293060 !ruby/object:Gem::Requirement
61
- none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
66
- type: :development
67
- prerelease: false
68
- version_requirements: *70095310293060
57
+ version_requirements: *70281327436980
69
58
  - !ruby/object:Gem::Dependency
70
59
  name: spec-js
71
- requirement: &70095310292000 !ruby/object:Gem::Requirement
60
+ requirement: &70281327436280 !ruby/object:Gem::Requirement
72
61
  none: false
73
62
  requirements:
74
63
  - - ~>
@@ -76,10 +65,10 @@ dependencies:
76
65
  version: 0.1.0.beta.0
77
66
  type: :development
78
67
  prerelease: false
79
- version_requirements: *70095310292000
68
+ version_requirements: *70281327436280
80
69
  - !ruby/object:Gem::Dependency
81
70
  name: rake
82
- requirement: &70095310290820 !ruby/object:Gem::Requirement
71
+ requirement: &70281327435620 !ruby/object:Gem::Requirement
83
72
  none: false
84
73
  requirements:
85
74
  - - ! '>='
@@ -87,10 +76,10 @@ dependencies:
87
76
  version: '0'
88
77
  type: :development
89
78
  prerelease: false
90
- version_requirements: *70095310290820
79
+ version_requirements: *70281327435620
91
80
  - !ruby/object:Gem::Dependency
92
- name: ruby-debug19
93
- requirement: &70095310288840 !ruby/object:Gem::Requirement
81
+ name: pry
82
+ requirement: &70281327434980 !ruby/object:Gem::Requirement
94
83
  none: false
95
84
  requirements:
96
85
  - - ! '>='
@@ -98,7 +87,7 @@ dependencies:
98
87
  version: '0'
99
88
  type: :development
100
89
  prerelease: false
101
- version_requirements: *70095310288840
90
+ version_requirements: *70281327434980
102
91
  description: It's a small library to provide the Rails I18n translations on the Javascript.
103
92
  email:
104
93
  - fnando.vieira@gmail.com
@@ -128,10 +117,12 @@ files:
128
117
  - spec/resources/locales.yml
129
118
  - spec/resources/multiple_conditions.yml
130
119
  - spec/resources/multiple_files.yml
120
+ - spec/resources/no_config.yml
131
121
  - spec/resources/no_scope.yml
132
122
  - spec/resources/simple_scope.yml
133
123
  - spec/spec_helper.rb
134
124
  - vendor/assets/javascripts/i18n.js
125
+ - vendor/assets/javascripts/i18n/translations.js.erb
135
126
  homepage: http://rubygems.org/gems/i18n-js
136
127
  licenses: []
137
128
  post_install_message:
@@ -146,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
137
  version: '0'
147
138
  segments:
148
139
  - 0
149
- hash: 3561709874973960636
140
+ hash: -2888069354346865938
150
141
  required_rubygems_version: !ruby/object:Gem::Requirement
151
142
  none: false
152
143
  requirements:
@@ -155,10 +146,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
146
  version: '0'
156
147
  segments:
157
148
  - 0
158
- hash: 3561709874973960636
149
+ hash: -2888069354346865938
159
150
  requirements: []
160
151
  rubyforge_project:
161
- rubygems_version: 1.8.10
152
+ rubygems_version: 1.8.11
162
153
  signing_key:
163
154
  specification_version: 3
164
155
  summary: It's a small library to provide the Rails I18n translations on the Javascript.
@@ -171,6 +162,7 @@ test_files:
171
162
  - spec/resources/locales.yml
172
163
  - spec/resources/multiple_conditions.yml
173
164
  - spec/resources/multiple_files.yml
165
+ - spec/resources/no_config.yml
174
166
  - spec/resources/no_scope.yml
175
167
  - spec/resources/simple_scope.yml
176
168
  - spec/spec_helper.rb