i18n-js 3.7.1 → 4.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +4 -0
  3. data/.github/FUNDING.yml +3 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  6. data/.github/PULL_REQUEST_TEMPLATE.md +38 -0
  7. data/.github/dependabot.yml +15 -0
  8. data/.github/workflows/ruby-tests.yml +61 -0
  9. data/.gitignore +11 -7
  10. data/.rubocop.yml +12 -0
  11. data/CHANGELOG.md +12 -495
  12. data/CODE_OF_CONDUCT.md +74 -0
  13. data/CONTRIBUTING.md +79 -0
  14. data/Gemfile +3 -0
  15. data/LICENSE.md +20 -0
  16. data/README.md +89 -903
  17. data/Rakefile +10 -20
  18. data/exe/i18n +5 -0
  19. data/i18n-js.gemspec +47 -29
  20. data/lib/guard/i18n-js.rb +78 -0
  21. data/lib/guard/i18n-js/templates/Guardfile +10 -0
  22. data/lib/guard/i18n-js/version.rb +13 -0
  23. data/lib/i18n-js.rb +66 -1
  24. data/lib/i18n-js/cli.rb +47 -0
  25. data/lib/i18n-js/cli/command.rb +43 -0
  26. data/lib/i18n-js/cli/export_command.rb +108 -0
  27. data/lib/i18n-js/cli/init_command.rb +50 -0
  28. data/lib/i18n-js/cli/ui.rb +30 -0
  29. data/lib/i18n-js/cli/version_command.rb +18 -0
  30. data/lib/i18n-js/listen.rb +80 -0
  31. data/lib/i18n-js/schema.rb +92 -0
  32. data/lib/i18n-js/version.rb +5 -0
  33. metadata +123 -190
  34. data/.editorconfig +0 -24
  35. data/.npmignore +0 -27
  36. data/.travis.yml +0 -39
  37. data/Appraisals +0 -44
  38. data/app/assets/javascripts/i18n.js +0 -1092
  39. data/app/assets/javascripts/i18n/filtered.js.erb +0 -23
  40. data/app/assets/javascripts/i18n/shims.js +0 -240
  41. data/app/assets/javascripts/i18n/translations.js +0 -3
  42. data/gemfiles/i18n_0_6.gemfile +0 -7
  43. data/gemfiles/i18n_0_7.gemfile +0 -7
  44. data/gemfiles/i18n_0_8.gemfile +0 -7
  45. data/gemfiles/i18n_0_9.gemfile +0 -7
  46. data/gemfiles/i18n_1_0.gemfile +0 -7
  47. data/gemfiles/i18n_1_1.gemfile +0 -7
  48. data/gemfiles/i18n_1_2.gemfile +0 -7
  49. data/gemfiles/i18n_1_3.gemfile +0 -7
  50. data/gemfiles/i18n_1_4.gemfile +0 -7
  51. data/gemfiles/i18n_1_5.gemfile +0 -7
  52. data/gemfiles/i18n_1_6.gemfile +0 -7
  53. data/gemfiles/i18n_1_7.gemfile +0 -7
  54. data/gemfiles/i18n_1_8.gemfile +0 -7
  55. data/lib/i18n/js.rb +0 -259
  56. data/lib/i18n/js/dependencies.rb +0 -63
  57. data/lib/i18n/js/engine.rb +0 -87
  58. data/lib/i18n/js/fallback_locales.rb +0 -70
  59. data/lib/i18n/js/formatters/base.rb +0 -25
  60. data/lib/i18n/js/formatters/js.rb +0 -32
  61. data/lib/i18n/js/formatters/json.rb +0 -13
  62. data/lib/i18n/js/middleware.rb +0 -82
  63. data/lib/i18n/js/private/hash_with_symbol_keys.rb +0 -36
  64. data/lib/i18n/js/segment.rb +0 -80
  65. data/lib/i18n/js/utils.rb +0 -78
  66. data/lib/i18n/js/version.rb +0 -7
  67. data/lib/rails/generators/i18n/js/config/config_generator.rb +0 -19
  68. data/lib/rails/generators/i18n/js/config/templates/i18n-js.yml +0 -27
  69. data/lib/tasks/export.rake +0 -8
  70. data/package.json +0 -25
  71. data/spec/fixtures/custom_path.yml +0 -5
  72. data/spec/fixtures/default.yml +0 -5
  73. data/spec/fixtures/erb.yml +0 -5
  74. data/spec/fixtures/except_condition.yml +0 -7
  75. data/spec/fixtures/js_export_dir_custom.yml +0 -7
  76. data/spec/fixtures/js_export_dir_none.yml +0 -6
  77. data/spec/fixtures/js_extend_parent.yml +0 -6
  78. data/spec/fixtures/js_extend_segment.yml +0 -6
  79. data/spec/fixtures/js_file_per_locale.yml +0 -7
  80. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_default_locale_symbol.yml +0 -4
  81. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_hash.yml +0 -6
  82. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_locale.yml +0 -4
  83. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_locale_without_fallback_translations.yml +0 -4
  84. data/spec/fixtures/js_file_per_locale_with_fallbacks_enabled.yml +0 -4
  85. data/spec/fixtures/js_file_per_locale_without_fallbacks.yml +0 -4
  86. data/spec/fixtures/js_file_with_namespace_prefix_and_pretty_print.yml +0 -9
  87. data/spec/fixtures/js_sort_translation_keys_false.yml +0 -6
  88. data/spec/fixtures/js_sort_translation_keys_true.yml +0 -6
  89. data/spec/fixtures/json_only.yml +0 -18
  90. data/spec/fixtures/locales.yml +0 -133
  91. data/spec/fixtures/merge_plurals.yml +0 -6
  92. data/spec/fixtures/merge_plurals_with_no_overrides.yml +0 -4
  93. data/spec/fixtures/merge_plurals_with_partial_overrides.yml +0 -4
  94. data/spec/fixtures/millions.yml +0 -4
  95. data/spec/fixtures/multiple_conditions.yml +0 -7
  96. data/spec/fixtures/multiple_conditions_per_locale.yml +0 -7
  97. data/spec/fixtures/multiple_files.yml +0 -7
  98. data/spec/fixtures/no_config.yml +0 -2
  99. data/spec/fixtures/no_scope.yml +0 -4
  100. data/spec/fixtures/simple_scope.yml +0 -5
  101. data/spec/js/currency.spec.js +0 -62
  102. data/spec/js/current_locale.spec.js +0 -19
  103. data/spec/js/dates.spec.js +0 -276
  104. data/spec/js/defaults.spec.js +0 -31
  105. data/spec/js/extend.spec.js +0 -110
  106. data/spec/js/interpolation.spec.js +0 -124
  107. data/spec/js/jasmine/MIT.LICENSE +0 -20
  108. data/spec/js/jasmine/jasmine-html.js +0 -190
  109. data/spec/js/jasmine/jasmine.css +0 -166
  110. data/spec/js/jasmine/jasmine.js +0 -2476
  111. data/spec/js/jasmine/jasmine_favicon.png +0 -0
  112. data/spec/js/locales.spec.js +0 -31
  113. data/spec/js/localization.spec.js +0 -78
  114. data/spec/js/numbers.spec.js +0 -170
  115. data/spec/js/placeholder.spec.js +0 -24
  116. data/spec/js/pluralization.spec.js +0 -219
  117. data/spec/js/prepare_options.spec.js +0 -41
  118. data/spec/js/require.js +0 -2083
  119. data/spec/js/specs.html +0 -49
  120. data/spec/js/specs_requirejs.html +0 -72
  121. data/spec/js/translate.spec.js +0 -299
  122. data/spec/js/translations.js +0 -172
  123. data/spec/js/utility_functions.spec.js +0 -20
  124. data/spec/ruby/i18n/js/fallback_locales_spec.rb +0 -84
  125. data/spec/ruby/i18n/js/segment_spec.rb +0 -219
  126. data/spec/ruby/i18n/js/utils_spec.rb +0 -106
  127. data/spec/ruby/i18n/js_spec.rb +0 -748
  128. data/spec/spec_helper.rb +0 -79
  129. data/yarn.lock +0 -131
@@ -1,23 +0,0 @@
1
- <%# encoding: utf-8 %>
2
-
3
- // Using UMD pattern from
4
- // https://github.com/umdjs/umd#regular-module
5
- // `returnExports.js` version
6
- ;(function (root, factory) {
7
- if (typeof define === 'function' && define.amd) {
8
- // AMD. Register as an anonymous module.
9
- define(["i18n"], factory);
10
- } else if (typeof module === 'object' && module.exports) {
11
- // Node. Does not work with strict CommonJS, but
12
- // only CommonJS-like environments that support module.exports,
13
- // like Node.
14
- factory(require("i18n"));
15
- } else {
16
- // Browser globals (root is window)
17
- factory(root.I18n);
18
- }
19
- }(this, function(I18n) {
20
- "use strict";
21
-
22
- I18n.translations = <%= I18n::JS.filtered_translations.to_json %>;
23
- }));
@@ -1,240 +0,0 @@
1
- // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf
2
- if (!Array.prototype.indexOf) {
3
- Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
4
- "use strict";
5
- if (this == null) {
6
- throw new TypeError();
7
- }
8
- var t = Object(this);
9
- var len = t.length >>> 0;
10
- if (len === 0) {
11
- return -1;
12
- }
13
- var n = 0;
14
- if (arguments.length > 1) {
15
- n = Number(arguments[1]);
16
- if (n != n) { // shortcut for verifying if it's NaN
17
- n = 0;
18
- } else if (n != 0 && n != Infinity && n != -Infinity) {
19
- n = (n > 0 || -1) * Math.floor(Math.abs(n));
20
- }
21
- }
22
- if (n >= len) {
23
- return -1;
24
- }
25
- var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
26
- for (; k < len; k++) {
27
- if (k in t && t[k] === searchElement) {
28
- return k;
29
- }
30
- }
31
- return -1;
32
- }
33
- }
34
-
35
- // Production steps of ECMA-262, Edition 5, 15.4.4.18
36
- // Reference: http://es5.github.com/#x15.4.4.18
37
- // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach
38
- if ( !Array.prototype.forEach ) {
39
-
40
- Array.prototype.forEach = function forEach( callback, thisArg ) {
41
-
42
- var T, k;
43
-
44
- if ( this == null ) {
45
- throw new TypeError( "this is null or not defined" );
46
- }
47
-
48
- // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
49
- var O = Object(this);
50
-
51
- // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
52
- // 3. Let len be ToUint32(lenValue).
53
- var len = O.length >>> 0; // Hack to convert O.length to a UInt32
54
-
55
- // 4. If IsCallable(callback) is false, throw a TypeError exception.
56
- // See: http://es5.github.com/#x9.11
57
- if ( {}.toString.call(callback) !== "[object Function]" ) {
58
- throw new TypeError( callback + " is not a function" );
59
- }
60
-
61
- // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
62
- if ( thisArg ) {
63
- T = thisArg;
64
- }
65
-
66
- // 6. Let k be 0
67
- k = 0;
68
-
69
- // 7. Repeat, while k < len
70
- while( k < len ) {
71
-
72
- var kValue;
73
-
74
- // a. Let Pk be ToString(k).
75
- // This is implicit for LHS operands of the in operator
76
- // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
77
- // This step can be combined with c
78
- // c. If kPresent is true, then
79
- if ( Object.prototype.hasOwnProperty.call(O, k) ) {
80
-
81
- // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
82
- kValue = O[ k ];
83
-
84
- // ii. Call the Call internal method of callback with T as the this value and
85
- // argument list containing kValue, k, and O.
86
- callback.call( T, kValue, k, O );
87
- }
88
- // d. Increase k by 1.
89
- k++;
90
- }
91
- // 8. return undefined
92
- };
93
- }
94
-
95
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some
96
- if (!Array.prototype.some)
97
- {
98
- Array.prototype.some = function(fun /*, thisArg */)
99
- {
100
- 'use strict';
101
-
102
- if (this === void 0 || this === null)
103
- throw new TypeError();
104
-
105
- var t = Object(this);
106
- var len = t.length >>> 0;
107
- if (typeof fun !== 'function')
108
- throw new TypeError();
109
-
110
- var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
111
- for (var i = 0; i < len; i++)
112
- {
113
- if (i in t && fun.call(thisArg, t[i], i, t))
114
- return true;
115
- }
116
-
117
- return false;
118
- };
119
- }
120
-
121
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
122
- if (!Array.prototype.map) {
123
-
124
- Array.prototype.map = function(callback/*, thisArg*/) {
125
-
126
- var T, A, k;
127
-
128
- if (this == null) {
129
- throw new TypeError('this is null or not defined');
130
- }
131
-
132
- // 1. Let O be the result of calling ToObject passing the |this|
133
- // value as the argument.
134
- var O = Object(this);
135
-
136
- // 2. Let lenValue be the result of calling the Get internal
137
- // method of O with the argument "length".
138
- // 3. Let len be ToUint32(lenValue).
139
- var len = O.length >>> 0;
140
-
141
- // 4. If IsCallable(callback) is false, throw a TypeError exception.
142
- // See: http://es5.github.com/#x9.11
143
- if (typeof callback !== 'function') {
144
- throw new TypeError(callback + ' is not a function');
145
- }
146
-
147
- // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
148
- if (arguments.length > 1) {
149
- T = arguments[1];
150
- }
151
-
152
- // 6. Let A be a new array created as if by the expression new Array(len)
153
- // where Array is the standard built-in constructor with that name and
154
- // len is the value of len.
155
- A = new Array(len);
156
-
157
- // 7. Let k be 0
158
- k = 0;
159
-
160
- // 8. Repeat, while k < len
161
- while (k < len) {
162
-
163
- var kValue, mappedValue;
164
-
165
- // a. Let Pk be ToString(k).
166
- // This is implicit for LHS operands of the in operator
167
- // b. Let kPresent be the result of calling the HasProperty internal
168
- // method of O with argument Pk.
169
- // This step can be combined with c
170
- // c. If kPresent is true, then
171
- if (k in O) {
172
-
173
- // i. Let kValue be the result of calling the Get internal
174
- // method of O with argument Pk.
175
- kValue = O[k];
176
-
177
- // ii. Let mappedValue be the result of calling the Call internal
178
- // method of callback with T as the this value and argument
179
- // list containing kValue, k, and O.
180
- mappedValue = callback.call(T, kValue, k, O);
181
-
182
- // iii. Call the DefineOwnProperty internal method of A with arguments
183
- // Pk, Property Descriptor
184
- // { Value: mappedValue,
185
- // Writable: true,
186
- // Enumerable: true,
187
- // Configurable: true },
188
- // and false.
189
-
190
- // In browsers that support Object.defineProperty, use the following:
191
- // Object.defineProperty(A, k, {
192
- // value: mappedValue,
193
- // writable: true,
194
- // enumerable: true,
195
- // configurable: true
196
- // });
197
-
198
- // For best browser support, use the following:
199
- A[k] = mappedValue;
200
- }
201
- // d. Increase k by 1.
202
- k++;
203
- }
204
-
205
- // 9. return A
206
- return A;
207
- };
208
- }
209
-
210
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind
211
- if (!Function.prototype.bind) (function(){
212
- var ArrayPrototypeSlice = Array.prototype.slice;
213
- Function.prototype.bind = function(otherThis) {
214
- if (typeof this !== 'function') {
215
- // closest thing possible to the ECMAScript 5
216
- // internal IsCallable function
217
- throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
218
- }
219
-
220
- var baseArgs= ArrayPrototypeSlice .call(arguments, 1),
221
- baseArgsLength = baseArgs.length,
222
- fToBind = this,
223
- fNOP = function() {},
224
- fBound = function() {
225
- baseArgs.length = baseArgsLength; // reset to default base arguments
226
- baseArgs.push.apply(baseArgs, arguments);
227
- return fToBind.apply(
228
- fNOP.prototype.isPrototypeOf(this) ? this : otherThis, baseArgs
229
- );
230
- };
231
-
232
- if (this.prototype) {
233
- // Function.prototype doesn't have a prototype property
234
- fNOP.prototype = this.prototype;
235
- }
236
- fBound.prototype = new fNOP();
237
-
238
- return fBound;
239
- };
240
- })();
@@ -1,3 +0,0 @@
1
- //= require i18n/shims
2
- //= require i18n
3
- //= require i18n/filtered
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 0.6.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 0.7.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 0.8.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 0.9.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.0.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.1.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.2.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.3.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.4.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.5.1"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.6.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.7.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "i18n", "~> 1.8.0"
6
-
7
- gemspec path: "../"
data/lib/i18n/js.rb DELETED
@@ -1,259 +0,0 @@
1
- require "yaml"
2
- require "fileutils"
3
- require "i18n"
4
-
5
- require "i18n/js/utils"
6
- require "i18n/js/private/hash_with_symbol_keys"
7
-
8
- module I18n
9
- module JS
10
- require "i18n/js/dependencies"
11
- require "i18n/js/fallback_locales"
12
- require "i18n/js/segment"
13
- if JS::Dependencies.rails?
14
- require "i18n/js/middleware"
15
- require "i18n/js/engine"
16
- end
17
-
18
- DEFAULT_CONFIG_PATH = "config/i18n-js.yml"
19
- DEFAULT_EXPORT_DIR_PATH = "public/javascripts"
20
-
21
- # The configuration file. This defaults to the `config/i18n-js.yml` file.
22
- #
23
- def self.config_file_path
24
- @config_file_path ||= DEFAULT_CONFIG_PATH
25
- end
26
-
27
- def self.config_file_path=(new_path)
28
- @config_file_path = new_path
29
- end
30
-
31
- # Allow using a different backend than the one globally configured
32
- def self.backend
33
- @backend ||= I18n.backend
34
- end
35
-
36
- def self.backend=(alternative_backend)
37
- @backend = alternative_backend
38
- end
39
-
40
- # Export translations to JavaScript, considering settings
41
- # from configuration file
42
- def self.export
43
- export_i18n_js
44
-
45
- translation_segments.each(&:save!)
46
- end
47
-
48
- def self.segment_for_scope(scope, exceptions)
49
- if scope == "*"
50
- exclude(translations, exceptions)
51
- else
52
- scoped_translations(scope, exceptions)
53
- end
54
- end
55
-
56
- def self.configured_segments
57
- config[:translations].inject([]) do |segments, options_hash|
58
- options_hash_with_symbol_keys = Private::HashWithSymbolKeys.new(options_hash)
59
- file = options_hash_with_symbol_keys[:file]
60
- only = options_hash_with_symbol_keys[:only] || '*'
61
- exceptions = [options_hash_with_symbol_keys[:except] || []].flatten
62
-
63
- result = segment_for_scope(only, exceptions)
64
-
65
- merge_with_fallbacks!(result) if fallbacks
66
-
67
- unless result.empty?
68
- segments << Segment.new(
69
- file,
70
- result,
71
- extract_segment_options(options_hash_with_symbol_keys),
72
- )
73
- end
74
-
75
- segments
76
- end
77
- end
78
-
79
- # deep_merge! given result with result for fallback locale
80
- def self.merge_with_fallbacks!(result)
81
- I18n.available_locales.each do |locale|
82
- fallback_locales = FallbackLocales.new(fallbacks, locale)
83
- fallback_locales.each do |fallback_locale|
84
- # `result[fallback_locale]` could be missing
85
- result[locale] = Utils.deep_merge(result[fallback_locale] || {}, result[locale] || {})
86
- end
87
- end
88
- end
89
-
90
- def self.filtered_translations
91
- translations = {}.tap do |result|
92
- translation_segments.each do |segment|
93
- Utils.deep_merge!(result, segment.translations)
94
- end
95
- end
96
- return Utils.deep_key_sort(translations) if I18n::JS.sort_translation_keys?
97
- translations
98
- end
99
-
100
- def self.translation_segments
101
- if config_file_exists? && config[:translations]
102
- configured_segments
103
- else
104
- [Segment.new("#{DEFAULT_EXPORT_DIR_PATH}/translations.js", translations)]
105
- end
106
- end
107
-
108
- # Load configuration file for partial exporting and
109
- # custom output directory
110
- def self.config
111
- if config_file_exists?
112
- erb_result_from_yaml_file = ERB.new(File.read(config_file_path)).result
113
- Private::HashWithSymbolKeys.new(
114
- (::YAML.load(erb_result_from_yaml_file) || {})
115
- )
116
- else
117
- Private::HashWithSymbolKeys.new({})
118
- end.freeze
119
- end
120
-
121
- # @api private
122
- # Check if configuration file exist
123
- def self.config_file_exists?
124
- File.file? config_file_path
125
- end
126
-
127
- def self.scoped_translations(scopes, exceptions = []) # :nodoc:
128
- result = {}
129
-
130
- [scopes].flatten.each do |scope|
131
- translations_without_exceptions = exclude(translations, exceptions)
132
- filtered_translations = filter(translations_without_exceptions, scope) || {}
133
-
134
- Utils.deep_merge!(result, filtered_translations)
135
- end
136
-
137
- result
138
- end
139
-
140
- # Exclude keys from translations listed in the `except:` section in the config file
141
- def self.exclude(translations, exceptions)
142
- return translations if exceptions.empty?
143
-
144
- exceptions.inject(translations) do |memo, exception|
145
- exception_scopes = exception.to_s.split(".")
146
- Utils.deep_reject(memo) do |key, value, scopes|
147
- Utils.scopes_match?(scopes, exception_scopes)
148
- end
149
- end
150
- end
151
-
152
- # Filter translations according to the specified scope.
153
- def self.filter(translations, scopes)
154
- scopes = scopes.split(".") if scopes.is_a?(String)
155
- scopes = scopes.clone
156
- scope = scopes.shift
157
-
158
- if scope == "*"
159
- results = {}
160
- translations.each do |scope, translations|
161
- tmp = scopes.empty? ? translations : filter(translations, scopes)
162
- results[scope.to_sym] = tmp unless tmp.nil?
163
- end
164
- return results
165
- elsif translations.respond_to?(:key?) && translations.key?(scope.to_sym)
166
- return {scope.to_sym => scopes.empty? ? translations[scope.to_sym] : filter(translations[scope.to_sym], scopes)}
167
- end
168
- nil
169
- end
170
-
171
- # Initialize and return translations
172
- def self.translations
173
- self.backend.instance_eval do
174
- init_translations unless initialized?
175
- # When activesupport is absent,
176
- # the core extension (`#slice`) from `i18n` gem will be used instead
177
- # And it's causing errors (at least in test)
178
- #
179
- # So the input is wrapped by our class for better `#slice`
180
- Private::HashWithSymbolKeys.new(translations).
181
- slice(*::I18n.available_locales).
182
- to_h
183
- end
184
- end
185
-
186
- def self.use_fallbacks?
187
- fallbacks != false
188
- end
189
-
190
- def self.json_only
191
- config.fetch(:json_only) do
192
- # default value
193
- false
194
- end
195
- end
196
-
197
- def self.fallbacks
198
- config.fetch(:fallbacks) do
199
- # default value
200
- true
201
- end
202
- end
203
-
204
- def self.js_extend
205
- config.fetch(:js_extend) do
206
- # default value
207
- true
208
- end
209
- end
210
-
211
- def self.sort_translation_keys?
212
- @sort_translation_keys ||= (config[:sort_translation_keys]) if config.key?(:sort_translation_keys)
213
- @sort_translation_keys = true if @sort_translation_keys.nil?
214
- @sort_translation_keys
215
- end
216
-
217
- def self.sort_translation_keys=(value)
218
- @sort_translation_keys = !!value
219
- end
220
-
221
- def self.extract_segment_options(options)
222
- segment_options = Private::HashWithSymbolKeys.new({
223
- js_extend: js_extend,
224
- sort_translation_keys: sort_translation_keys?,
225
- json_only: json_only
226
- }).freeze
227
- segment_options.merge(options.slice(*Segment::OPTIONS))
228
- end
229
-
230
- ### Export i18n.js
231
- begin
232
-
233
- # Copy i18n.js
234
- def self.export_i18n_js
235
- return unless export_i18n_js_dir_path.is_a? String
236
-
237
- FileUtils.mkdir_p(export_i18n_js_dir_path)
238
-
239
- i18n_js_path = File.expand_path('../../../app/assets/javascripts/i18n.js', __FILE__)
240
- destination_path = File.expand_path("i18n.js", export_i18n_js_dir_path)
241
- return if File.exist?(destination_path) && FileUtils.identical?(i18n_js_path, destination_path)
242
-
243
- FileUtils.cp(i18n_js_path, export_i18n_js_dir_path)
244
- end
245
-
246
- def self.export_i18n_js_dir_path
247
- @export_i18n_js_dir_path ||= (config[:export_i18n_js] || :none) if config.key?(:export_i18n_js)
248
- @export_i18n_js_dir_path ||= DEFAULT_EXPORT_DIR_PATH
249
- @export_i18n_js_dir_path
250
- end
251
-
252
- # Setting this to nil would disable i18n.js exporting
253
- def self.export_i18n_js_dir_path=(new_path)
254
- new_path = :none unless new_path.is_a? String
255
- @export_i18n_js_dir_path = new_path
256
- end
257
- end
258
- end
259
- end