i18n-js 3.8.4 → 3.9.2
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/.editorconfig +1 -1
- data/.github/workflows/tests.yaml +6 -0
- data/Appraisals +8 -0
- data/CHANGELOG.md +31 -4
- data/README.md +29 -16
- data/app/assets/javascripts/i18n/shims.js +3 -3
- data/app/assets/javascripts/i18n.js +8 -8
- data/gemfiles/i18n_1_10.gemfile +7 -0
- data/gemfiles/i18n_1_9.gemfile +7 -0
- data/i18n-js.gemspec +1 -1
- data/lib/i18n/js/dependencies.rb +6 -2
- data/lib/i18n/js/engine.rb +1 -1
- data/lib/i18n/js/segment.rb +1 -1
- data/lib/i18n/js/utils.rb +1 -1
- data/lib/i18n/js/version.rb +1 -1
- data/lib/i18n/js.rb +12 -2
- data/package.json +1 -1
- data/spec/fixtures/js_available_locales_custom.yml +1 -0
- data/spec/js/pluralization.spec.js +9 -0
- data/spec/js/require.js +4 -4
- data/spec/ruby/i18n/js_spec.rb +72 -23
- metadata +11 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7d3a003954d81c9cbb7c2f18791ed8baf068f3fbbe6587ce59cd893b7852d1f2
|
|
4
|
+
data.tar.gz: d9fcb2bf3de34987021c2ac556ae65bcecbdfe6cbb638455d6e7919e03268d8c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 07b6670d05343e82e44041379917a56ee72b185b1bfdcceefe6ae8eae9a1eece1852db7a378eaf8a38f5769ec76587737b200bfb22e50444a02e14bbb4b78793
|
|
7
|
+
data.tar.gz: afe058283a6af31ab843ba2c0da1f1949d37623a3e0823c786cb947b252eac51ffc25c4f856c01e9e1ec87546dd31dddf4705e1f6b5597a3edd02e950e674ed2
|
data/.editorconfig
CHANGED
|
@@ -4,11 +4,13 @@ on:
|
|
|
4
4
|
pull_request:
|
|
5
5
|
branches:
|
|
6
6
|
- main
|
|
7
|
+
- v3
|
|
7
8
|
paths-ignore:
|
|
8
9
|
- 'README.md'
|
|
9
10
|
push:
|
|
10
11
|
branches:
|
|
11
12
|
- main
|
|
13
|
+
- v3
|
|
12
14
|
paths-ignore:
|
|
13
15
|
- 'README.md'
|
|
14
16
|
|
|
@@ -26,6 +28,8 @@ jobs:
|
|
|
26
28
|
- 2.5
|
|
27
29
|
- 2.6
|
|
28
30
|
- 2.7
|
|
31
|
+
- '3.0'
|
|
32
|
+
- 3.1
|
|
29
33
|
gemfile:
|
|
30
34
|
- gemfiles/i18n_0_6.gemfile
|
|
31
35
|
- gemfiles/i18n_0_7.gemfile
|
|
@@ -40,6 +44,8 @@ jobs:
|
|
|
40
44
|
- gemfiles/i18n_1_6.gemfile
|
|
41
45
|
- gemfiles/i18n_1_7.gemfile
|
|
42
46
|
- gemfiles/i18n_1_8.gemfile
|
|
47
|
+
- gemfiles/i18n_1_9.gemfile
|
|
48
|
+
- gemfiles/i18n_1_10.gemfile
|
|
43
49
|
allow_failures:
|
|
44
50
|
- false
|
|
45
51
|
include:
|
data/Appraisals
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
|
-
This project adheres to [Semantic Versioning](
|
|
3
|
+
This project adheres to [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
@@ -18,7 +18,31 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
|
18
18
|
- Nothing
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
## [3.
|
|
21
|
+
## [3.9.2] - 2022-03-31
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- [JS] Fix pluralization fallback in i18n.js
|
|
26
|
+
(PR: https://github.com/fnando/i18n-js/pull/645)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## [3.9.1] - 2022-02-08
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- [Ruby] Allow rails 7
|
|
34
|
+
(PR: https://github.com/fnando/i18n-js/pull/638)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
## [3.9.0] - 2021-07-30
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- [Ruby] Allow to set custom locales instead of using only `I18n.available_locales`.
|
|
42
|
+
(PR: https://github.com/fnando/i18n-js/pull/617)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
## [3.8.4] - 2021-07-27
|
|
22
46
|
|
|
23
47
|
### Fixed
|
|
24
48
|
|
|
@@ -26,7 +50,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
|
26
50
|
(PR: https://github.com/fnando/i18n-js/pull/591)
|
|
27
51
|
|
|
28
52
|
|
|
29
|
-
## [3.8.3]
|
|
53
|
+
## [3.8.3] - 2021-05-21
|
|
30
54
|
|
|
31
55
|
### Changed
|
|
32
56
|
|
|
@@ -509,7 +533,10 @@ And today is not April Fools' Day
|
|
|
509
533
|
|
|
510
534
|
|
|
511
535
|
|
|
512
|
-
[Unreleased]: https://github.com/fnando/i18n-js/compare/v3.
|
|
536
|
+
[Unreleased]: https://github.com/fnando/i18n-js/compare/v3.9.2...HEAD
|
|
537
|
+
[3.9.2]: https://github.com/fnando/i18n-js/compare/v3.9.1...v3.9.2
|
|
538
|
+
[3.9.1]: https://github.com/fnando/i18n-js/compare/v3.9.0...v3.9.1
|
|
539
|
+
[3.9.0]: https://github.com/fnando/i18n-js/compare/v3.8.4...v3.9.0
|
|
513
540
|
[3.8.4]: https://github.com/fnando/i18n-js/compare/v3.8.3...v3.8.4
|
|
514
541
|
[3.8.3]: https://github.com/fnando/i18n-js/compare/v3.8.2...v3.8.3
|
|
515
542
|
[3.8.2]: https://github.com/fnando/i18n-js/compare/v3.8.1...v3.8.2
|
data/README.md
CHANGED
|
@@ -8,11 +8,10 @@
|
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
10
|
<a href="https://github.com/fnando/i18n-js/actions?query=workflow%3ATests"><img src="https://github.com/fnando/i18n-js/workflows/Tests/badge.svg" alt="Tests"></a>
|
|
11
|
-
<a href="
|
|
11
|
+
<a href="https://badge.fury.io/rb/i18n-js"><img src="https://img.shields.io/gem/v/i18n-js.svg" alt="Gem Version"></a>
|
|
12
12
|
<a href="https://www.npmjs.com/package/i18n-js"><img src="https://img.shields.io/npm/v/i18n-js.svg" alt="npm"></a>
|
|
13
13
|
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
|
|
14
|
-
<a href="https://
|
|
15
|
-
<a href="https://coveralls.io/r/fnando/i18n-js"><img src="http://img.shields.io/coveralls/fnando/i18n-js.svg" alt="Coverage Status"></a>
|
|
14
|
+
<a href="https://coveralls.io/r/fnando/i18n-js"><img src="https://img.shields.io/coveralls/fnando/i18n-js.svg" alt="Coverage Status"></a>
|
|
16
15
|
<a href="https://gitter.im/fnando/i18n-js"><img src="https://img.shields.io/badge/gitter-join%20chat-1dce73.svg" alt="Gitter"></a>
|
|
17
16
|
</p>
|
|
18
17
|
|
|
@@ -59,10 +58,10 @@ For more details, see:
|
|
|
59
58
|
- [this gist](https://gist.github.com/bazzel/ecdff4718962e57c2d5569cf01d332fe)
|
|
60
59
|
- https://github.com/fnando/i18n-js/issues/597
|
|
61
60
|
|
|
62
|
-
#### Rails app with [Asset Pipeline](
|
|
61
|
+
#### Rails app with [Asset Pipeline](https://guides.rubyonrails.org/asset_pipeline.html)
|
|
63
62
|
|
|
64
63
|
If you're using the
|
|
65
|
-
[asset pipeline](
|
|
64
|
+
[asset pipeline](https://guides.rubyonrails.org/asset_pipeline.html), then you
|
|
66
65
|
must add the following line to your `app/assets/javascripts/application.js`.
|
|
67
66
|
|
|
68
67
|
```javascript
|
|
@@ -77,7 +76,7 @@ must add the following line to your `app/assets/javascripts/application.js`.
|
|
|
77
76
|
//= require i18n/translations
|
|
78
77
|
```
|
|
79
78
|
|
|
80
|
-
#### Rails app without [Asset Pipeline](
|
|
79
|
+
#### Rails app without [Asset Pipeline](https://guides.rubyonrails.org/asset_pipeline.html)
|
|
81
80
|
|
|
82
81
|
First, put this in your `application.html` (layout file). Then get the JS files
|
|
83
82
|
following the instructions below.
|
|
@@ -271,6 +270,17 @@ You must disable this feature by setting the option to `false`.
|
|
|
271
270
|
To find more examples on how to use the configuration file please refer to the
|
|
272
271
|
tests.
|
|
273
272
|
|
|
273
|
+
#### Available locales
|
|
274
|
+
|
|
275
|
+
By specifying option `js_available_locales` with a list of locales, this list
|
|
276
|
+
would be used instead of default `I18n.available_locales` to generate translations.
|
|
277
|
+
|
|
278
|
+
Example:
|
|
279
|
+
|
|
280
|
+
```yaml
|
|
281
|
+
js_available_locales: ["de", "en"]
|
|
282
|
+
```
|
|
283
|
+
|
|
274
284
|
#### Namespace
|
|
275
285
|
|
|
276
286
|
Setting the `namespace` option will change the namespace of the output
|
|
@@ -976,23 +986,26 @@ more details and discussion of this issue.
|
|
|
976
986
|
### JS `I18n.toCurrency` & `I18n.toNumber` cannot handle large integers
|
|
977
987
|
|
|
978
988
|
The above methods use `toFixed` and it only supports 53 bit integers. Ref:
|
|
979
|
-
|
|
989
|
+
https://2ality.com/2012/07/large-integers.html
|
|
980
990
|
|
|
981
991
|
Feel free to find & discuss possible solution(s) at issue
|
|
982
992
|
[#511](https://github.com/fnando/i18n-js/issues/511)
|
|
983
993
|
|
|
984
|
-
###
|
|
994
|
+
### May not work with all backend implementations
|
|
985
995
|
|
|
986
|
-
|
|
987
|
-
|
|
996
|
+
I18n backend implementations have to conform to a specific interface to work
|
|
997
|
+
with i18n-js. For backends that do not conform to the interface, you will likely
|
|
998
|
+
get an exception like this:
|
|
988
999
|
|
|
989
1000
|
```
|
|
990
1001
|
Undefined method 'initialized?' for <your backend class>
|
|
991
1002
|
```
|
|
992
1003
|
|
|
993
|
-
For now, i18n-js is
|
|
994
|
-
|
|
995
|
-
|
|
1004
|
+
For now, i18n-js is compatible with the `Simple` backend and with
|
|
1005
|
+
`I18n::Backend::ActiveRecord` (>= 0.4.0).
|
|
1006
|
+
|
|
1007
|
+
If you need a more sophisticated backend for your rails application that doesn't
|
|
1008
|
+
implement the required methods, you can setup i18n-js to get translations from a
|
|
996
1009
|
separate `Simple` backend, by adding the following in an initializer:
|
|
997
1010
|
|
|
998
1011
|
```ruby
|
|
@@ -1031,18 +1044,18 @@ and discussion of this issue.
|
|
|
1031
1044
|
|
|
1032
1045
|
## Maintainer
|
|
1033
1046
|
|
|
1034
|
-
- Nando Vieira - <
|
|
1047
|
+
- Nando Vieira - <https://nandovieira.com>
|
|
1035
1048
|
|
|
1036
1049
|
## Contributing
|
|
1037
1050
|
|
|
1038
1051
|
Once you've made your great commits:
|
|
1039
1052
|
|
|
1040
|
-
1. [Fork](
|
|
1053
|
+
1. [Fork](https://help.github.com/forking/) I18n.js
|
|
1041
1054
|
2. Create a branch with a clear name
|
|
1042
1055
|
3. Make your changes (Please also add/change spec, README and CHANGELOG if
|
|
1043
1056
|
applicable)
|
|
1044
1057
|
4. Push changes to the created branch
|
|
1045
|
-
5. [Create an Pull Request](
|
|
1058
|
+
5. [Create an Pull Request](https://github.com/fnando/i18n-js/pulls)
|
|
1046
1059
|
6. That's it!
|
|
1047
1060
|
|
|
1048
1061
|
Please respect the indentation rules and code style. And use 2 spaces, not tabs.
|
|
@@ -33,7 +33,7 @@ if (!Array.prototype.indexOf) {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// Production steps of ECMA-262, Edition 5, 15.4.4.18
|
|
36
|
-
// Reference:
|
|
36
|
+
// Reference: https://es5.github.com/#x15.4.4.18
|
|
37
37
|
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach
|
|
38
38
|
if ( !Array.prototype.forEach ) {
|
|
39
39
|
|
|
@@ -53,7 +53,7 @@ if ( !Array.prototype.forEach ) {
|
|
|
53
53
|
var len = O.length >>> 0; // Hack to convert O.length to a UInt32
|
|
54
54
|
|
|
55
55
|
// 4. If IsCallable(callback) is false, throw a TypeError exception.
|
|
56
|
-
// See:
|
|
56
|
+
// See: https://es5.github.com/#x9.11
|
|
57
57
|
if ( {}.toString.call(callback) !== "[object Function]" ) {
|
|
58
58
|
throw new TypeError( callback + " is not a function" );
|
|
59
59
|
}
|
|
@@ -139,7 +139,7 @@ if (!Array.prototype.map) {
|
|
|
139
139
|
var len = O.length >>> 0;
|
|
140
140
|
|
|
141
141
|
// 4. If IsCallable(callback) is false, throw a TypeError exception.
|
|
142
|
-
// See:
|
|
142
|
+
// See: https://es5.github.com/#x9.11
|
|
143
143
|
if (typeof callback !== 'function') {
|
|
144
144
|
throw new TypeError(callback + ' is not a function');
|
|
145
145
|
}
|
|
@@ -269,23 +269,23 @@
|
|
|
269
269
|
}
|
|
270
270
|
|
|
271
271
|
// Locale code format 1:
|
|
272
|
-
// According to RFC4646 (
|
|
272
|
+
// According to RFC4646 (https://www.ietf.org/rfc/rfc4646.txt)
|
|
273
273
|
// language codes for Traditional Chinese should be `zh-Hant`
|
|
274
274
|
//
|
|
275
275
|
// But due to backward compatibility
|
|
276
276
|
// We use older version of IETF language tag
|
|
277
|
-
// @see
|
|
278
|
-
// @see
|
|
277
|
+
// @see https://www.w3.org/TR/html401/struct/dirlang.html
|
|
278
|
+
// @see https://en.wikipedia.org/wiki/IETF_language_tag
|
|
279
279
|
//
|
|
280
280
|
// Format: `language-code = primary-code ( "-" subcode )*`
|
|
281
281
|
//
|
|
282
282
|
// primary-code uses ISO639-1
|
|
283
|
-
// @see
|
|
284
|
-
// @see
|
|
283
|
+
// @see https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
|
|
284
|
+
// @see https://www.iso.org/iso/home/standards/language_codes.htm
|
|
285
285
|
//
|
|
286
286
|
// subcode uses ISO 3166-1 alpha-2
|
|
287
|
-
// @see
|
|
288
|
-
// @see
|
|
287
|
+
// @see https://en.wikipedia.org/wiki/ISO_3166
|
|
288
|
+
// @see https://www.iso.org/iso/country_codes.htm
|
|
289
289
|
//
|
|
290
290
|
// @note
|
|
291
291
|
// subcode can be in upper case or lower case
|
|
@@ -433,7 +433,7 @@
|
|
|
433
433
|
, pluralizerKey
|
|
434
434
|
, message;
|
|
435
435
|
|
|
436
|
-
if (isObject(translations)) {
|
|
436
|
+
if (translations && isObject(translations)) {
|
|
437
437
|
while (pluralizerKeys.length) {
|
|
438
438
|
pluralizerKey = pluralizerKeys.shift();
|
|
439
439
|
if (isSet(translations[pluralizerKey])) {
|
data/i18n-js.gemspec
CHANGED
|
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
|
9
9
|
s.authors = ["Nando Vieira"]
|
|
10
10
|
s.email = ["fnando.vieira@gmail.com"]
|
|
11
|
-
s.homepage = "
|
|
11
|
+
s.homepage = "https://rubygems.org/gems/i18n-js"
|
|
12
12
|
s.summary = "It's a small library to provide the Rails I18n translations on the Javascript."
|
|
13
13
|
s.description = s.summary
|
|
14
14
|
s.license = "MIT"
|
data/lib/i18n/js/dependencies.rb
CHANGED
|
@@ -18,7 +18,7 @@ module I18n
|
|
|
18
18
|
# Call this in an initializer
|
|
19
19
|
def using_asset_pipeline?
|
|
20
20
|
assets_pipeline_available =
|
|
21
|
-
(rails3? || rails4? || rails5? || rails6?) &&
|
|
21
|
+
(rails3? || rails4? || rails5? || rails6? || rails7?) &&
|
|
22
22
|
Rails.respond_to?(:application) &&
|
|
23
23
|
Rails.application.config.respond_to?(:assets)
|
|
24
24
|
rails3_assets_enabled =
|
|
@@ -26,7 +26,7 @@ module I18n
|
|
|
26
26
|
assets_pipeline_available &&
|
|
27
27
|
Rails.application.config.assets.enabled != false
|
|
28
28
|
|
|
29
|
-
assets_pipeline_available && (rails4? || rails5? || rails6? || rails3_assets_enabled)
|
|
29
|
+
assets_pipeline_available && (rails4? || rails5? || rails6? || rails7? || rails3_assets_enabled)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
private
|
|
@@ -46,6 +46,10 @@ module I18n
|
|
|
46
46
|
def rails6?
|
|
47
47
|
rails? && Rails.version.to_i == 6
|
|
48
48
|
end
|
|
49
|
+
|
|
50
|
+
def rails7?
|
|
51
|
+
rails? && Rails.version.to_i == 7
|
|
52
|
+
end
|
|
49
53
|
|
|
50
54
|
def safe_gem_check(*args)
|
|
51
55
|
if Gem::Specification.respond_to?(:find_by_name)
|
data/lib/i18n/js/engine.rb
CHANGED
|
@@ -21,7 +21,7 @@ module I18n
|
|
|
21
21
|
# https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb
|
|
22
22
|
#
|
|
23
23
|
# Finisher hook is the place which should be used as border.
|
|
24
|
-
#
|
|
24
|
+
# https://guides.rubyonrails.org/configuring.html#initializers
|
|
25
25
|
#
|
|
26
26
|
# For detail see Pull Request:
|
|
27
27
|
# https://github.com/fnando/i18n-js/pull/371
|
data/lib/i18n/js/segment.rb
CHANGED
|
@@ -33,7 +33,7 @@ module I18n
|
|
|
33
33
|
# Saves JSON file containing translations
|
|
34
34
|
def save!
|
|
35
35
|
if @file =~ LOCALE_INTERPOLATOR
|
|
36
|
-
I18n.
|
|
36
|
+
I18n::JS.js_available_locales.each do |locale|
|
|
37
37
|
write_file(file_for_locale(locale), @translations.slice(locale))
|
|
38
38
|
end
|
|
39
39
|
else
|
data/lib/i18n/js/utils.rb
CHANGED
|
@@ -3,7 +3,7 @@ module I18n
|
|
|
3
3
|
module Utils
|
|
4
4
|
PLURAL_KEYS = %i[zero one two few many other].freeze
|
|
5
5
|
|
|
6
|
-
# Based on deep_merge by Stefan Rusterholz, see <
|
|
6
|
+
# Based on deep_merge by Stefan Rusterholz, see <https://www.ruby-forum.com/topic/142809>.
|
|
7
7
|
# This method is used to handle I18n fallbacks. Given two equivalent path nodes in two locale trees:
|
|
8
8
|
# 1. If the node in the current locale appears to be an I18n pluralization (:one, :other, etc.),
|
|
9
9
|
# use the node, but merge in any missing/non-nil keys from the fallback (default) locale.
|
data/lib/i18n/js/version.rb
CHANGED
data/lib/i18n/js.rb
CHANGED
|
@@ -81,7 +81,7 @@ module I18n
|
|
|
81
81
|
|
|
82
82
|
# deep_merge! given result with result for fallback locale
|
|
83
83
|
def self.merge_with_fallbacks!(result)
|
|
84
|
-
|
|
84
|
+
js_available_locales.each do |locale|
|
|
85
85
|
fallback_locales = FallbackLocales.new(fallbacks, locale)
|
|
86
86
|
fallback_locales.each do |fallback_locale|
|
|
87
87
|
# `result[fallback_locale]` could be missing
|
|
@@ -183,7 +183,7 @@ module I18n
|
|
|
183
183
|
#
|
|
184
184
|
# So the input is wrapped by our class for better `#slice`
|
|
185
185
|
Private::HashWithSymbolKeys.new(translations).
|
|
186
|
-
slice(*::I18n.
|
|
186
|
+
slice(*::I18n::JS.js_available_locales).
|
|
187
187
|
to_h
|
|
188
188
|
end
|
|
189
189
|
end
|
|
@@ -213,6 +213,16 @@ module I18n
|
|
|
213
213
|
end
|
|
214
214
|
end
|
|
215
215
|
|
|
216
|
+
# Get all available locales.
|
|
217
|
+
#
|
|
218
|
+
# @return [Array<Symbol>] the locales.
|
|
219
|
+
def self.js_available_locales
|
|
220
|
+
config.fetch(:js_available_locales) do
|
|
221
|
+
# default value
|
|
222
|
+
I18n.available_locales
|
|
223
|
+
end.map(&:to_sym)
|
|
224
|
+
end
|
|
225
|
+
|
|
216
226
|
def self.sort_translation_keys?
|
|
217
227
|
@sort_translation_keys ||= (config[:sort_translation_keys]) if config.key?(:sort_translation_keys)
|
|
218
228
|
@sort_translation_keys = true if @sort_translation_keys.nil?
|
data/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
js_available_locales: ["en", "foo"]
|
|
@@ -148,6 +148,15 @@ describe("Pluralization", function(){
|
|
|
148
148
|
expect(I18n.p(5, "inbox", { count: 5 })).toEqual('You have 5 messages');
|
|
149
149
|
});
|
|
150
150
|
|
|
151
|
+
it("fallback to default locale when I18n.fallbacks is enabled and value is null", function() {
|
|
152
|
+
I18n.locale = "pt-BR";
|
|
153
|
+
I18n.fallbacks = true;
|
|
154
|
+
I18n.translations["pt-BR"].inbox = null;
|
|
155
|
+
expect(I18n.p(0, "inbox", { count: 0 })).toEqual("You have no messages");
|
|
156
|
+
expect(I18n.p(1, "inbox", { count: 1 })).toEqual("You have 1 message");
|
|
157
|
+
expect(I18n.p(5, "inbox", { count: 5 })).toEqual("You have 5 messages");
|
|
158
|
+
});
|
|
159
|
+
|
|
151
160
|
it("fallback to 'other' scope", function() {
|
|
152
161
|
I18n.locale = "pt-BR";
|
|
153
162
|
I18n.fallbacks = true;
|
data/spec/js/require.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** vim: et:ts=4:sw=4:sts=4
|
|
2
2
|
* @license RequireJS 2.1.16 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved.
|
|
3
3
|
* Available via the MIT or new BSD license.
|
|
4
|
-
* see:
|
|
4
|
+
* see: https://github.com/jrburke/requirejs for details
|
|
5
5
|
*/
|
|
6
6
|
//Not using strict: uneven strict support in browsers, #392, and causes
|
|
7
7
|
//problems with requirejs.exec()/transpiler plugins that may not be strict.
|
|
@@ -163,7 +163,7 @@ var requirejs, require, define;
|
|
|
163
163
|
* @returns {Error}
|
|
164
164
|
*/
|
|
165
165
|
function makeError(id, msg, err, requireModules) {
|
|
166
|
-
var e = new Error(msg + '\
|
|
166
|
+
var e = new Error(msg + '\nhttps://requirejs.org/docs/errors.html#' + id);
|
|
167
167
|
e.requireType = id;
|
|
168
168
|
e.requireModules = requireModules;
|
|
169
169
|
if (err) {
|
|
@@ -1810,7 +1810,7 @@ var requirejs, require, define;
|
|
|
1810
1810
|
head = s.head = document.getElementsByTagName('head')[0];
|
|
1811
1811
|
//If BASE tag is in play, using appendChild is a problem for IE6.
|
|
1812
1812
|
//When that browser dies, this can be removed. Details in this jQuery bug:
|
|
1813
|
-
//
|
|
1813
|
+
//https://dev.jquery.com/ticket/2709
|
|
1814
1814
|
baseElement = document.getElementsByTagName('base')[0];
|
|
1815
1815
|
if (baseElement) {
|
|
1816
1816
|
head = s.head = baseElement.parentNode;
|
|
@@ -1829,7 +1829,7 @@ var requirejs, require, define;
|
|
|
1829
1829
|
*/
|
|
1830
1830
|
req.createNode = function (config, moduleName, url) {
|
|
1831
1831
|
var node = config.xhtml ?
|
|
1832
|
-
document.createElementNS('
|
|
1832
|
+
document.createElementNS('https://www.w3.org/1999/xhtml', 'html:script') :
|
|
1833
1833
|
document.createElement('script');
|
|
1834
1834
|
node.type = config.scriptType || 'text/javascript';
|
|
1835
1835
|
node.charset = 'utf-8';
|
data/spec/ruby/i18n/js_spec.rb
CHANGED
|
@@ -307,21 +307,30 @@ EOS
|
|
|
307
307
|
expect(subject[:de][:null_test]).to eql(nil)
|
|
308
308
|
end
|
|
309
309
|
|
|
310
|
-
context
|
|
310
|
+
context 'when given locale is in `I18n.available_locales` but its translation is missing' do
|
|
311
311
|
subject { translations[:fr][:fallback_test] }
|
|
312
312
|
|
|
313
|
-
let(:
|
|
314
|
-
|
|
315
|
-
let!(:new_available_locales) { I18n.config.available_locales + [new_locale] }
|
|
313
|
+
let(:available_locales) { %i[fr pirate] }
|
|
314
|
+
|
|
316
315
|
before do
|
|
317
|
-
I18n.
|
|
318
|
-
set_config
|
|
316
|
+
allow(::I18n).to receive(:available_locales).and_return(available_locales)
|
|
317
|
+
set_config 'js_file_per_locale_with_fallbacks_as_locale_without_fallback_translations.yml'
|
|
319
318
|
end
|
|
320
|
-
|
|
321
|
-
|
|
319
|
+
|
|
320
|
+
it { should eql(nil) }
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
context 'when given locale is in `.js_available_locales` but its translation is missing' do
|
|
324
|
+
subject { translations[:fr][:fallback_test] }
|
|
325
|
+
|
|
326
|
+
let(:available_locales) { %i[fr pirate] }
|
|
327
|
+
|
|
328
|
+
before do
|
|
329
|
+
allow(described_class).to receive(:js_available_locales).and_return(available_locales)
|
|
330
|
+
set_config 'js_file_per_locale_with_fallbacks_as_locale_without_fallback_translations.yml'
|
|
322
331
|
end
|
|
323
332
|
|
|
324
|
-
it {should eql(nil)}
|
|
333
|
+
it { should eql(nil) }
|
|
325
334
|
end
|
|
326
335
|
|
|
327
336
|
context "with I18n::Fallbacks enabled" do
|
|
@@ -385,27 +394,67 @@ EOS
|
|
|
385
394
|
end
|
|
386
395
|
end
|
|
387
396
|
|
|
388
|
-
|
|
397
|
+
describe '.js_available_locales' do
|
|
398
|
+
subject { described_class.js_available_locales }
|
|
399
|
+
|
|
400
|
+
let(:results) { described_class.scoped_translations('*.admin.*.title') }
|
|
401
|
+
let(:result) { ->(locale) { results[locale][:admin][:show][:title] } }
|
|
389
402
|
|
|
390
|
-
context
|
|
391
|
-
it
|
|
392
|
-
result = I18n::JS.scoped_translations("*.admin.*.title")
|
|
403
|
+
context 'when I18n.available_locales is not set' do
|
|
404
|
+
it { expect(subject).to eq ::I18n.available_locales }
|
|
393
405
|
|
|
394
|
-
|
|
395
|
-
expect(result
|
|
396
|
-
expect(result
|
|
406
|
+
it 'should allow all locales' do
|
|
407
|
+
expect(result.call(:en)).to eql('Show')
|
|
408
|
+
expect(result.call(:fr)).to eql('Visualiser')
|
|
409
|
+
expect(result.call(:ja)).to eql('Ignore me')
|
|
397
410
|
end
|
|
398
411
|
end
|
|
399
412
|
|
|
400
|
-
context
|
|
401
|
-
|
|
413
|
+
context 'when I18n.available_locales is set' do
|
|
414
|
+
let(:available_locales) { %i[en fr] }
|
|
415
|
+
|
|
416
|
+
before { allow(::I18n).to receive(:available_locales).and_return(available_locales) }
|
|
417
|
+
|
|
418
|
+
it { expect(subject).to eq available_locales }
|
|
419
|
+
|
|
420
|
+
it 'should ignore non-valid locales' do
|
|
421
|
+
expect(result.call(:en)).to eql('Show')
|
|
422
|
+
expect(result.call(:fr)).to eql('Visualiser')
|
|
423
|
+
expect(results).not_to include(:ja)
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
context 'when :js_available_locales set in config' do
|
|
427
|
+
before { set_config 'js_available_locales_custom.yml' }
|
|
402
428
|
|
|
403
|
-
|
|
404
|
-
|
|
429
|
+
it { expect(subject).to eq %i[en foo] }
|
|
430
|
+
|
|
431
|
+
it 'should ignore non-valid locales' do
|
|
432
|
+
expect(result.call(:en)).to eql('Show')
|
|
433
|
+
expect(results).not_to include(:fr, :ja)
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
context 'I18n.available_locales' do
|
|
440
|
+
let(:results) { described_class.scoped_translations('*.admin.*.title') }
|
|
441
|
+
let(:result) { ->(locale) { results[locale][:admin][:show][:title] } }
|
|
442
|
+
|
|
443
|
+
context 'when I18n.available_locales is not set' do
|
|
444
|
+
it 'should allow all locales' do
|
|
445
|
+
expect(result.call(:en)).to eql('Show')
|
|
446
|
+
expect(result.call(:fr)).to eql('Visualiser')
|
|
447
|
+
expect(result.call(:ja)).to eql('Ignore me')
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
context 'when I18n.available_locales is set' do
|
|
452
|
+
before { allow(::I18n).to receive(:available_locales){ [:en, :fr] } }
|
|
405
453
|
|
|
406
|
-
|
|
407
|
-
expect(result
|
|
408
|
-
expect(result.
|
|
454
|
+
it 'should ignore non-valid locales' do
|
|
455
|
+
expect(result.call(:en)).to eql('Show')
|
|
456
|
+
expect(result.call(:fr)).to eql('Visualiser')
|
|
457
|
+
expect(results).not_to include(:ja)
|
|
409
458
|
end
|
|
410
459
|
end
|
|
411
460
|
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.
|
|
4
|
+
version: 3.9.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nando Vieira
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-03-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: i18n
|
|
@@ -121,6 +121,7 @@ files:
|
|
|
121
121
|
- gemfiles/i18n_0_9.gemfile
|
|
122
122
|
- gemfiles/i18n_1_0.gemfile
|
|
123
123
|
- gemfiles/i18n_1_1.gemfile
|
|
124
|
+
- gemfiles/i18n_1_10.gemfile
|
|
124
125
|
- gemfiles/i18n_1_2.gemfile
|
|
125
126
|
- gemfiles/i18n_1_3.gemfile
|
|
126
127
|
- gemfiles/i18n_1_4.gemfile
|
|
@@ -128,6 +129,7 @@ files:
|
|
|
128
129
|
- gemfiles/i18n_1_6.gemfile
|
|
129
130
|
- gemfiles/i18n_1_7.gemfile
|
|
130
131
|
- gemfiles/i18n_1_8.gemfile
|
|
132
|
+
- gemfiles/i18n_1_9.gemfile
|
|
131
133
|
- i18n-js.gemspec
|
|
132
134
|
- i18njs.png
|
|
133
135
|
- lib/i18n-js.rb
|
|
@@ -152,6 +154,7 @@ files:
|
|
|
152
154
|
- spec/fixtures/default.yml
|
|
153
155
|
- spec/fixtures/erb.yml
|
|
154
156
|
- spec/fixtures/except_condition.yml
|
|
157
|
+
- spec/fixtures/js_available_locales_custom.yml
|
|
155
158
|
- spec/fixtures/js_export_dir_custom.yml
|
|
156
159
|
- spec/fixtures/js_export_dir_none.yml
|
|
157
160
|
- spec/fixtures/js_extend_parent.yml
|
|
@@ -208,11 +211,11 @@ files:
|
|
|
208
211
|
- spec/ruby/i18n/js_spec.rb
|
|
209
212
|
- spec/spec_helper.rb
|
|
210
213
|
- yarn.lock
|
|
211
|
-
homepage:
|
|
214
|
+
homepage: https://rubygems.org/gems/i18n-js
|
|
212
215
|
licenses:
|
|
213
216
|
- MIT
|
|
214
217
|
metadata: {}
|
|
215
|
-
post_install_message:
|
|
218
|
+
post_install_message:
|
|
216
219
|
rdoc_options: []
|
|
217
220
|
require_paths:
|
|
218
221
|
- lib
|
|
@@ -227,8 +230,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
227
230
|
- !ruby/object:Gem::Version
|
|
228
231
|
version: '0'
|
|
229
232
|
requirements: []
|
|
230
|
-
rubygems_version: 3.
|
|
231
|
-
signing_key:
|
|
233
|
+
rubygems_version: 3.3.10
|
|
234
|
+
signing_key:
|
|
232
235
|
specification_version: 4
|
|
233
236
|
summary: It's a small library to provide the Rails I18n translations on the Javascript.
|
|
234
237
|
test_files:
|
|
@@ -236,6 +239,7 @@ test_files:
|
|
|
236
239
|
- spec/fixtures/default.yml
|
|
237
240
|
- spec/fixtures/erb.yml
|
|
238
241
|
- spec/fixtures/except_condition.yml
|
|
242
|
+
- spec/fixtures/js_available_locales_custom.yml
|
|
239
243
|
- spec/fixtures/js_export_dir_custom.yml
|
|
240
244
|
- spec/fixtures/js_export_dir_none.yml
|
|
241
245
|
- spec/fixtures/js_extend_parent.yml
|