i18n-js 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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");
|