i18n-js 3.0.0.rc8 → 3.0.0.rc9
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/Appraisals +5 -1
- data/CHANGELOG.md +13 -0
- data/README.md +104 -7
- data/app/assets/javascripts/i18n.js +85 -49
- data/app/assets/javascripts/i18n/filtered.js.erb +1 -3
- data/gemfiles/i18n_0_7.gemfile +7 -0
- data/i18n-js.gemspec +0 -1
- data/lib/i18n/js.rb +54 -44
- data/lib/i18n/js/dependencies.rb +8 -6
- data/lib/i18n/js/segment.rb +39 -0
- data/lib/i18n/js/utils.rb +10 -2
- data/lib/i18n/js/version.rb +1 -1
- data/package.json +4 -0
- data/spec/fixtures/except_condition.yml +5 -0
- data/spec/fixtures/js_export_dir_custom.yml +6 -0
- data/spec/fixtures/js_export_dir_none.yml +6 -0
- data/spec/fixtures/js_file_with_namespace_and_pretty_print.yml +5 -0
- data/spec/i18n_js_spec.rb +139 -118
- data/spec/js/currency.spec.js +3 -1
- data/spec/js/defaults.spec.js +8 -0
- data/spec/js/interpolation.spec.js +58 -4
- data/spec/js/require.js +2083 -0
- data/spec/js/specs_requirejs.html +71 -0
- data/spec/js/translate.spec.js +21 -0
- data/spec/js/translations.js +3 -1
- data/spec/segment_spec.rb +71 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/sprockets_spec.rb +42 -0
- data/spec/utils_spec.rb +69 -0
- metadata +23 -17
@@ -0,0 +1,71 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<title>Jasmine Spec Runner</title>
|
6
|
+
<link rel="stylesheet" href="jasmine/jasmine.css" type="text/css">
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<body>
|
10
|
+
<!-- load jasmine -->
|
11
|
+
<script type="text/javascript" src="jasmine/jasmine.js"></script>
|
12
|
+
<script type="text/javascript" src="jasmine/jasmine-html.js"></script>
|
13
|
+
|
14
|
+
<!-- load your javascript files -->
|
15
|
+
<script type="text/javascript" src="require.js"></script>
|
16
|
+
|
17
|
+
<script type="text/javascript">
|
18
|
+
// Prepare requirejs shims to wrap each test so that it will work with the
|
19
|
+
// require syntax loading
|
20
|
+
var testScripts = [
|
21
|
+
"./translate.spec.js",
|
22
|
+
"./currency.spec.js",
|
23
|
+
"./current_locale.spec.js",
|
24
|
+
"./dates.spec.js",
|
25
|
+
"./defaults.spec.js",
|
26
|
+
"./interpolation.spec.js",
|
27
|
+
"./localization.spec.js",
|
28
|
+
"./numbers.spec.js",
|
29
|
+
"./placeholder.spec.js",
|
30
|
+
"./pluralization.spec.js",
|
31
|
+
"./prepare_options.spec.js",
|
32
|
+
"./translate.spec.js",
|
33
|
+
"./utility_functions.spec.js"
|
34
|
+
];
|
35
|
+
var shims = {};
|
36
|
+
for(var i = 0; i < testScripts.length; i++) {
|
37
|
+
shims[ testScripts[i] ] = {
|
38
|
+
"deps": ["i18n"]
|
39
|
+
};
|
40
|
+
}
|
41
|
+
require.config(
|
42
|
+
{
|
43
|
+
"baseUrl" : "./",
|
44
|
+
"paths": {
|
45
|
+
"i18n": "../../app/assets/javascripts/i18n"
|
46
|
+
},
|
47
|
+
/* Since the i18n.js file explicitly names its module 'i18n', but each
|
48
|
+
spec uses the full path in the require statement, it appears that
|
49
|
+
loading fails. This map will map the full path to the short form.
|
50
|
+
*/
|
51
|
+
"map": {
|
52
|
+
"*": {
|
53
|
+
"../../app/assets/javascripts/i18n": "i18n"
|
54
|
+
}
|
55
|
+
},
|
56
|
+
"shim": shims
|
57
|
+
});
|
58
|
+
require((["i18n", './translations']).concat(testScripts),
|
59
|
+
function(I18n, translationFactory) {
|
60
|
+
// Example for using the translation factory
|
61
|
+
I18n.translations = translationFactory();
|
62
|
+
console.log(I18n.t('hello'));
|
63
|
+
|
64
|
+
// Execute the specs
|
65
|
+
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
|
66
|
+
jasmine.getEnv().execute();
|
67
|
+
});
|
68
|
+
</script>
|
69
|
+
|
70
|
+
</body>
|
71
|
+
</html>
|
data/spec/js/translate.spec.js
CHANGED
@@ -24,6 +24,27 @@ describe("Translate", function(){
|
|
24
24
|
expect(actual).toEqual(expected);
|
25
25
|
});
|
26
26
|
|
27
|
+
it("returns guessed translation if missingBehaviour is set to guess", function(){
|
28
|
+
I18n.missingBehaviour = 'guess'
|
29
|
+
actual = I18n.t("invalid.thisIsAutomaticallyGeneratedTranslation");
|
30
|
+
expected = 'this is automatically generated translation';
|
31
|
+
expect(actual).toEqual(expected);
|
32
|
+
});
|
33
|
+
|
34
|
+
it("returns guessed translation with prefix if missingBehaviour is set to guess and prefix is also provided", function(){
|
35
|
+
I18n.missingBehaviour = 'guess'
|
36
|
+
I18n.missingTranslationPrefix = 'EE: '
|
37
|
+
actual = I18n.t("invalid.thisIsAutomaticallyGeneratedTranslation");
|
38
|
+
expected = 'EE: this is automatically generated translation';
|
39
|
+
expect(actual).toEqual(expected);
|
40
|
+
});
|
41
|
+
|
42
|
+
it("returns missing message translation for valid scope with scope", function(){
|
43
|
+
actual = I18n.t("monster", {scope: "greetings"});
|
44
|
+
expected = '[missing "en.greetings.monster" translation]';
|
45
|
+
expect(actual).toEqual(expected);
|
46
|
+
});
|
47
|
+
|
27
48
|
it("returns translation for single scope on a custom locale", function(){
|
28
49
|
I18n.locale = "pt-BR";
|
29
50
|
expect(I18n.t("hello")).toEqual("Olá Mundo!");
|
data/spec/js/translations.js
CHANGED
@@ -127,7 +127,9 @@ var DEBUG = false;
|
|
127
127
|
return Translations;
|
128
128
|
};
|
129
129
|
|
130
|
-
if (typeof
|
130
|
+
if (typeof define === 'function' && define.amd) {
|
131
|
+
define(function() { return generator; });
|
132
|
+
} else if (typeof(exports) === "undefined") {
|
131
133
|
window.Translations = generator;
|
132
134
|
} else {
|
133
135
|
module.exports = generator;
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe I18n::JS::Segment do
|
4
|
+
|
5
|
+
let(:file) { "tmp/i18n-js/segment.js" }
|
6
|
+
let(:translations){ { "en" => { "test" => "Test" }, "fr" => { "test" => "Test2" } } }
|
7
|
+
let(:namespace) { "MyNamespace" }
|
8
|
+
let(:pretty_print){ nil }
|
9
|
+
let(:options) { {namespace: namespace, pretty_print: pretty_print} }
|
10
|
+
subject { I18n::JS::Segment.new(file, translations, options) }
|
11
|
+
|
12
|
+
describe ".new" do
|
13
|
+
|
14
|
+
it "should persist the file path variable" do
|
15
|
+
subject.file.should eql("tmp/i18n-js/segment.js")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should persist the translations variable" do
|
19
|
+
subject.translations.should eql(translations)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should persist the namespace variable" do
|
23
|
+
subject.namespace.should eql("MyNamespace")
|
24
|
+
end
|
25
|
+
|
26
|
+
context "when namespace is nil" do
|
27
|
+
let(:namespace){ nil }
|
28
|
+
|
29
|
+
it "should default namespace to `I18n`" do
|
30
|
+
subject.namespace.should eql("I18n")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when namespace is not set" do
|
35
|
+
subject { I18n::JS::Segment.new(file, translations) }
|
36
|
+
|
37
|
+
it "should default namespace to `I18n`" do
|
38
|
+
subject.namespace.should eql("I18n")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when pretty_print is nil" do
|
43
|
+
it "should set pretty_print to false" do
|
44
|
+
subject.pretty_print.should be false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when pretty_print is truthy" do
|
49
|
+
let(:pretty_print){ 1 }
|
50
|
+
|
51
|
+
it "should set pretty_print to true" do
|
52
|
+
subject.pretty_print.should be true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#save!" do
|
58
|
+
before { allow(I18n::JS).to receive(:export_i18n_js_dir_path).and_return(temp_path) }
|
59
|
+
before { subject.save! }
|
60
|
+
|
61
|
+
it "should write the file" do
|
62
|
+
file_should_exist "segment.js"
|
63
|
+
|
64
|
+
File.open(File.join(temp_path, "segment.js")){|f| f.read}.should eql <<-EOF
|
65
|
+
MyNamespace.translations || (MyNamespace.translations = {});
|
66
|
+
MyNamespace.translations["en"] = {"test":"Test"};
|
67
|
+
MyNamespace.translations["fr"] = {"test":"Test2"};
|
68
|
+
EOF
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
describe I18n::JS::Dependencies, ".sprockets_supports_register_preprocessor?" do
|
3
|
+
|
4
|
+
subject { described_class.sprockets_supports_register_preprocessor? }
|
5
|
+
|
6
|
+
context 'when Sprockets is available to register preprocessors' do
|
7
|
+
let!(:sprockets_double) do
|
8
|
+
class_double('Sprockets').as_stubbed_const(register_processor: true).tap do |double|
|
9
|
+
allow(double).to receive(:respond_to?).with(:register_preprocessor).and_return(true)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it { is_expected.to be_truthy }
|
14
|
+
it 'calls respond_to? with register_preprocessor on Sprockets' do
|
15
|
+
expect(sprockets_double).to receive(:respond_to?).with(:register_preprocessor).and_return(true)
|
16
|
+
subject
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when Sprockets is NOT available to register preprocessors' do
|
21
|
+
let!(:sprockets_double) do
|
22
|
+
class_double('Sprockets').as_stubbed_const(register_processor: true).tap do |double|
|
23
|
+
allow(double).to receive(:respond_to?).with(:register_preprocessor).and_return(false)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it { is_expected.to be_falsy }
|
28
|
+
it 'calls respond_to? with register_preprocessor on Sprockets' do
|
29
|
+
expect(sprockets_double).to receive(:respond_to?).with(:register_preprocessor).and_return(false)
|
30
|
+
subject
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when Sprockets is missing' do
|
35
|
+
before do
|
36
|
+
hide_const('Sprockets')
|
37
|
+
expect { Sprockets }.to raise_error(NameError)
|
38
|
+
end
|
39
|
+
|
40
|
+
it { is_expected.to be_falsy }
|
41
|
+
end
|
42
|
+
end
|
data/spec/utils_spec.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe I18n::JS::Utils do
|
4
|
+
|
5
|
+
describe ".strip_keys_with_nil_values" do
|
6
|
+
subject { described_class.strip_keys_with_nil_values(input_hash) }
|
7
|
+
|
8
|
+
context 'when input_hash does NOT contain nil value' do
|
9
|
+
let(:input_hash) { {a: 1, b: { c: 2 }} }
|
10
|
+
let(:expected_hash) { input_hash }
|
11
|
+
|
12
|
+
it 'returns the original input' do
|
13
|
+
is_expected.to eq expected_hash
|
14
|
+
end
|
15
|
+
end
|
16
|
+
context 'when input_hash does contain nil value' do
|
17
|
+
let(:input_hash) { {a: 1, b: { c: 2, d: nil }, e: { f: nil }} }
|
18
|
+
let(:expected_hash) { {a: 1, b: { c: 2 }, e: {}} }
|
19
|
+
|
20
|
+
it 'returns the original input with nil values removed' do
|
21
|
+
is_expected.to eq expected_hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "hash merging" do
|
27
|
+
it "performs a deep merge" do
|
28
|
+
target = {:a => {:b => 1}}
|
29
|
+
result = described_class.deep_merge(target, {:a => {:c => 2}})
|
30
|
+
|
31
|
+
result[:a].should eql({:b => 1, :c => 2})
|
32
|
+
end
|
33
|
+
|
34
|
+
it "performs a banged deep merge" do
|
35
|
+
target = {:a => {:b => 1}}
|
36
|
+
described_class.deep_merge!(target, {:a => {:c => 2}})
|
37
|
+
|
38
|
+
target[:a].should eql({:b => 1, :c => 2})
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe ".deep_reject" do
|
43
|
+
it "performs a deep keys rejection" do
|
44
|
+
hash = {:a => {:b => 1}}
|
45
|
+
|
46
|
+
result = described_class.deep_reject(hash) { |k, v| k == :b }
|
47
|
+
|
48
|
+
result.should eql({:a => {}})
|
49
|
+
end
|
50
|
+
|
51
|
+
it "performs a deep keys rejection prunning the whole tree if necessary" do
|
52
|
+
hash = {:a => {:b => {:c => {:d => 1, :e => 2}}}}
|
53
|
+
|
54
|
+
result = described_class.deep_reject(hash) { |k, v| k == :b }
|
55
|
+
|
56
|
+
result.should eql({:a => {}})
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
it "performs a deep keys rejection without changing the original hash" do
|
61
|
+
hash = {:a => {:b => 1, :c => 2}}
|
62
|
+
|
63
|
+
result = described_class.deep_reject(hash) { |k, v| k == :b }
|
64
|
+
|
65
|
+
result.should eql({:a => {:c => 2}})
|
66
|
+
hash.should eql({:a => {:b => 1, :c => 2}})
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i18n-js
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.
|
4
|
+
version: 3.0.0.rc9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: pry-meta
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: gem-release
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,6 +113,7 @@ files:
|
|
127
113
|
- app/assets/javascripts/i18n/shims.js
|
128
114
|
- app/assets/javascripts/i18n/translations.js
|
129
115
|
- gemfiles/i18n_0_6.gemfile
|
116
|
+
- gemfiles/i18n_0_7.gemfile
|
130
117
|
- i18n-js.gemspec
|
131
118
|
- lib/i18n-js.rb
|
132
119
|
- lib/i18n/js.rb
|
@@ -134,6 +121,7 @@ files:
|
|
134
121
|
- lib/i18n/js/engine.rb
|
135
122
|
- lib/i18n/js/fallback_locales.rb
|
136
123
|
- lib/i18n/js/middleware.rb
|
124
|
+
- lib/i18n/js/segment.rb
|
137
125
|
- lib/i18n/js/utils.rb
|
138
126
|
- lib/i18n/js/version.rb
|
139
127
|
- lib/rails/generators/i18n/js/config/config_generator.rb
|
@@ -143,12 +131,16 @@ files:
|
|
143
131
|
- spec/fixtures/custom_path.yml
|
144
132
|
- spec/fixtures/default.yml
|
145
133
|
- spec/fixtures/erb.yml
|
134
|
+
- spec/fixtures/except_condition.yml
|
135
|
+
- spec/fixtures/js_export_dir_custom.yml
|
136
|
+
- spec/fixtures/js_export_dir_none.yml
|
146
137
|
- spec/fixtures/js_file_per_locale.yml
|
147
138
|
- spec/fixtures/js_file_per_locale_with_fallbacks_as_default_locale_symbol.yml
|
148
139
|
- spec/fixtures/js_file_per_locale_with_fallbacks_as_hash.yml
|
149
140
|
- spec/fixtures/js_file_per_locale_with_fallbacks_as_locale.yml
|
150
141
|
- spec/fixtures/js_file_per_locale_with_fallbacks_enabled.yml
|
151
142
|
- spec/fixtures/js_file_per_locale_without_fallbacks.yml
|
143
|
+
- spec/fixtures/js_file_with_namespace_and_pretty_print.yml
|
152
144
|
- spec/fixtures/locales.yml
|
153
145
|
- spec/fixtures/multiple_conditions.yml
|
154
146
|
- spec/fixtures/multiple_conditions_per_locale.yml
|
@@ -173,11 +165,16 @@ files:
|
|
173
165
|
- spec/js/placeholder.spec.js
|
174
166
|
- spec/js/pluralization.spec.js
|
175
167
|
- spec/js/prepare_options.spec.js
|
168
|
+
- spec/js/require.js
|
176
169
|
- spec/js/specs.html
|
170
|
+
- spec/js/specs_requirejs.html
|
177
171
|
- spec/js/translate.spec.js
|
178
172
|
- spec/js/translations.js
|
179
173
|
- spec/js/utility_functions.spec.js
|
174
|
+
- spec/segment_spec.rb
|
180
175
|
- spec/spec_helper.rb
|
176
|
+
- spec/sprockets_spec.rb
|
177
|
+
- spec/utils_spec.rb
|
181
178
|
homepage: http://rubygems.org/gems/i18n-js
|
182
179
|
licenses:
|
183
180
|
- MIT
|
@@ -198,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
198
195
|
version: 1.3.1
|
199
196
|
requirements: []
|
200
197
|
rubyforge_project:
|
201
|
-
rubygems_version: 2.4.
|
198
|
+
rubygems_version: 2.4.6
|
202
199
|
signing_key:
|
203
200
|
specification_version: 4
|
204
201
|
summary: It's a small library to provide the Rails I18n translations on the Javascript.
|
@@ -206,12 +203,16 @@ test_files:
|
|
206
203
|
- spec/fixtures/custom_path.yml
|
207
204
|
- spec/fixtures/default.yml
|
208
205
|
- spec/fixtures/erb.yml
|
206
|
+
- spec/fixtures/except_condition.yml
|
207
|
+
- spec/fixtures/js_export_dir_custom.yml
|
208
|
+
- spec/fixtures/js_export_dir_none.yml
|
209
209
|
- spec/fixtures/js_file_per_locale.yml
|
210
210
|
- spec/fixtures/js_file_per_locale_with_fallbacks_as_default_locale_symbol.yml
|
211
211
|
- spec/fixtures/js_file_per_locale_with_fallbacks_as_hash.yml
|
212
212
|
- spec/fixtures/js_file_per_locale_with_fallbacks_as_locale.yml
|
213
213
|
- spec/fixtures/js_file_per_locale_with_fallbacks_enabled.yml
|
214
214
|
- spec/fixtures/js_file_per_locale_without_fallbacks.yml
|
215
|
+
- spec/fixtures/js_file_with_namespace_and_pretty_print.yml
|
215
216
|
- spec/fixtures/locales.yml
|
216
217
|
- spec/fixtures/multiple_conditions.yml
|
217
218
|
- spec/fixtures/multiple_conditions_per_locale.yml
|
@@ -236,9 +237,14 @@ test_files:
|
|
236
237
|
- spec/js/placeholder.spec.js
|
237
238
|
- spec/js/pluralization.spec.js
|
238
239
|
- spec/js/prepare_options.spec.js
|
240
|
+
- spec/js/require.js
|
239
241
|
- spec/js/specs.html
|
242
|
+
- spec/js/specs_requirejs.html
|
240
243
|
- spec/js/translate.spec.js
|
241
244
|
- spec/js/translations.js
|
242
245
|
- spec/js/utility_functions.spec.js
|
246
|
+
- spec/segment_spec.rb
|
243
247
|
- spec/spec_helper.rb
|
248
|
+
- spec/sprockets_spec.rb
|
249
|
+
- spec/utils_spec.rb
|
244
250
|
has_rdoc:
|