i18n-js 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/Gemfile.lock +19 -17
- data/README.rdoc +12 -11
- data/config/i18n-js.yml +18 -0
- data/i18n-js.gemspec +3 -2
- data/lib/i18n-js.rb +23 -5
- data/lib/i18n-js/engine.rb +7 -0
- data/lib/i18n-js/railtie.rb +7 -1
- data/lib/{tasks/i18n-js_tasks.rake → i18n-js/rake.rb} +1 -1
- data/lib/i18n-js/version.rb +2 -2
- data/spec/i18n_spec.js +147 -138
- data/spec/i18n_spec.rb +42 -1
- data/spec/resources/locales.yml +2 -2
- data/{source → vendor/assets/javascripts}/i18n.js +29 -12
- metadata +87 -75
- data/source/i18n-js.yml +0 -4
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format documentation
|
data/Gemfile.lock
CHANGED
@@ -1,30 +1,31 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
i18n-js (1.0
|
4
|
+
i18n-js (1.1.0)
|
5
5
|
i18n
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activesupport (3.0.
|
10
|
+
activesupport (3.0.9)
|
11
11
|
archive-tar-minitar (0.5.2)
|
12
|
-
columnize (0.3.
|
12
|
+
columnize (0.3.4)
|
13
13
|
diff-lcs (1.1.2)
|
14
14
|
fakeweb (1.3.0)
|
15
|
-
i18n (0.
|
16
|
-
linecache19 (0.5.
|
15
|
+
i18n (0.6.0)
|
16
|
+
linecache19 (0.5.12)
|
17
17
|
ruby_core_source (>= 0.1.4)
|
18
|
-
notifier (0.1.
|
19
|
-
|
20
|
-
|
21
|
-
rspec-
|
22
|
-
rspec-
|
23
|
-
|
24
|
-
rspec-
|
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)
|
25
26
|
diff-lcs (~> 1.1.2)
|
26
|
-
rspec-mocks (2.
|
27
|
-
ruby-debug-base19 (0.11.
|
27
|
+
rspec-mocks (2.6.0)
|
28
|
+
ruby-debug-base19 (0.11.25)
|
28
29
|
columnize (>= 0.3.1)
|
29
30
|
linecache19 (>= 0.5.11)
|
30
31
|
ruby_core_source (>= 0.1.4)
|
@@ -32,7 +33,7 @@ GEM
|
|
32
33
|
columnize (>= 0.3.1)
|
33
34
|
linecache19 (>= 0.5.11)
|
34
35
|
ruby-debug-base19 (>= 0.11.19)
|
35
|
-
ruby_core_source (0.1.
|
36
|
+
ruby_core_source (0.1.5)
|
36
37
|
archive-tar-minitar (>= 0.5.2)
|
37
38
|
spec-js (0.1.0.beta.3)
|
38
39
|
notifier
|
@@ -41,9 +42,10 @@ PLATFORMS
|
|
41
42
|
ruby
|
42
43
|
|
43
44
|
DEPENDENCIES
|
44
|
-
activesupport (
|
45
|
+
activesupport (>= 3.0.0)
|
45
46
|
fakeweb
|
46
47
|
i18n-js!
|
47
|
-
|
48
|
+
rake (= 0.8.7)
|
49
|
+
rspec (~> 2.6)
|
48
50
|
ruby-debug19
|
49
51
|
spec-js (~> 0.1.0.beta.0)
|
data/README.rdoc
CHANGED
@@ -17,21 +17,22 @@ This library has been tested on:
|
|
17
17
|
|
18
18
|
=== Setting up
|
19
19
|
|
20
|
+
==== Rails <= 3.0
|
20
21
|
Run <tt>rake i18n:setup</tt> to copy <tt>i18n.js</tt> to your javascript directory and <tt>i18n-js.yml</tt> to your config folder (if not already present). Then you're ready to go!
|
21
22
|
|
22
|
-
|
23
|
+
==== Rails >= 3.1
|
24
|
+
Run <tt>rake i18n: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.
|
25
|
+
Next add the following lines to your application.js to make the javascripts and translations available to your app:
|
23
26
|
|
24
|
-
|
25
|
-
|
27
|
+
//= require i18n
|
28
|
+
//= require i18n/translations
|
26
29
|
|
27
|
-
|
28
|
-
before_filter :export_i18n_messages
|
30
|
+
If you don't want to use the asset pipeline, just disable it on your configuration file by setting <tt>asset_pipeline</tt> to <tt>false</tt>.
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
32
|
+
==== Exporting translations
|
33
|
+
|
34
|
+
You can export the translations file by running `rake i18n:js:export`. Translations will be automatically exported in development mode, but you can set the <tt>auto_export</tt> option
|
35
|
+
to <tt>true</tt> on your configuration file if you want to export translations when your app is booted.
|
35
36
|
|
36
37
|
==== Configuration
|
37
38
|
|
@@ -258,7 +259,7 @@ To run Ruby tests, you need to install http://github.com/rspec/rspec
|
|
258
259
|
|
259
260
|
To run JavaScript tests, you need to install http://github.com/fnando/spec-js
|
260
261
|
|
261
|
-
gem install
|
262
|
+
gem install spec-js --pre
|
262
263
|
|
263
264
|
Then just run `rake spec`.
|
264
265
|
|
data/config/i18n-js.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Find more details about this configuration file
|
2
|
+
# at http://github.com/fnando/i18n-js
|
3
|
+
|
4
|
+
# Automatically export translations when running in
|
5
|
+
# development mode, or once when your app is booted
|
6
|
+
# in production mode.
|
7
|
+
auto_export: no
|
8
|
+
|
9
|
+
# Split context in several files.
|
10
|
+
# By default only one file is exported.
|
11
|
+
translations:
|
12
|
+
- file: "public/javascripts/translations.js"
|
13
|
+
only: "*"
|
14
|
+
|
15
|
+
# Use Rails 3.1 asset pipeline feature.
|
16
|
+
# You can disable it by changing the following
|
17
|
+
# line to "no".
|
18
|
+
asset_pipeline: yes
|
data/i18n-js.gemspec
CHANGED
@@ -19,8 +19,9 @@ Gem::Specification.new do |s|
|
|
19
19
|
|
20
20
|
s.add_dependency "i18n"
|
21
21
|
s.add_development_dependency "fakeweb"
|
22
|
-
s.add_development_dependency "activesupport", "
|
23
|
-
s.add_development_dependency "rspec", "~> 2.
|
22
|
+
s.add_development_dependency "activesupport", ">= 3.0.0"
|
23
|
+
s.add_development_dependency "rspec", "~> 2.6"
|
24
24
|
s.add_development_dependency "ruby-debug19"
|
25
25
|
s.add_development_dependency "spec-js", "~> 0.1.0.beta.0"
|
26
|
+
s.add_development_dependency "rake", "0.8.7"
|
26
27
|
end
|
data/lib/i18n-js.rb
CHANGED
@@ -5,6 +5,7 @@ module SimplesIdeias
|
|
5
5
|
extend self
|
6
6
|
|
7
7
|
require "i18n-js/railtie" if Rails.version >= "3.0"
|
8
|
+
require "i18n-js/engine" if Rails.version >= "3.1"
|
8
9
|
|
9
10
|
# deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
|
10
11
|
MERGER = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2 }
|
@@ -13,8 +14,16 @@ module SimplesIdeias
|
|
13
14
|
Rails.root.join("config/i18n-js.yml")
|
14
15
|
end
|
15
16
|
|
17
|
+
def export_dir
|
18
|
+
if Rails.version >= "3.1" && config.fetch(:asset_pipeline, true)
|
19
|
+
"app/assets/javascripts/i18n"
|
20
|
+
else
|
21
|
+
"public/javascripts"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
16
25
|
def javascript_file
|
17
|
-
Rails.root.join("
|
26
|
+
Rails.root.join(export_dir, "i18n.js")
|
18
27
|
end
|
19
28
|
|
20
29
|
# Export translations to JavaScript, considering settings
|
@@ -32,14 +41,23 @@ module SimplesIdeias
|
|
32
41
|
end
|
33
42
|
end
|
34
43
|
else
|
35
|
-
save translations, "
|
44
|
+
save translations, "#{export_dir}/translations.js"
|
36
45
|
end
|
37
46
|
end
|
38
47
|
|
39
48
|
# Load configuration file for partial exporting and
|
40
49
|
# custom output directory
|
41
50
|
def config
|
42
|
-
|
51
|
+
if config?
|
52
|
+
YAML.load_file(config_file).with_indifferent_access
|
53
|
+
else
|
54
|
+
{}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Check if translations can be automatically exported.
|
59
|
+
def auto_export?
|
60
|
+
Rails.env.development? || (config? && config[:auto_export])
|
43
61
|
end
|
44
62
|
|
45
63
|
# Check if configuration file exist
|
@@ -50,8 +68,8 @@ module SimplesIdeias
|
|
50
68
|
# Copy configuration and JavaScript library files to
|
51
69
|
# <tt>config/i18n-js.yml</tt> and <tt>public/javascripts/i18n.js</tt>.
|
52
70
|
def setup!
|
53
|
-
FileUtils.cp
|
54
|
-
FileUtils.cp(File.dirname(__FILE__) + "/../
|
71
|
+
FileUtils.cp(File.dirname(__FILE__) + "/../vendor/assets/javascripts/i18n.js", javascript_file) unless Rails.version >= "3.1"
|
72
|
+
FileUtils.cp(File.dirname(__FILE__) + "/../config/i18n-js.yml", config_file) unless config?
|
55
73
|
end
|
56
74
|
|
57
75
|
# Retrieve an updated JavaScript library from Github.
|
data/lib/i18n-js/railtie.rb
CHANGED
@@ -2,7 +2,13 @@ module SimplesIdeias
|
|
2
2
|
module I18n
|
3
3
|
class Railtie < Rails::Railtie
|
4
4
|
rake_tasks do
|
5
|
-
|
5
|
+
require "i18n-js/rake"
|
6
|
+
end
|
7
|
+
|
8
|
+
config.to_prepare do
|
9
|
+
SimplesIdeias::I18n.tap do |i18n|
|
10
|
+
i18n.export! if i18n.auto_export?
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
8
14
|
end
|
data/lib/i18n-js/version.rb
CHANGED
data/spec/i18n_spec.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
load("
|
1
|
+
load("vendor/assets/javascripts/i18n.js");
|
2
2
|
|
3
3
|
describe("I18n.js", function(){
|
4
4
|
before(function() {
|
@@ -34,7 +34,7 @@ describe("I18n.js", function(){
|
|
34
34
|
one: "Byte",
|
35
35
|
other: "Bytes"
|
36
36
|
},
|
37
|
-
|
37
|
+
|
38
38
|
"kb": "KB",
|
39
39
|
"mb": "MB",
|
40
40
|
"gb": "GB",
|
@@ -94,128 +94,128 @@ describe("I18n.js", function(){
|
|
94
94
|
}
|
95
95
|
};
|
96
96
|
});
|
97
|
-
|
97
|
+
|
98
98
|
specify("with default options", function(){
|
99
99
|
expect(I18n.defaultLocale).toBeEqualTo("en");
|
100
100
|
expect(I18n.locale).toBeEqualTo(null);
|
101
101
|
expect(I18n.currentLocale()).toBeEqualTo("en");
|
102
102
|
});
|
103
|
-
|
103
|
+
|
104
104
|
specify("with custom locale", function(){
|
105
105
|
I18n.locale = "pt-BR";
|
106
106
|
expect(I18n.currentLocale()).toBeEqualTo("pt-BR");
|
107
107
|
});
|
108
|
-
|
108
|
+
|
109
109
|
specify("aliases", function(){
|
110
110
|
expect(I18n.t).toBe(I18n.translate);
|
111
111
|
expect(I18n.l).toBe(I18n.localize);
|
112
112
|
expect(I18n.p).toBe(I18n.pluralize);
|
113
113
|
});
|
114
|
-
|
114
|
+
|
115
115
|
specify("translation with single scope", function(){
|
116
116
|
expect(I18n.t("hello")).toBeEqualTo("Hello World!");
|
117
117
|
});
|
118
|
-
|
118
|
+
|
119
119
|
specify("translation as object", function(){
|
120
120
|
expect(I18n.t("greetings")).toBeInstanceOf(Object);
|
121
121
|
});
|
122
|
-
|
122
|
+
|
123
123
|
specify("translation with invalid scope shall not block", function(){
|
124
124
|
actual = I18n.t("invalid.scope.shall.not.block");
|
125
125
|
expected = '[missing "en.invalid.scope.shall.not.block" translation]';
|
126
126
|
expect(actual).toBeEqualTo(expected);
|
127
127
|
});
|
128
|
-
|
128
|
+
|
129
129
|
specify("translation for single scope on a custom locale", function(){
|
130
130
|
I18n.locale = "pt-BR";
|
131
131
|
expect(I18n.t("hello")).toBeEqualTo("Olá Mundo!");
|
132
132
|
});
|
133
|
-
|
133
|
+
|
134
134
|
specify("translation for multiple scopes", function(){
|
135
135
|
expect(I18n.t("greetings.stranger")).toBeEqualTo("Hello stranger!");
|
136
136
|
});
|
137
|
-
|
137
|
+
|
138
138
|
specify("single interpolation", function(){
|
139
139
|
actual = I18n.t("greetings.name", {name: "John Doe"});
|
140
140
|
expect(actual).toBeEqualTo("Hello John Doe!");
|
141
141
|
});
|
142
|
-
|
142
|
+
|
143
143
|
specify("multiple interpolation", function(){
|
144
144
|
actual = I18n.t("profile.details", {name: "John Doe", age: 27});
|
145
145
|
expect(actual).toBeEqualTo("John Doe is 27-years old");
|
146
146
|
});
|
147
|
-
|
147
|
+
|
148
148
|
specify("translation with count option", function(){
|
149
149
|
expect(I18n.t("inbox", {count: 0})).toBeEqualTo("You have no messages");
|
150
150
|
expect(I18n.t("inbox", {count: 1})).toBeEqualTo("You have 1 message");
|
151
151
|
expect(I18n.t("inbox", {count: 5})).toBeEqualTo("You have 5 messages");
|
152
152
|
});
|
153
|
-
|
153
|
+
|
154
154
|
specify("translation with count option and multiple placeholders", function(){
|
155
155
|
actual = I18n.t("unread", {unread: 5, count: 1});
|
156
156
|
expect(actual).toBeEqualTo("You have 1 new message (5 unread)");
|
157
|
-
|
157
|
+
|
158
158
|
actual = I18n.t("unread", {unread: 2, count: 10});
|
159
159
|
expect(actual).toBeEqualTo("You have 10 new messages (2 unread)");
|
160
|
-
|
160
|
+
|
161
161
|
actual = I18n.t("unread", {unread: 5, count: 0});
|
162
162
|
expect(actual).toBeEqualTo("You have no new messages (5 unread)");
|
163
163
|
});
|
164
|
-
|
164
|
+
|
165
165
|
specify("missing translation with count option", function(){
|
166
166
|
actual = I18n.t("invalid", {count: 1});
|
167
167
|
expect(actual).toBeEqualTo('[missing "en.invalid" translation]');
|
168
|
-
|
168
|
+
|
169
169
|
I18n.translations.en.inbox.one = null;
|
170
170
|
actual = I18n.t("inbox", {count: 1});
|
171
171
|
expect(actual).toBeEqualTo('[missing "en.inbox.one" translation]');
|
172
172
|
});
|
173
|
-
|
173
|
+
|
174
174
|
specify("pluralization", function(){
|
175
175
|
expect(I18n.p(0, "inbox")).toBeEqualTo("You have no messages");
|
176
176
|
expect(I18n.p(1, "inbox")).toBeEqualTo("You have 1 message");
|
177
177
|
expect(I18n.p(5, "inbox")).toBeEqualTo("You have 5 messages");
|
178
178
|
});
|
179
|
-
|
179
|
+
|
180
180
|
specify("pluralize should return 'other' scope", function(){
|
181
181
|
I18n.translations["en"]["inbox"]["zero"] = null;
|
182
182
|
expect(I18n.p(0, "inbox")).toBeEqualTo("You have 0 messages");
|
183
183
|
});
|
184
|
-
|
184
|
+
|
185
185
|
specify("pluralize should return 'zero' scope", function(){
|
186
186
|
I18n.translations["en"]["inbox"]["zero"] = "No messages (zero)";
|
187
187
|
I18n.translations["en"]["inbox"]["none"] = "No messages (none)";
|
188
|
-
|
188
|
+
|
189
189
|
expect(I18n.p(0, "inbox")).toBeEqualTo("No messages (zero)");
|
190
190
|
});
|
191
|
-
|
191
|
+
|
192
192
|
specify("pluralize should return 'none' scope", function(){
|
193
193
|
I18n.translations["en"]["inbox"]["zero"] = null;
|
194
194
|
I18n.translations["en"]["inbox"]["none"] = "No messages (none)";
|
195
|
-
|
195
|
+
|
196
196
|
expect(I18n.p(0, "inbox")).toBeEqualTo("No messages (none)");
|
197
197
|
});
|
198
|
-
|
198
|
+
|
199
199
|
specify("pluralize with negative values", function(){
|
200
200
|
expect(I18n.p(-1, "inbox")).toBeEqualTo("You have -1 message");
|
201
201
|
expect(I18n.p(-5, "inbox")).toBeEqualTo("You have -5 messages");
|
202
202
|
});
|
203
|
-
|
203
|
+
|
204
204
|
specify("pluralize with missing scope", function(){
|
205
205
|
expect(I18n.p(-1, "missing")).toBeEqualTo('[missing "en.missing" translation]');
|
206
206
|
});
|
207
|
-
|
207
|
+
|
208
208
|
specify("pluralize with multiple placeholders", function(){
|
209
209
|
actual = I18n.p(1, "unread", {unread: 5});
|
210
210
|
expect(actual).toBeEqualTo("You have 1 new message (5 unread)");
|
211
|
-
|
211
|
+
|
212
212
|
actual = I18n.p(10, "unread", {unread: 2});
|
213
213
|
expect(actual).toBeEqualTo("You have 10 new messages (2 unread)");
|
214
|
-
|
214
|
+
|
215
215
|
actual = I18n.p(0, "unread", {unread: 5});
|
216
216
|
expect(actual).toBeEqualTo("You have no new messages (5 unread)");
|
217
217
|
});
|
218
|
-
|
218
|
+
|
219
219
|
specify("pluralize should allow empty strings", function(){
|
220
220
|
I18n.translations["en"]["inbox"]["zero"] = "";
|
221
221
|
|
@@ -233,7 +233,7 @@ describe("I18n.js", function(){
|
|
233
233
|
expect(I18n.toNumber(12345678)).toBeEqualTo("12,345,678.000");
|
234
234
|
expect(I18n.toNumber(123456789)).toBeEqualTo("123,456,789.000");
|
235
235
|
});
|
236
|
-
|
236
|
+
|
237
237
|
specify("negative numbers with default settings", function(){
|
238
238
|
expect(I18n.toNumber(-1)).toBeEqualTo("-1.000");
|
239
239
|
expect(I18n.toNumber(-12)).toBeEqualTo("-12.000");
|
@@ -245,17 +245,17 @@ describe("I18n.js", function(){
|
|
245
245
|
expect(I18n.toNumber(-12345678)).toBeEqualTo("-12,345,678.000");
|
246
246
|
expect(I18n.toNumber(-123456789)).toBeEqualTo("-123,456,789.000");
|
247
247
|
});
|
248
|
-
|
248
|
+
|
249
249
|
specify("numbers with partial translation and default options", function(){
|
250
250
|
I18n.translations.en.number = {
|
251
251
|
format: {
|
252
252
|
precision: 2
|
253
253
|
}
|
254
254
|
};
|
255
|
-
|
255
|
+
|
256
256
|
expect(I18n.toNumber(1234)).toBeEqualTo("1,234.00");
|
257
257
|
});
|
258
|
-
|
258
|
+
|
259
259
|
specify("numbers with full translation and default options", function(){
|
260
260
|
I18n.translations.en.number = {
|
261
261
|
format: {
|
@@ -264,23 +264,23 @@ describe("I18n.js", function(){
|
|
264
264
|
precision: 2
|
265
265
|
}
|
266
266
|
};
|
267
|
-
|
267
|
+
|
268
268
|
expect(I18n.toNumber(1234)).toBeEqualTo("1.234,00");
|
269
269
|
});
|
270
|
-
|
270
|
+
|
271
271
|
specify("numbers with some custom options that should be merged with default options", function(){
|
272
272
|
expect(I18n.toNumber(1234, {precision: 0})).toBeEqualTo("1,234");
|
273
273
|
expect(I18n.toNumber(1234, {separator: '-'})).toBeEqualTo("1,234-000");
|
274
274
|
expect(I18n.toNumber(1234, {delimiter: '-'})).toBeEqualTo("1-234.000");
|
275
275
|
});
|
276
|
-
|
276
|
+
|
277
277
|
specify("numbers considering options", function(){
|
278
278
|
options = {
|
279
279
|
precision: 2,
|
280
280
|
separator: ",",
|
281
281
|
delimiter: "."
|
282
282
|
};
|
283
|
-
|
283
|
+
|
284
284
|
expect(I18n.toNumber(1, options)).toBeEqualTo("1,00");
|
285
285
|
expect(I18n.toNumber(12, options)).toBeEqualTo("12,00");
|
286
286
|
expect(I18n.toNumber(123, options)).toBeEqualTo("123,00");
|
@@ -289,31 +289,31 @@ describe("I18n.js", function(){
|
|
289
289
|
expect(I18n.toNumber(1234567, options)).toBeEqualTo("1.234.567,00");
|
290
290
|
expect(I18n.toNumber(12345678, options)).toBeEqualTo("12.345.678,00");
|
291
291
|
});
|
292
|
-
|
292
|
+
|
293
293
|
specify("numbers with different precisions", function(){
|
294
294
|
options = {separator: ".", delimiter: ","};
|
295
|
-
|
295
|
+
|
296
296
|
options["precision"] = 2;
|
297
297
|
expect(I18n.toNumber(1.98, options)).toBeEqualTo("1.98");
|
298
|
-
|
298
|
+
|
299
299
|
options["precision"] = 3;
|
300
300
|
expect(I18n.toNumber(1.98, options)).toBeEqualTo("1.980");
|
301
|
-
|
301
|
+
|
302
302
|
options["precision"] = 2;
|
303
303
|
expect(I18n.toNumber(1.987, options)).toBeEqualTo("1.99");
|
304
|
-
|
304
|
+
|
305
305
|
options["precision"] = 1;
|
306
306
|
expect(I18n.toNumber(1.98, options)).toBeEqualTo("2.0");
|
307
|
-
|
307
|
+
|
308
308
|
options["precision"] = 0;
|
309
309
|
expect(I18n.toNumber(1.98, options)).toBeEqualTo("2");
|
310
310
|
});
|
311
|
-
|
311
|
+
|
312
312
|
specify("currency with default settings", function(){
|
313
313
|
expect(I18n.toCurrency(100.99)).toBeEqualTo("$100.99");
|
314
314
|
expect(I18n.toCurrency(1000.99)).toBeEqualTo("$1,000.99");
|
315
315
|
});
|
316
|
-
|
316
|
+
|
317
317
|
specify("currency with custom settings", function(){
|
318
318
|
I18n.translations.en.number = {
|
319
319
|
currency: {
|
@@ -326,12 +326,12 @@ describe("I18n.js", function(){
|
|
326
326
|
}
|
327
327
|
}
|
328
328
|
};
|
329
|
-
|
329
|
+
|
330
330
|
expect(I18n.toCurrency(12)).toBeEqualTo("12,00 USD");
|
331
331
|
expect(I18n.toCurrency(123)).toBeEqualTo("123,00 USD");
|
332
332
|
expect(I18n.toCurrency(1234.56)).toBeEqualTo("1.234,56 USD");
|
333
333
|
});
|
334
|
-
|
334
|
+
|
335
335
|
specify("currency with custom settings and partial overriding", function(){
|
336
336
|
I18n.translations.en.number = {
|
337
337
|
currency: {
|
@@ -344,11 +344,11 @@ describe("I18n.js", function(){
|
|
344
344
|
}
|
345
345
|
}
|
346
346
|
};
|
347
|
-
|
347
|
+
|
348
348
|
expect(I18n.toCurrency(12, {precision: 0})).toBeEqualTo("12 USD");
|
349
349
|
expect(I18n.toCurrency(123, {unit: "bucks"})).toBeEqualTo("123,00 bucks");
|
350
350
|
});
|
351
|
-
|
351
|
+
|
352
352
|
specify("currency with some custom options that should be merged with default options", function(){
|
353
353
|
expect(I18n.toCurrency(1234, {precision: 0})).toBeEqualTo("$1,234");
|
354
354
|
expect(I18n.toCurrency(1234, {unit: "º"})).toBeEqualTo("º1,234.00");
|
@@ -356,176 +356,185 @@ describe("I18n.js", function(){
|
|
356
356
|
expect(I18n.toCurrency(1234, {delimiter: "-"})).toBeEqualTo("$1-234.00");
|
357
357
|
expect(I18n.toCurrency(1234, {format: "%u %n"})).toBeEqualTo("$ 1,234.00");
|
358
358
|
});
|
359
|
-
|
359
|
+
|
360
360
|
specify("localize numbers", function(){
|
361
361
|
expect(I18n.l("number", 1234567)).toBeEqualTo("1,234,567.000");
|
362
362
|
});
|
363
|
-
|
363
|
+
|
364
364
|
specify("localize currency", function(){
|
365
365
|
expect(I18n.l("currency", 1234567)).toBeEqualTo("$1,234,567.00");
|
366
366
|
});
|
367
|
-
|
367
|
+
|
368
368
|
specify("parse date", function(){
|
369
369
|
expected = new Date(2009, 0, 24, 0, 0, 0);
|
370
370
|
actual = I18n.parseDate("2009-01-24");
|
371
371
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
372
|
-
|
372
|
+
|
373
373
|
expected = new Date(2009, 0, 24, 0, 15, 0);
|
374
374
|
actual = I18n.parseDate("2009-01-24 00:15:00");
|
375
375
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
376
|
-
|
376
|
+
|
377
377
|
expected = new Date(2009, 0, 24, 0, 0, 15);
|
378
378
|
actual = I18n.parseDate("2009-01-24 00:00:15");
|
379
379
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
380
|
-
|
380
|
+
|
381
381
|
expected = new Date(2009, 0, 24, 15, 33, 44);
|
382
382
|
actual = I18n.parseDate("2009-01-24 15:33:44");
|
383
383
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
384
|
-
|
384
|
+
|
385
385
|
expected = new Date(2009, 0, 24, 0, 0, 0);
|
386
386
|
actual = I18n.parseDate(expected.getTime());
|
387
387
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
388
|
-
|
388
|
+
|
389
389
|
expected = new Date(2009, 0, 24, 0, 0, 0);
|
390
390
|
actual = I18n.parseDate("01/24/2009");
|
391
391
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
392
|
-
|
392
|
+
|
393
393
|
expected = new Date(2009, 0, 24, 14, 33, 55);
|
394
394
|
actual = I18n.parseDate(expected).toString();
|
395
395
|
expect(actual).toBeEqualTo(expected.toString());
|
396
|
-
|
396
|
+
|
397
397
|
expected = new Date(2009, 0, 24, 15, 33, 44);
|
398
398
|
actual = I18n.parseDate("2009-01-24T15:33:44");
|
399
399
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
400
|
-
|
400
|
+
|
401
|
+
expected = new Date(Date.UTC(2011, 6, 20, 12, 51, 55));
|
402
|
+
actual = I18n.parseDate("2011-07-20T12:51:55+0000");
|
403
|
+
expect(actual.toString()).toBeEqualTo(expected.toString());
|
404
|
+
|
405
|
+
expected = new Date(Date.UTC(2011, 6, 20, 13, 03, 39));
|
406
|
+
actual = I18n.parseDate("Wed Jul 20 13:03:39 +0000 2011");
|
407
|
+
expect(actual.toString()).toBeEqualTo(expected.toString());
|
408
|
+
|
401
409
|
expected = new Date(Date.UTC(2009, 0, 24, 15, 33, 44));
|
402
410
|
actual = I18n.parseDate("2009-01-24T15:33:44Z");
|
403
411
|
expect(actual.toString()).toBeEqualTo(expected.toString());
|
404
412
|
});
|
405
|
-
|
413
|
+
|
406
414
|
specify("date formatting", function(){
|
407
415
|
I18n.locale = "pt-BR";
|
408
|
-
|
416
|
+
|
409
417
|
// 2009-04-26 19:35:44 (Sunday)
|
410
418
|
var date = new Date(2009, 3, 26, 19, 35, 44);
|
411
|
-
|
419
|
+
|
412
420
|
// short week day
|
413
421
|
expect(I18n.strftime(date, "%a")).toBeEqualTo("Dom");
|
414
|
-
|
422
|
+
|
415
423
|
// full week day
|
416
424
|
expect(I18n.strftime(date, "%A")).toBeEqualTo("Domingo");
|
417
|
-
|
425
|
+
|
418
426
|
// short month
|
419
427
|
expect(I18n.strftime(date, "%b")).toBeEqualTo("Abr");
|
420
|
-
|
428
|
+
|
421
429
|
// full month
|
422
430
|
expect(I18n.strftime(date, "%B")).toBeEqualTo("Abril");
|
423
|
-
|
431
|
+
|
424
432
|
// day
|
425
433
|
expect(I18n.strftime(date, "%d")).toBeEqualTo("26");
|
426
|
-
|
434
|
+
|
427
435
|
// 24-hour
|
428
436
|
expect(I18n.strftime(date, "%H")).toBeEqualTo("19");
|
429
|
-
|
437
|
+
|
430
438
|
// 12-hour
|
431
439
|
expect(I18n.strftime(date, "%I")).toBeEqualTo("07");
|
432
|
-
|
440
|
+
|
433
441
|
// month
|
434
442
|
expect(I18n.strftime(date, "%m")).toBeEqualTo("04");
|
435
|
-
|
443
|
+
|
436
444
|
// minutes
|
437
445
|
expect(I18n.strftime(date, "%M")).toBeEqualTo("35");
|
438
|
-
|
446
|
+
|
439
447
|
// meridian
|
440
448
|
expect(I18n.strftime(date, "%p")).toBeEqualTo("PM");
|
441
|
-
|
449
|
+
|
442
450
|
// seconds
|
443
451
|
expect(I18n.strftime(date, "%S")).toBeEqualTo("44");
|
444
|
-
|
452
|
+
|
445
453
|
// week day
|
446
454
|
expect(I18n.strftime(date, "%w")).toBeEqualTo("0");
|
447
|
-
|
455
|
+
|
448
456
|
// short year
|
449
457
|
expect(I18n.strftime(date, "%y")).toBeEqualTo("09");
|
450
|
-
|
458
|
+
|
451
459
|
// full year
|
452
460
|
expect(I18n.strftime(date, "%Y")).toBeEqualTo("2009");
|
453
461
|
});
|
454
|
-
|
462
|
+
|
455
463
|
specify("date formatting without padding", function(){
|
456
464
|
I18n.locale = "pt-BR";
|
457
|
-
|
465
|
+
|
458
466
|
// 2009-04-26 19:35:44 (Sunday)
|
459
467
|
var date = new Date(2009, 3, 9, 7, 8, 9);
|
460
|
-
|
468
|
+
|
461
469
|
// 24-hour without padding
|
462
470
|
expect(I18n.strftime(date, "%-H")).toBeEqualTo("7");
|
463
|
-
|
471
|
+
|
464
472
|
// 12-hour without padding
|
465
473
|
expect(I18n.strftime(date, "%-I")).toBeEqualTo("7");
|
466
|
-
|
474
|
+
|
467
475
|
// minutes without padding
|
468
476
|
expect(I18n.strftime(date, "%-M")).toBeEqualTo("8");
|
469
|
-
|
477
|
+
|
470
478
|
// seconds without padding
|
471
479
|
expect(I18n.strftime(date, "%-S")).toBeEqualTo("9");
|
472
|
-
|
480
|
+
|
473
481
|
// short year without padding
|
474
482
|
expect(I18n.strftime(date, "%-y")).toBeEqualTo("9");
|
475
|
-
|
483
|
+
|
476
484
|
// month without padding
|
477
485
|
expect(I18n.strftime(date, "%-m")).toBeEqualTo("4");
|
478
|
-
|
486
|
+
|
479
487
|
// day without padding
|
480
488
|
expect(I18n.strftime(date, "%-d")).toBeEqualTo("9");
|
489
|
+
expect(I18n.strftime(date, "%e")).toBeEqualTo("9");
|
481
490
|
});
|
482
|
-
|
491
|
+
|
483
492
|
specify("date formatting with padding", function(){
|
484
493
|
I18n.locale = "pt-BR";
|
485
|
-
|
494
|
+
|
486
495
|
// 2009-04-26 19:35:44 (Sunday)
|
487
496
|
var date = new Date(2009, 3, 9, 7, 8, 9);
|
488
|
-
|
497
|
+
|
489
498
|
// 24-hour
|
490
499
|
expect(I18n.strftime(date, "%H")).toBeEqualTo("07");
|
491
|
-
|
500
|
+
|
492
501
|
// 12-hour
|
493
502
|
expect(I18n.strftime(date, "%I")).toBeEqualTo("07");
|
494
|
-
|
503
|
+
|
495
504
|
// minutes
|
496
505
|
expect(I18n.strftime(date, "%M")).toBeEqualTo("08");
|
497
|
-
|
506
|
+
|
498
507
|
// seconds
|
499
508
|
expect(I18n.strftime(date, "%S")).toBeEqualTo("09");
|
500
|
-
|
509
|
+
|
501
510
|
// short year
|
502
511
|
expect(I18n.strftime(date, "%y")).toBeEqualTo("09");
|
503
|
-
|
512
|
+
|
504
513
|
// month
|
505
514
|
expect(I18n.strftime(date, "%m")).toBeEqualTo("04");
|
506
|
-
|
515
|
+
|
507
516
|
// day
|
508
517
|
expect(I18n.strftime(date, "%d")).toBeEqualTo("09");
|
509
518
|
});
|
510
|
-
|
519
|
+
|
511
520
|
specify("date formatting with negative time zone", function(){
|
512
521
|
I18n.locale = "pt-BR";
|
513
522
|
var date = new Date(2009, 3, 26, 19, 35, 44);
|
514
523
|
stub(date, "getTimezoneOffset()", 345);
|
515
|
-
|
524
|
+
|
516
525
|
expect(I18n.strftime(date, "%z")).toMatch(/^(\+|-)[\d]{4}$/);
|
517
526
|
expect(I18n.strftime(date, "%z")).toBeEqualTo("-0545");
|
518
527
|
});
|
519
|
-
|
528
|
+
|
520
529
|
specify("date formatting with positive time zone", function(){
|
521
530
|
I18n.locale = "pt-BR";
|
522
531
|
var date = new Date(2009, 3, 26, 19, 35, 44);
|
523
532
|
stub(date, "getTimezoneOffset()", -345);
|
524
|
-
|
533
|
+
|
525
534
|
expect(I18n.strftime(date, "%z")).toMatch(/^(\+|-)[\d]{4}$/);
|
526
535
|
expect(I18n.strftime(date, "%z")).toBeEqualTo("+0545");
|
527
536
|
});
|
528
|
-
|
537
|
+
|
529
538
|
specify("date formatting with custom meridian", function(){
|
530
539
|
I18n.locale = "en-US";
|
531
540
|
var date = new Date(2009, 3, 26, 19, 35, 44);
|
@@ -555,78 +564,78 @@ describe("I18n.js", function(){
|
|
555
564
|
|
556
565
|
specify("localize date strings", function(){
|
557
566
|
I18n.locale = "pt-BR";
|
558
|
-
|
567
|
+
|
559
568
|
expect(I18n.l("date.formats.default", "2009-11-29")).toBeEqualTo("29/11/2009");
|
560
569
|
expect(I18n.l("date.formats.short", "2009-01-07")).toBeEqualTo("07 de Janeiro");
|
561
570
|
expect(I18n.l("date.formats.long", "2009-01-07")).toBeEqualTo("07 de Janeiro de 2009");
|
562
571
|
});
|
563
|
-
|
572
|
+
|
564
573
|
specify("localize time strings", function(){
|
565
574
|
I18n.locale = "pt-BR";
|
566
|
-
|
575
|
+
|
567
576
|
expect(I18n.l("time.formats.default", "2009-11-29 15:07:59")).toBeEqualTo("Domingo, 29 de Novembro de 2009, 15:07 h");
|
568
577
|
expect(I18n.l("time.formats.short", "2009-01-07 09:12:35")).toBeEqualTo("07/01, 09:12 h");
|
569
578
|
expect(I18n.l("time.formats.long", "2009-11-29 15:07:59")).toBeEqualTo("Domingo, 29 de Novembro de 2009, 15:07 h");
|
570
579
|
});
|
571
|
-
|
580
|
+
|
572
581
|
specify("localize percentage", function(){
|
573
582
|
I18n.locale = "pt-BR";
|
574
583
|
expect(I18n.l("percentage", 123.45)).toBeEqualTo("123,45%");
|
575
584
|
});
|
576
|
-
|
585
|
+
|
577
586
|
specify("default value for simple translation", function(){
|
578
587
|
actual = I18n.t("warning", {defaultValue: "Warning!"});
|
579
588
|
expect(actual).toBeEqualTo("Warning!");
|
580
589
|
});
|
581
|
-
|
590
|
+
|
582
591
|
specify("default value with interpolation", function(){
|
583
592
|
actual = I18n.t(
|
584
|
-
"alert",
|
593
|
+
"alert",
|
585
594
|
{defaultValue: "Attention! {{message}}", message: "You're out of quota!"}
|
586
595
|
);
|
587
|
-
|
596
|
+
|
588
597
|
expect(actual).toBeEqualTo("Attention! You're out of quota!");
|
589
598
|
});
|
590
|
-
|
599
|
+
|
591
600
|
specify("default value should not be used when scope exist", function(){
|
592
601
|
actual = I18n.t("hello", {defaultValue: "What's up?"});
|
593
602
|
expect(actual).toBeEqualTo("Hello World!");
|
594
603
|
});
|
595
|
-
|
604
|
+
|
596
605
|
specify("default value for pluralize", function(){
|
597
606
|
options = {defaultValue: {
|
598
607
|
none: "No things here!",
|
599
608
|
one: "There is {{count}} thing here!",
|
600
609
|
other: "There are {{count}} things here!"
|
601
610
|
}};
|
602
|
-
|
611
|
+
|
603
612
|
expect(I18n.p(0, "things", options)).toBeEqualTo("No things here!");
|
604
613
|
expect(I18n.p(1, "things", options)).toBeEqualTo("There is 1 thing here!");
|
605
614
|
expect(I18n.p(5, "things", options)).toBeEqualTo("There are 5 things here!");
|
606
615
|
});
|
607
|
-
|
616
|
+
|
608
617
|
specify("default value for pluralize should not be used when scope exist", function(){
|
609
618
|
options = {defaultValue: {
|
610
619
|
none: "No things here!",
|
611
620
|
one: "There is {{count}} thing here!",
|
612
621
|
other: "There are {{count}} things here!"
|
613
622
|
}};
|
614
|
-
|
623
|
+
|
615
624
|
expect(I18n.pluralize(0, "inbox", options)).toBeEqualTo("You have no messages");
|
616
625
|
expect(I18n.pluralize(1, "inbox", options)).toBeEqualTo("You have 1 message");
|
617
626
|
expect(I18n.pluralize(5, "inbox", options)).toBeEqualTo("You have 5 messages");
|
618
627
|
});
|
619
|
-
|
628
|
+
|
620
629
|
specify("prepare options", function(){
|
621
630
|
options = I18n.prepareOptions(
|
622
631
|
{name: "Mary Doe"},
|
623
632
|
{name: "John Doe", role: "user"}
|
624
633
|
);
|
625
|
-
|
634
|
+
|
626
635
|
expect(options["name"]).toBeEqualTo("Mary Doe");
|
627
636
|
expect(options["role"]).toBeEqualTo("user");
|
628
637
|
});
|
629
|
-
|
638
|
+
|
630
639
|
specify("prepare options with multiple options", function(){
|
631
640
|
options = I18n.prepareOptions(
|
632
641
|
{name: "Mary Doe"},
|
@@ -635,27 +644,27 @@ describe("I18n.js", function(){
|
|
635
644
|
{email: "mary@doe.com", url: "http://marydoe.com"},
|
636
645
|
{role: "admin", email: "john@doe.com"}
|
637
646
|
);
|
638
|
-
|
647
|
+
|
639
648
|
expect(options["name"]).toBeEqualTo("Mary Doe");
|
640
649
|
expect(options["role"]).toBeEqualTo("user");
|
641
650
|
expect(options["age"]).toBeEqualTo(33);
|
642
651
|
expect(options["email"]).toBeEqualTo("mary@doe.com");
|
643
652
|
expect(options["url"]).toBeEqualTo("http://marydoe.com");
|
644
653
|
});
|
645
|
-
|
654
|
+
|
646
655
|
specify("prepare options should return an empty hash when values are null", function(){
|
647
656
|
expect({}).toBeEqualTo(I18n.prepareOptions(null, null));
|
648
657
|
});
|
649
|
-
|
658
|
+
|
650
659
|
specify("percentage with defaults", function(){
|
651
660
|
expect(I18n.toPercentage(1234)).toBeEqualTo("1234.000%");
|
652
661
|
});
|
653
|
-
|
662
|
+
|
654
663
|
specify("percentage with custom options", function(){
|
655
664
|
actual = I18n.toPercentage(1234, {delimiter: "_", precision: 0});
|
656
665
|
expect(actual).toBeEqualTo("1_234%");
|
657
666
|
});
|
658
|
-
|
667
|
+
|
659
668
|
specify("percentage with translation", function(){
|
660
669
|
I18n.translations.en.number = {
|
661
670
|
percentage: {
|
@@ -666,10 +675,10 @@ describe("I18n.js", function(){
|
|
666
675
|
}
|
667
676
|
}
|
668
677
|
};
|
669
|
-
|
678
|
+
|
670
679
|
expect(I18n.toPercentage(1234)).toBeEqualTo("1.234,00%");
|
671
680
|
});
|
672
|
-
|
681
|
+
|
673
682
|
specify("percentage with translation and custom options", function(){
|
674
683
|
I18n.translations.en.number = {
|
675
684
|
percentage: {
|
@@ -680,61 +689,61 @@ describe("I18n.js", function(){
|
|
680
689
|
}
|
681
690
|
}
|
682
691
|
};
|
683
|
-
|
692
|
+
|
684
693
|
actual = I18n.toPercentage(1234, {precision: 4, delimiter: "-", separator: "+"});
|
685
694
|
expect(actual).toBeEqualTo("1-234+0000%");
|
686
695
|
});
|
687
|
-
|
696
|
+
|
688
697
|
specify("scope option as string", function(){
|
689
698
|
actual = I18n.t("stranger", {scope: "greetings"});
|
690
699
|
expect(actual).toBeEqualTo("Hello stranger!");
|
691
700
|
});
|
692
|
-
|
701
|
+
|
693
702
|
specify("scope as array", function(){
|
694
703
|
actual = I18n.t(["greetings", "stranger"]);
|
695
704
|
expect(actual).toBeEqualTo("Hello stranger!");
|
696
705
|
});
|
697
|
-
|
706
|
+
|
698
707
|
specify("new placeholder syntax", function(){
|
699
708
|
I18n.translations["en"]["new_syntax"] = "Hi %{name}!";
|
700
709
|
actual = I18n.t("new_syntax", {name: "John"});
|
701
710
|
expect(actual).toBeEqualTo("Hi John!");
|
702
711
|
});
|
703
|
-
|
712
|
+
|
704
713
|
specify("return translation for custom scope separator", function(){
|
705
714
|
I18n.defaultSeparator = "•";
|
706
715
|
actual = I18n.t("greetings•stranger");
|
707
716
|
expect(actual).toBeEqualTo("Hello stranger!");
|
708
717
|
});
|
709
|
-
|
718
|
+
|
710
719
|
specify("return number as human size", function(){
|
711
720
|
kb = 1024;
|
712
|
-
|
721
|
+
|
713
722
|
expect(I18n.toHumanSize(1)).toBeEqualTo("1Byte");
|
714
723
|
expect(I18n.toHumanSize(100)).toBeEqualTo("100Bytes");
|
715
|
-
|
724
|
+
|
716
725
|
expect(I18n.toHumanSize(kb)).toBeEqualTo("1KB");
|
717
726
|
expect(I18n.toHumanSize(kb * 1.5)).toBeEqualTo("1.5KB");
|
718
|
-
|
727
|
+
|
719
728
|
expect(I18n.toHumanSize(kb * kb)).toBeEqualTo("1MB");
|
720
729
|
expect(I18n.toHumanSize(kb * kb * 1.5)).toBeEqualTo("1.5MB");
|
721
|
-
|
730
|
+
|
722
731
|
expect(I18n.toHumanSize(kb * kb * kb)).toBeEqualTo("1GB");
|
723
732
|
expect(I18n.toHumanSize(kb * kb * kb * 1.5)).toBeEqualTo("1.5GB");
|
724
|
-
|
733
|
+
|
725
734
|
expect(I18n.toHumanSize(kb * kb * kb * kb)).toBeEqualTo("1TB");
|
726
735
|
expect(I18n.toHumanSize(kb * kb * kb * kb * 1.5)).toBeEqualTo("1.5TB");
|
727
|
-
|
736
|
+
|
728
737
|
expect(I18n.toHumanSize(kb * kb * kb * kb * kb)).toBeEqualTo("1024TB");
|
729
738
|
});
|
730
|
-
|
739
|
+
|
731
740
|
specify("return number as human size using custom options", function(){
|
732
741
|
expect(I18n.toHumanSize(1024 * 1.6, {precision: 0})).toBeEqualTo("2KB");
|
733
742
|
});
|
734
|
-
|
743
|
+
|
735
744
|
specify("return number without insignificant zeros", function(){
|
736
745
|
options = {precision: 4, strip_insignificant_zeros: true};
|
737
|
-
|
746
|
+
|
738
747
|
expect(I18n.toNumber(65, options)).toBeEqualTo("65");
|
739
748
|
expect(I18n.toNumber(1.2, options)).toBeEqualTo("1.2");
|
740
749
|
expect(I18n.toCurrency(1.2, options)).toBeEqualTo("$1.2");
|