i18n-js 3.7.0 → 3.8.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dbf33a6af551aff2ea13db6c39e84c568f426aaaacd78b1a27524917a05cc580
4
- data.tar.gz: a7ba15b0084e0eed0eb8a9f3692131c8786401a3ed257217d0d6ba43cdefd3d3
3
+ metadata.gz: 1ecff24d70edad3fce1aafa3f96872f4d7a9fc7a0ff7fdcb5fe112ee5f79d410
4
+ data.tar.gz: ee563efe72631f54c5c36536803a3bf0c31fe1c98f996763a36921b14cf21c2a
5
5
  SHA512:
6
- metadata.gz: f5bb0487ef02b35454d86e92c9d1634cee3ac9eaa302fcc19044e22c80491682fe4e5c44eef2d6aa90ff91ff0f15db4f2bd7539b4de8e66773be54ba880b193d
7
- data.tar.gz: f6d56fb7550b4cce0d02e25cf98b38be75cfc3d0cb9cfe3ac0ba050621a08363b7ff49abc4ddc5803d8ac3be3f864bbb3187bb3476e18e91479484f8accd0622
6
+ metadata.gz: 59ebc7bd38d3cd451631107c711d1a53001d3677a073327fdb66c043d4c5f37b6f7429b0fd2e7ff495201b575670bb4baabdaccb5e3cbebabc973f17f9db74bf
7
+ data.tar.gz: 9e841a4b949c5993894b3f74296ca7837594cc1d1a68552b1c840578694501ad3a163dca443fac0f9bd6fa2fc198aec3fbdf299da45f96a283fc1ce215d1bd72
@@ -0,0 +1,3 @@
1
+ ---
2
+ github: ["fnando"]
3
+ custom: ["https://paypal.me/nandovieira/🍕"]
@@ -0,0 +1,100 @@
1
+ name: Tests
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+ paths-ignore:
8
+ - 'README.md'
9
+ push:
10
+ branches:
11
+ - main
12
+ paths-ignore:
13
+ - 'README.md'
14
+
15
+ jobs:
16
+ ruby_unit_tests:
17
+ name: Ruby Unit Tests
18
+ if: "contains(github.event.commits[0].message, '[ci skip]') == false"
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ os:
23
+ - ubuntu
24
+ ruby:
25
+ - 2.4
26
+ - 2.5
27
+ - 2.6
28
+ - 2.7
29
+ gemfile:
30
+ - gemfiles/i18n_0_6.gemfile
31
+ - gemfiles/i18n_0_7.gemfile
32
+ - gemfiles/i18n_0_8.gemfile
33
+ - gemfiles/i18n_0_9.gemfile
34
+ - gemfiles/i18n_1_0.gemfile
35
+ - gemfiles/i18n_1_1.gemfile
36
+ - gemfiles/i18n_1_2.gemfile
37
+ - gemfiles/i18n_1_3.gemfile
38
+ - gemfiles/i18n_1_4.gemfile
39
+ - gemfiles/i18n_1_5.gemfile
40
+ - gemfiles/i18n_1_6.gemfile
41
+ - gemfiles/i18n_1_7.gemfile
42
+ - gemfiles/i18n_1_8.gemfile
43
+ allow_failures:
44
+ - false
45
+ include:
46
+ - os: ubuntu
47
+ ruby: ruby-head
48
+ gemfile: gemfiles/i18n_1_8.gemfile
49
+ allow_failures: true
50
+ env:
51
+ BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
52
+ ALLOW_FAILURES: "${{ matrix.allow_failures }}"
53
+ runs-on: ${{ matrix.os }}-latest
54
+ continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
55
+ steps:
56
+ - name: Checkout
57
+ uses: actions/checkout@v2
58
+ - name: Setup Ruby
59
+ uses: ruby/setup-ruby@v1
60
+ with:
61
+ ruby-version: ${{ matrix.ruby }}
62
+ bundler-cache: true
63
+ - name: Test
64
+ run: bundle exec rake spec:ruby || $ALLOW_FAILURES
65
+
66
+ js_unit_tests:
67
+ name: JS Unit Tests
68
+ if: "contains(github.event.commits[0].message, '[ci skip]') == false"
69
+ strategy:
70
+ fail-fast: false
71
+ matrix:
72
+ os:
73
+ - ubuntu
74
+ node:
75
+ - 10
76
+ - 12
77
+ - 14
78
+ runs-on: ${{ matrix.os }}-latest
79
+ steps:
80
+ - name: Checkout
81
+ uses: actions/checkout@v2
82
+ - name: Setup node
83
+ uses: actions/setup-node@v1
84
+ with:
85
+ node-version: ${{ matrix.node }}
86
+ - name: Get yarn cache directory path
87
+ id: yarn-cache-dir-path
88
+ run: echo "::set-output name=dir::$(yarn cache dir)"
89
+ - uses: actions/cache@v2
90
+ id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
91
+ with:
92
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
93
+ key: ${{ runner.os }}-yarn-${{ github.ref }}-${{ github.sha }}
94
+ restore-keys: |
95
+ ${{ runner.os }}-yarn-${{ github.ref }}-
96
+ ${{ runner.os }}-yarn-
97
+ - name: Install JS Dependencies
98
+ run: yarn install
99
+ - name: Test
100
+ run: npm test
data/CHANGELOG.md CHANGED
@@ -18,6 +18,50 @@ This project adheres to [Semantic Versioning](http://semver.org/).
18
18
  - Nothing
19
19
 
20
20
 
21
+ ## [3.8.3]
22
+
23
+ ### Changed
24
+
25
+ - [Ruby] Generate translations in JS as `JSON.parse` instead of object literal for performance
26
+ (PR: https://github.com/fnando/i18n-js/pull/605)
27
+ (PR: https://github.com/fnando/i18n-js/pull/606)
28
+ (PR: https://github.com/fnando/i18n-js/pull/607)
29
+
30
+
31
+ ## [3.8.2] - 2021-03-18
32
+
33
+ ### Fixed
34
+
35
+ - [Ruby] Stop using deprecated method
36
+ (PR: https://github.com/fnando/i18n-js/pull/598)
37
+ - [Ruby] Fix typo in error class reference
38
+ (Commit: https://github.com/fnando/i18n-js/commit/cc075ad0a36e940205d0a14390379d69013d188e)
39
+
40
+
41
+ ## [3.8.1] - 2021-02-25
42
+
43
+ ### Fixed
44
+
45
+ - [Ruby] Fix performance issue reading config
46
+ (PR: https://github.com/fnando/i18n-js/pull/593)
47
+
48
+
49
+ ## [3.8.0] - 2020-10-15
50
+
51
+ ### Added
52
+
53
+ - [JS] Add option `scope` for `toHumanSize()`
54
+ (PR: https://github.com/fnando/i18n-js/pull/583)
55
+
56
+
57
+ ## [3.7.1] - 2020-06-30
58
+
59
+ ### Fixed
60
+
61
+ - [JS] For translation missing behaviour `guess`, replace all underscores to spaces properly
62
+ (PR: https://github.com/fnando/i18n-js/pull/574)
63
+
64
+
21
65
  ## [3.7.0] - 2020-05-29
22
66
 
23
67
  ### Added
@@ -457,8 +501,13 @@ And today is not April Fools' Day
457
501
 
458
502
 
459
503
 
460
- [Unreleased]: https://github.com/fnando/i18n-js/compare/v3.7.0...HEAD
461
- [3.6.0]: https://github.com/fnando/i18n-js/compare/v3.6.0...v3.7.0
504
+ [Unreleased]: https://github.com/fnando/i18n-js/compare/v3.8.3...HEAD
505
+ [3.8.3]: https://github.com/fnando/i18n-js/compare/v3.8.2...v3.8.3
506
+ [3.8.2]: https://github.com/fnando/i18n-js/compare/v3.8.1...v3.8.2
507
+ [3.8.1]: https://github.com/fnando/i18n-js/compare/v3.8.0...v3.8.1
508
+ [3.8.0]: https://github.com/fnando/i18n-js/compare/v3.7.1...v3.8.0
509
+ [3.7.1]: https://github.com/fnando/i18n-js/compare/v3.7.0...v3.7.1
510
+ [3.7.0]: https://github.com/fnando/i18n-js/compare/v3.6.0...v3.7.0
462
511
  [3.6.0]: https://github.com/fnando/i18n-js/compare/v3.5.1...v3.6.0
463
512
  [3.5.1]: https://github.com/fnando/i18n-js/compare/v3.5.0...v3.5.1
464
513
  [3.5.0]: https://github.com/fnando/i18n-js/compare/v3.4.2...v3.5.0
data/README.md CHANGED
@@ -1,17 +1,22 @@
1
- # I18n.js
2
-
3
- [![Gem Version](http://img.shields.io/gem/v/i18n-js.svg?style=flat-square)](http://badge.fury.io/rb/i18n-js)
4
- [![npm](https://img.shields.io/npm/v/i18n-js.svg?style=flat-square)](https://www.npmjs.com/package/i18n-js)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
6
-
7
- [![Build Status](http://img.shields.io/travis/fnando/i18n-js.svg?style=flat-square)](https://travis-ci.org/fnando/i18n-js)
8
- [![Coverage Status](http://img.shields.io/coveralls/fnando/i18n-js.svg?style=flat-square)](https://coveralls.io/r/fnando/i18n-js)
9
-
10
- [![Gitter](https://img.shields.io/badge/gitter-join%20chat-1dce73.svg?style=flat-square)](https://gitter.im/fnando/i18n-js)
11
-
12
- > The above badges are generated by https://shields.io/
13
-
14
- It's a small library to provide the Rails I18n translations on the JavaScript.
1
+ <p align="center">
2
+ <img width="250" height="58" src="https://github.com/fnando/i18n-js/raw/main/i18njs.png" alt="i18n.js">
3
+ </p>
4
+
5
+ <p align="center">
6
+ It's a small library to provide the Rails I18n translations on the JavaScript.
7
+ </p>
8
+
9
+ <p align="center">
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="http://badge.fury.io/rb/i18n-js"><img src="http://img.shields.io/gem/v/i18n-js.svg" alt="Gem Version"></a>
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
+ <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://travis-ci.org/fnando/i18n-js"><img src="http://img.shields.io/travis/fnando/i18n-js.svg" alt="Build Status"></a>
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>
16
+ <a href="https://gitter.im/fnando/i18n-js"><img src="https://img.shields.io/badge/gitter-join%20chat-1dce73.svg" alt="Gitter"></a>
17
+ </p>
18
+
19
+ ---
15
20
 
16
21
  Features:
17
22
 
@@ -23,8 +28,9 @@ Features:
23
28
  - Lots more! :)
24
29
 
25
30
  ## Version Notice
26
- The `master` branch (including this README) is for latest `3.0.0` instead of `2.x`.
27
31
 
32
+ The `main` branch (including this README) is for latest `3.0.0` instead of
33
+ `2.x`.
28
34
 
29
35
  ## Usage
30
36
 
@@ -33,14 +39,31 @@ The `master` branch (including this README) is for latest `3.0.0` instead of `2.
33
39
  #### Rails app
34
40
 
35
41
  Add the gem to your Gemfile.
42
+
36
43
  ```ruby
37
44
  gem "i18n-js"
38
45
  ```
39
46
 
47
+ #### Rails with [webpacker](https://github.com/rails/webpacker)
48
+
49
+ If you're using `webpacker`, you may need to add the dependencies to your client
50
+ with:
51
+
52
+ ```
53
+ yarn add i18n-js
54
+ # or, if you're using npm,
55
+ npm install i18n-js
56
+ ```
57
+
58
+ For more details, see:
59
+ - [this gist](https://gist.github.com/bazzel/ecdff4718962e57c2d5569cf01d332fe)
60
+ - https://github.com/fnando/i18n-js/issues/597
61
+
40
62
  #### Rails app with [Asset Pipeline](http://guides.rubyonrails.org/asset_pipeline.html)
41
63
 
42
- If you're using the [asset pipeline](http://guides.rubyonrails.org/asset_pipeline.html),
43
- then you must add the following line to your `app/assets/javascripts/application.js`.
64
+ If you're using the
65
+ [asset pipeline](http://guides.rubyonrails.org/asset_pipeline.html), then you
66
+ must add the following line to your `app/assets/javascripts/application.js`.
44
67
 
45
68
  ```javascript
46
69
  //
@@ -56,9 +79,9 @@ then you must add the following line to your `app/assets/javascripts/application
56
79
 
57
80
  #### Rails app without [Asset Pipeline](http://guides.rubyonrails.org/asset_pipeline.html)
58
81
 
82
+ First, put this in your `application.html` (layout file). Then get the JS files
83
+ following the instructions below.
59
84
 
60
- First, put this in your `application.html` (layout file).
61
- Then get the JS files following the instructions below.
62
85
  ```erb
63
86
  <%# This is just an example, you can put `i18n.js` and `translations.js` anywhere you like %>
64
87
  <%# Unlike the Asset Pipeline example, you need to require both **in order** %>
@@ -66,55 +89,66 @@ Then get the JS files following the instructions below.
66
89
  <%= javascript_include_tag "translations", skip_pipeline: true %>
67
90
  ```
68
91
 
69
- **There are two ways to get `translations.js` (For Rails app without Asset Pipeline).**
70
-
71
- 1. This `translations.js` file can be automatically generated by the `I18n::JS::Middleware`.
72
- Just add `config.middleware.use I18n::JS::Middleware` to your `config/application.rb` file.
73
- 2. If you can't or prefer not to generate this file,
74
- you can move the middleware line to your `config/environments/development.rb` file
75
- and run `rake i18n:js:export` before deploying.
76
- This will export all translation files, including the custom scopes
77
- you may have defined on `config/i18n-js.yml`.
78
- If `I18n.available_locales` is set (e.g. in your Rails `config/application.rb` file)
79
- then only the specified locales will be exported.
80
- Current version of `i18n.js` will also be exported to avoid version mismatching by downloading.
92
+ **There are two ways to get `translations.js` (For Rails app without Asset
93
+ Pipeline).**
94
+
95
+ 1. This `translations.js` file can be automatically generated by the
96
+ `I18n::JS::Middleware`. Just add `config.middleware.use I18n::JS::Middleware`
97
+ to your `config/application.rb` file.
98
+ 2. If you can't or prefer not to generate this file, you can move the middleware
99
+ line to your `config/environments/development.rb` file and run
100
+ `rake i18n:js:export` before deploying. This will export all translation
101
+ files, including the custom scopes you may have defined on
102
+ `config/i18n-js.yml`. If `I18n.available_locales` is set (e.g. in your Rails
103
+ `config/application.rb` file) then only the specified locales will be
104
+ exported. Current version of `i18n.js` will also be exported to avoid version
105
+ mismatching by downloading.
81
106
 
82
107
  #### Export Configuration (For translations)
83
108
 
84
- Exported translation files generated by `I18n::JS::Middleware` or `rake i18n:js:export` can be customized with config file `config/i18n-js.yml`
85
- (use `rails generate i18n:js:config` to create it).
86
- You can even get more files generated to different folders and with different translations to best suit your needs.
87
- The config file also affects developers using Asset Pipeline to require translations.
88
- Except the option `file`, since all translations are required by adding `//= require i18n/translations`.
109
+ Exported translation files generated by `I18n::JS::Middleware` or
110
+ `rake i18n:js:export` can be customized with config file `config/i18n-js.yml`
111
+ (use `rails generate i18n:js:config` to create it). You can even get more files
112
+ generated to different folders and with different translations to best suit your
113
+ needs. The config file also affects developers using Asset Pipeline to require
114
+ translations. Except the option `file`, since all translations are required by
115
+ adding `//= require i18n/translations`.
89
116
 
90
117
  Examples:
118
+
91
119
  ```yaml
92
120
  translations:
93
- - file: 'public/javascripts/path-to-your-messages-file.js'
94
- only: '*.date.formats'
95
- - file: 'public/javascripts/path-to-your-second-file.js'
96
- only: ['*.activerecord', '*.admin.*.title']
121
+ - file: "public/javascripts/path-to-your-messages-file.js"
122
+ only: "*.date.formats"
123
+ - file: "public/javascripts/path-to-your-second-file.js"
124
+ only: ["*.activerecord", "*.admin.*.title"]
97
125
  ```
98
126
 
99
- If `only` is omitted all the translations will be saved. Also, make sure you add that initial `*`; it specifies that all languages will be exported. If you want to export only one language, you can do something like this:
127
+ If `only` is omitted all the translations will be saved. Also, make sure you add
128
+ that initial `*`; it specifies that all languages will be exported. If you want
129
+ to export only one language, you can do something like this:
130
+
100
131
  ```yaml
101
132
  translations:
102
- - file: 'public/javascripts/en.js'
103
- only: 'en.*'
104
- - file: 'public/javascripts/pt-BR.js'
105
- only: 'pt-BR.*'
133
+ - file: "public/javascripts/en.js"
134
+ only: "en.*"
135
+ - file: "public/javascripts/pt-BR.js"
136
+ only: "pt-BR.*"
106
137
  ```
107
138
 
108
- Optionally, you can auto generate a translation file per available locale if you specify the `%{locale}` placeholder.
139
+ Optionally, you can auto generate a translation file per available locale if you
140
+ specify the `%{locale}` placeholder.
141
+
109
142
  ```yaml
110
143
  translations:
111
- - file: "public/javascripts/i18n/%{locale}.js"
112
- only: '*'
113
- - file: "public/javascripts/frontend/i18n/%{locale}.js"
114
- only: ['*.frontend', '*.users.*']
144
+ - file: "public/javascripts/i18n/%{locale}.js"
145
+ only: "*"
146
+ - file: "public/javascripts/frontend/i18n/%{locale}.js"
147
+ only: ["*.frontend", "*.users.*"]
115
148
  ```
116
149
 
117
150
  You can also include ERB in your config file.
151
+
118
152
  ```yaml
119
153
  translations:
120
154
  <% Widgets.each do |widget| %>
@@ -123,39 +157,37 @@ translations:
123
157
  <% end %>
124
158
  ```
125
159
 
126
- You are able to exclude certain phrases or whole groups of phrases by
127
- specifying the YAML key(s) in the `except` configuration option. The outputted
128
- JS translations file (exported or generated by the middleware) will omit any
129
- keys listed in `except` configuration param:
160
+ You are able to exclude certain phrases or whole groups of phrases by specifying
161
+ the YAML key(s) in the `except` configuration option. The outputted JS
162
+ translations file (exported or generated by the middleware) will omit any keys
163
+ listed in `except` configuration param:
130
164
 
131
165
  ```yaml
132
166
  translations:
133
- - except: ['*.active_admin', '*.ransack', '*.activerecord.errors']
167
+ - except: ["*.active_admin", "*.ransack", "*.activerecord.errors"]
134
168
  ```
135
169
 
136
-
137
170
  #### Export Configuration (For other things)
138
171
 
139
- - `I18n::JS.config_file_path`
140
- Expected Type: `String`
141
- Default: `config/i18n-js.yml`
142
- Behaviour: Try to read the config file from that location
172
+ - `I18n::JS.config_file_path` Expected Type: `String` Default:
173
+ `config/i18n-js.yml` Behaviour: Try to read the config file from that location
143
174
 
144
- - `I18n::JS.export_i18n_js_dir_path`
145
- Expected Type: `String`
146
- Default: `public/javascripts`
147
- Behaviour:
148
- - Any `String`: considered as a relative path for a folder to `Rails.root` and export `i18n.js` to that folder for `rake i18n:js:export`
175
+ - `I18n::JS.export_i18n_js_dir_path` Expected Type: `String` Default:
176
+ `public/javascripts` Behaviour:
177
+
178
+ - Any `String`: considered as a relative path for a folder to `Rails.root` and
179
+ export `i18n.js` to that folder for `rake i18n:js:export`
149
180
  - Any non-`String` (`nil`, `false`, `:none`, etc): Disable `i18n.js` exporting
150
181
 
151
- - `I18n::JS.sort_translation_keys`
152
- Expected Type: `Boolean`
153
- Default: `true`
182
+ - `I18n::JS.sort_translation_keys` Expected Type: `Boolean` Default: `true`
154
183
  Behaviour:
155
- - Sets whether or not to deep sort all translation keys in order to generate identical output for the same translations
184
+
185
+ - Sets whether or not to deep sort all translation keys in order to generate
186
+ identical output for the same translations
156
187
  - Set to true to ensure identical asset fingerprints for the asset pipeline
157
188
 
158
- - You may also set `export_i18n_js` and `sort_translation_keys` in your config file, e.g.:
189
+ - You may also set `export_i18n_js` and `sort_translation_keys` in your config
190
+ file, e.g.:
159
191
 
160
192
  ```yaml
161
193
  export_i18n_js: false
@@ -168,21 +200,24 @@ translations:
168
200
  - ...
169
201
  ```
170
202
 
171
- To find more examples on how to use the configuration file please refer to the tests.
203
+ To find more examples on how to use the configuration file please refer to the
204
+ tests.
172
205
 
173
206
  #### Fallbacks
174
207
 
175
- If you specify the `fallbacks` option, you will be able to fill missing translations with those inside fallback locale(s).
176
- Default value is `true`.
208
+ If you specify the `fallbacks` option, you will be able to fill missing
209
+ translations with those inside fallback locale(s). Default value is `true`.
177
210
 
178
211
  Examples:
212
+
179
213
  ```yaml
180
214
  fallbacks: true
181
215
 
182
216
  translations:
183
- - file: "public/javascripts/i18n/%{locale}.js"
184
- only: '*'
217
+ - file: "public/javascripts/i18n/%{locale}.js"
218
+ only: "*"
185
219
  ```
220
+
186
221
  This will enable merging fallbacks into each file. (set to `false` to disable).
187
222
  If you use `I18n` with fallbacks, the fallbacks defined there will be used.
188
223
  Otherwise `I18n.default_locale` will be used.
@@ -191,9 +226,10 @@ Otherwise `I18n.default_locale` will be used.
191
226
  fallbacks: :de
192
227
 
193
228
  translations:
194
- - file: "public/javascripts/i18n/%{locale}.js"
195
- only: '*'
229
+ - file: "public/javascripts/i18n/%{locale}.js"
230
+ only: "*"
196
231
  ```
232
+
197
233
  Here, the specified locale `:de` will be used as fallback for all locales.
198
234
 
199
235
  ```yaml
@@ -202,42 +238,49 @@ fallbacks:
202
238
  de: "en"
203
239
 
204
240
  translations:
205
- - file: "public/javascripts/i18n/%{locale}.js"
206
- only: '*'
241
+ - file: "public/javascripts/i18n/%{locale}.js"
242
+ only: "*"
207
243
  ```
208
- Fallbacks defined will be used, if not defined (e.g. `:pl`) `I18n.fallbacks` or `I18n.default_locale` will be used.
244
+
245
+ Fallbacks defined will be used, if not defined (e.g. `:pl`) `I18n.fallbacks` or
246
+ `I18n.default_locale` will be used.
209
247
 
210
248
  ```yaml
211
249
  fallbacks: :default_locale
212
250
 
213
251
  translations:
214
- - file: "public/javascripts/i18n/%{locale}.js"
215
- only: '*'
252
+ - file: "public/javascripts/i18n/%{locale}.js"
253
+ only: "*"
216
254
  ```
217
- Setting the option to `:default_locale` will enforce the fallback to use the `I18n.default_locale`, ignoring `I18n.fallbacks`.
255
+
256
+ Setting the option to `:default_locale` will enforce the fallback to use the
257
+ `I18n.default_locale`, ignoring `I18n.fallbacks`.
218
258
 
219
259
  Examples:
260
+
220
261
  ```yaml
221
262
  fallbacks: false
222
263
 
223
264
  translations:
224
- - file: "public/javascripts/i18n/%{locale}.js"
225
- only: '*'
265
+ - file: "public/javascripts/i18n/%{locale}.js"
266
+ only: "*"
226
267
  ```
227
- You must disable this feature by setting the option to `false`.
228
268
 
229
- To find more examples on how to use the configuration file please refer to the tests.
269
+ You must disable this feature by setting the option to `false`.
230
270
 
271
+ To find more examples on how to use the configuration file please refer to the
272
+ tests.
231
273
 
232
274
  #### Namespace
233
275
 
234
- Setting the `namespace` option will change the namespace of the output Javascript file to something other than `I18n`.
235
- This can be useful in no-conflict scenarios. Example:
276
+ Setting the `namespace` option will change the namespace of the output
277
+ Javascript file to something other than `I18n`. This can be useful in
278
+ no-conflict scenarios. Example:
236
279
 
237
280
  ```yaml
238
281
  translations:
239
- - file: "public/javascripts/i18n/translations.js"
240
- namespace: "MyNamespace"
282
+ - file: "public/javascripts/i18n/translations.js"
283
+ namespace: "MyNamespace"
241
284
  ```
242
285
 
243
286
  will create:
@@ -247,19 +290,20 @@ MyNamespace.translations || (MyNamespace.translations = {});
247
290
  MyNamespace.translations["en"] = { ... }
248
291
  ```
249
292
 
250
-
251
293
  ### Adding prefix & suffix to the translations file(s)
252
294
 
253
- Setting the `prefix: "import I18n from 'i18n-js';\n"` option will add the line at the beginning of the resultant translation file.
254
- This can be useful to use this gem with the [i18n-js](https://www.npmjs.com/package/i18n-js) npm package, which is quite useful to use it with webpack.
255
- The user should provide the semi-colon and the newline character if needed.
295
+ Setting the `prefix: "import I18n from 'i18n-js';\n"` option will add the line
296
+ at the beginning of the resultant translation file. This can be useful to use
297
+ this gem with the [i18n-js](https://www.npmjs.com/package/i18n-js) npm package,
298
+ which is quite useful to use it with webpack. The user should provide the
299
+ semi-colon and the newline character if needed.
256
300
 
257
301
  For example:
258
302
 
259
303
  ```yaml
260
304
  translations:
261
- - file: "public/javascripts/i18n/translations.js"
262
- prefix: "import I18n from 'i18n-js';\n"
305
+ - file: "public/javascripts/i18n/translations.js"
306
+ prefix: "import I18n from 'i18n-js';\n"
263
307
  ```
264
308
 
265
309
  will create:
@@ -269,47 +313,44 @@ import I18n from 'i18n-js';
269
313
  I18n.translations || (I18n.translations = {});
270
314
  ```
271
315
 
272
-
273
316
  `suffix` option is added in https://github.com/fnando/i18n-js/pull/561.
274
317
  It's similar to `prefix` so won't explain it in details.
275
318
 
276
-
277
319
  #### Pretty Print
278
320
 
279
- Set the `pretty_print` option if you would like whitespace and indentation in your output file (default: false)
321
+ Set the `pretty_print` option if you would like whitespace and indentation in
322
+ your output file (default: false)
280
323
 
281
324
  ```yaml
282
325
  translations:
283
- - file: "public/javascripts/i18n/translations.js"
284
- pretty_print: true
326
+ - file: "public/javascripts/i18n/translations.js"
327
+ pretty_print: true
285
328
  ```
286
329
 
287
-
288
330
  #### Javascript Deep Merge (:js_extend option)
289
331
 
290
- By default, the output file Javascript will call the `I18n.extend` method to ensure that newly loaded locale
291
- files are deep-merged with any locale data already in memory. To disable this either globally or per-file,
292
- set the `js_extend` option to false
332
+ By default, the output file Javascript will call the `I18n.extend` method to
333
+ ensure that newly loaded locale files are deep-merged with any locale data
334
+ already in memory. To disable this either globally or per-file, set the
335
+ `js_extend` option to false
293
336
 
294
337
  ```yaml
295
- js_extend: false # this will disable Javascript I18n.extend globally
338
+ js_extend: false # this will disable Javascript I18n.extend globally
296
339
  translations:
297
- - file: "public/javascripts/i18n/translations.js"
298
- js_extend: false # this will disable Javascript I18n.extend for this file
340
+ - file: "public/javascripts/i18n/translations.js"
341
+ js_extend: false # this will disable Javascript I18n.extend for this file
299
342
  ```
300
343
 
301
-
302
344
  #### Vanilla JavaScript
303
345
 
304
- Just add the `i18n.js` file to your page. You'll have to build the translations object
305
- by hand or using your favorite programming language. More info below.
306
-
346
+ Just add the `i18n.js` file to your page. You'll have to build the translations
347
+ object by hand or using your favorite programming language. More info below.
307
348
 
308
349
  #### Via NPM with webpack and CommonJS
309
350
 
351
+ Add the following line to your package.json dependencies where version is the
352
+ version you want:
310
353
 
311
- Add the following line to your package.json dependencies
312
- where version is the version you want
313
354
  ```javascript
314
355
  "i18n-js": "{version_constraint}"
315
356
 
@@ -317,17 +358,21 @@ where version is the version you want
317
358
  // npm install requires it to be the gzipped tarball, see [npm install](https://www.npmjs.org/doc/cli/npm-install.html)
318
359
  "i18n-js": "https://github.com/fnando/i18n-js/archive/{tag_name_or_branch_name_or_commit_sha}.tar.gz"
319
360
  ```
361
+
320
362
  Run npm install then use via
363
+
321
364
  ```javascript
322
365
  var i18n = require("i18n-js");
323
366
  ```
324
367
 
325
-
326
368
  ### Setting up
327
369
 
328
- You **don't** need to set up a thing. The default settings will work just okay. But if you want to split translations into several files or specify specific contexts, you can follow the rest of this setting up section.
370
+ You **don't** need to set up a thing. The default settings will work just okay.
371
+ But if you want to split translations into several files or specify contexts,
372
+ you can follow the rest of this setting up section.
329
373
 
330
374
  Set your locale is easy as
375
+
331
376
  ```javascript
332
377
  I18n.defaultLocale = "pt-BR";
333
378
  I18n.locale = "pt-BR";
@@ -335,9 +380,11 @@ I18n.currentLocale();
335
380
  // pt-BR
336
381
  ```
337
382
 
338
- **NOTE:** You can now apply your configuration **before I18n** is loaded like this:
383
+ **NOTE:** You can now apply your configuration **before I18n** is loaded like
384
+ this:
385
+
339
386
  ```javascript
340
- I18n = {} // You must define this object in top namespace, which should be `window`
387
+ I18n = {}; // You must define this object in top namespace, which should be `window`
341
388
  I18n.defaultLocale = "pt-BR";
342
389
  I18n.locale = "pt-BR";
343
390
 
@@ -347,7 +394,8 @@ I18n.currentLocale();
347
394
  // pt-BR
348
395
  ```
349
396
 
350
- In practice, you'll have something like the following in your `application.html.erb`:
397
+ In practice, you'll have something like the following in your
398
+ `application.html.erb`:
351
399
 
352
400
  ```erb
353
401
  <script type="text/javascript">
@@ -361,7 +409,7 @@ You can use translate your messages:
361
409
  ```javascript
362
410
  I18n.t("some.scoped.translation");
363
411
  // or translate with explicit setting of locale
364
- I18n.t("some.scoped.translation", {locale: "fr"});
412
+ I18n.t("some.scoped.translation", { locale: "fr" });
365
413
  ```
366
414
 
367
415
  You can also interpolate values:
@@ -369,36 +417,38 @@ You can also interpolate values:
369
417
  ```javascript
370
418
  // You need the `translations` object setup first
371
419
  I18n.translations["en"] = {
372
- greeting: "Hello %{name}"
373
- }
420
+ greeting: "Hello %{name}",
421
+ };
374
422
 
375
- I18n.t("greeting", {name: "John Doe"});
423
+ I18n.t("greeting", { name: "John Doe" });
376
424
  ```
425
+
377
426
  You can set default values for missing scopes:
427
+
378
428
  ```javascript
379
429
  // simple translation
380
- I18n.t("some.missing.scope", {defaultValue: "A default message"});
430
+ I18n.t("some.missing.scope", { defaultValue: "A default message" });
381
431
 
382
432
  // with interpolation
383
- I18n.t("noun", {defaultValue: "I'm a {{noun}}", noun: "Mac"});
433
+ I18n.t("noun", { defaultValue: "I'm a {{noun}}", noun: "Mac" });
384
434
  ```
385
435
 
386
436
  You can also provide a list of default fallbacks for missing scopes:
387
437
 
388
438
  ```javascript
389
439
  // As a scope
390
- I18n.t("some.missing.scope", {defaults: [{scope: "some.existing.scope"}]});
440
+ I18n.t("some.missing.scope", { defaults: [{ scope: "some.existing.scope" }] });
391
441
 
392
442
  // As a simple translation
393
- I18n.t("some.missing.scope", {defaults: [{message: "Some message"}]});
443
+ I18n.t("some.missing.scope", { defaults: [{ message: "Some message" }] });
394
444
  ```
395
445
 
396
- Default values must be provided as an array of hashs where the key is the
397
- type of translation desired, a `scope` or a `message`. The translation returned
398
- will be either the first scope recognized, or the first message defined.
446
+ Default values must be provided as an array of hashes where the key is the type
447
+ of translation desired, a `scope` or a `message`. The translation returned will
448
+ be either the first scope recognized, or the first message defined.
399
449
 
400
- The translation will fallback to the `defaultValue` translation if no scope
401
- in `defaults` matches and if no default of type `message` is found.
450
+ The translation will fallback to the `defaultValue` translation if no scope in
451
+ `defaults` matches and if no default of type `message` is found.
402
452
 
403
453
  Translation fallback can be enabled by enabling the `I18n.fallbacks` option:
404
454
 
@@ -408,9 +458,9 @@ Translation fallback can be enabled by enabling the `I18n.fallbacks` option:
408
458
  </script>
409
459
  ```
410
460
 
411
- By default missing translations will first be looked for in less
412
- specific versions of the requested locale and if that fails by taking
413
- them from your `I18n.defaultLocale`.
461
+ By default missing translations will first be looked for in less specific
462
+ versions of the requested locale and if that fails by taking them from your
463
+ `I18n.defaultLocale`.
414
464
 
415
465
  ```javascript
416
466
  // if I18n.defaultLocale = "en" and translation doesn't exist
@@ -419,24 +469,28 @@ them from your `I18n.defaultLocale`.
419
469
  I18n.t("some.missing.scope");
420
470
  ```
421
471
 
422
- Custom fallback rules can also be specified for a particular language. There
423
- are three different ways of doing it so:
472
+ Custom fallback rules can also be specified for a particular language. There are
473
+ three different ways of doing it so:
424
474
 
425
475
  ```javascript
426
476
  I18n.locales.no = ["nb", "en"];
427
477
  I18n.locales.no = "nb";
428
- I18n.locales.no = function(locale){ return ["nb"]; };
478
+ I18n.locales.no = function (locale) {
479
+ return ["nb"];
480
+ };
429
481
  ```
430
482
 
483
+ ### Translation Missing Behaviour Control
484
+
431
485
  By default a missing translation will be displayed as
432
486
 
433
487
  [missing "name of scope" translation]
434
488
 
435
- While you are developing or if you do not want to provide a translation
436
- in the default language you can set
489
+ While you are developing or if you do not want to provide a translation in the
490
+ default language you can set
437
491
 
438
492
  ```javascript
439
- I18n.missingBehaviour='guess';
493
+ I18n.missingBehaviour = "guess";
440
494
  ```
441
495
 
442
496
  this will take the last section of your scope and guess the intended value.
@@ -446,28 +500,49 @@ Camel case becomes lower cased text and underscores are replaced with space
446
500
 
447
501
  becomes "what is your favorite Christmas present"
448
502
 
449
- In order to still detect untranslated strings, you can
450
- i18n.missingTranslationPrefix to something like:
503
+ #### Option `missingTranslationPrefix`
504
+
505
+ In order to still detect untranslated strings, you can set
506
+ `I18n.missingTranslationPrefix` to something like:
507
+
451
508
  ```javascript
452
- I18n.missingTranslationPrefix = 'EE: ';
509
+ I18n.missingTranslationPrefix = "EE: ";
453
510
  ```
454
511
 
455
512
  And result will be:
513
+
456
514
  ```javascript
457
- "EE: what is your favorite Christmas present"
515
+ "EE: what is your favorite Christmas present";
516
+
458
517
  ```
459
518
 
460
519
  This will help you doing automated tests against your localisation assets.
461
520
 
462
- Some people prefer returning `null` for missing translation:
521
+ #### Customize return when translation entry missing
522
+
523
+ Some people prefer returning `null`/`undefined` for missing translation:
524
+
463
525
  ```javascript
464
- I18n.missingTranslation = function () { return undefined; };
526
+ I18n.missingTranslation = function (scope, options) {
527
+ return undefined;
528
+ };
465
529
  ```
466
530
 
531
+ ### Option `defaultSeparator` (global) / `separator` (local)
532
+
533
+ Default separator of translation key is `.` (dot)
534
+ Meaning `I18n.t("scope.entry")` would search for translation entry `I18n.translations[locale].scope.entry`
535
+ Using a different separator can be done either globally or locally.
536
+
537
+ Globally: `I18n.defaultSeparator = newSeparator`
538
+ Locally: `I18n.t("full_sentences|Server Busy. Please retry later", {separator: '|'})`
539
+
540
+ ### Pluralization
541
+
467
542
  Pluralization is possible as well and by default provides English rules:
468
543
 
469
544
  ```javascript
470
- I18n.t("inbox.counting", {count: 10}); // You have 10 messages
545
+ I18n.t("inbox.counting", { count: 10 }); // You have 10 messages
471
546
  ```
472
547
 
473
548
  The sample above expects the following translation:
@@ -483,21 +558,34 @@ en:
483
558
 
484
559
  **NOTE:** Rails I18n recognizes the `zero` option.
485
560
 
486
- If you need special rules just define them for your language, for example Russian, just add a new pluralizer:
561
+ If you need special rules just define them for your language, for example
562
+ Russian, just add a new pluralizer:
487
563
 
488
564
  ```javascript
489
565
  I18n.pluralization["ru"] = function (count) {
490
- var key = count % 10 == 1 && count % 100 != 11 ? "one" : [2, 3, 4].indexOf(count % 10) >= 0 && [12, 13, 14].indexOf(count % 100) < 0 ? "few" : count % 10 == 0 || [5, 6, 7, 8, 9].indexOf(count % 10) >= 0 || [11, 12, 13, 14].indexOf(count % 100) >= 0 ? "many" : "other";
566
+ var key =
567
+ count % 10 == 1 && count % 100 != 11
568
+ ? "one"
569
+ : [2, 3, 4].indexOf(count % 10) >= 0 &&
570
+ [12, 13, 14].indexOf(count % 100) < 0
571
+ ? "few"
572
+ : count % 10 == 0 ||
573
+ [5, 6, 7, 8, 9].indexOf(count % 10) >= 0 ||
574
+ [11, 12, 13, 14].indexOf(count % 100) >= 0
575
+ ? "many"
576
+ : "other";
491
577
  return [key];
492
578
  };
493
579
  ```
494
580
 
495
- You can find all rules on <http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html>.
581
+ You can find all rules on
582
+ <https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_plural_rules.html>.
496
583
 
497
- If you're using the same scope over and over again, you may use the `scope` option.
584
+ If you're using the same scope over and over again, you may use the `scope`
585
+ option.
498
586
 
499
587
  ```javascript
500
- var options = {scope: "activerecord.attributes.user"};
588
+ var options = { scope: "activerecord.attributes.user" };
501
589
 
502
590
  I18n.t("name", options);
503
591
  I18n.t("email", options);
@@ -526,14 +614,13 @@ I18n.l("percentage", 123.45);
526
614
  // 123.450%
527
615
  ```
528
616
 
529
- To have more control over number formatting, you can use the
530
- `I18n.toNumber`, `I18n.toPercentage`, `I18n.toCurrency` and `I18n.toHumanSize`
531
- functions.
617
+ To have more control over number formatting, you can use the `I18n.toNumber`,
618
+ `I18n.toPercentage`, `I18n.toCurrency` and `I18n.toHumanSize` functions.
532
619
 
533
620
  ```javascript
534
- I18n.toNumber(1000); // 1,000.000
535
- I18n.toCurrency(1000); // $1,000.00
536
- I18n.toPercentage(100); // 100.000%
621
+ I18n.toNumber(1000); // 1,000.000
622
+ I18n.toCurrency(1000); // $1,000.00
623
+ I18n.toPercentage(100); // 100.000%
537
624
  ```
538
625
 
539
626
  The `toNumber` and `toPercentage` functions accept the following options:
@@ -546,9 +633,9 @@ The `toNumber` and `toPercentage` functions accept the following options:
546
633
  See some number formatting examples:
547
634
 
548
635
  ```javascript
549
- I18n.toNumber(1000, {precision: 0}); // 1,000
550
- I18n.toNumber(1000, {delimiter: ".", separator: ","}); // 1.000,000
551
- I18n.toNumber(1000, {delimiter: ".", precision: 0}); // 1.000
636
+ I18n.toNumber(1000, { precision: 0 }); // 1,000
637
+ I18n.toNumber(1000, { delimiter: ".", separator: "," }); // 1.000,000
638
+ I18n.toNumber(1000, { delimiter: ".", precision: 0 }); // 1.000
552
639
  ```
553
640
 
554
641
  The `toCurrency` function accepts the following options:
@@ -564,7 +651,7 @@ The `toCurrency` function accepts the following options:
564
651
  You can provide only the options you want to override:
565
652
 
566
653
  ```javascript
567
- I18n.toCurrency(1000, {precision: 0}); // $1,000
654
+ I18n.toCurrency(1000, { precision: 0 }); // $1,000
568
655
  ```
569
656
 
570
657
  The `toHumanSize` function accepts the following options:
@@ -574,6 +661,7 @@ The `toHumanSize` function accepts the following options:
574
661
  - `delimiter`: defaults to `""`
575
662
  - `strip_insignificant_zeros`: defaults to `false`
576
663
  - `format`: defaults to `%n%u`
664
+ - `scope`: defaults to `""`
577
665
 
578
666
  <!---->
579
667
 
@@ -582,18 +670,17 @@ I18n.toHumanSize(1234); // 1KB
582
670
  I18n.toHumanSize(1234 * 1024); // 1MB
583
671
  ```
584
672
 
585
-
586
673
  #### Date formatting
587
674
 
588
675
  ```javascript
589
676
  // accepted formats
590
- I18n.l("date.formats.short", "2009-09-18"); // yyyy-mm-dd
591
- I18n.l("time.formats.short", "2009-09-18 23:12:43"); // yyyy-mm-dd hh:mm:ss
592
- I18n.l("time.formats.short", "2009-11-09T18:10:34"); // JSON format with local Timezone (part of ISO-8601)
677
+ I18n.l("date.formats.short", "2009-09-18"); // yyyy-mm-dd
678
+ I18n.l("time.formats.short", "2009-09-18 23:12:43"); // yyyy-mm-dd hh:mm:ss
679
+ I18n.l("time.formats.short", "2009-11-09T18:10:34"); // JSON format with local Timezone (part of ISO-8601)
593
680
  I18n.l("time.formats.short", "2009-11-09T18:10:34Z"); // JSON format in UTC (part of ISO-8601)
594
- I18n.l("date.formats.short", 1251862029000); // Epoch time
595
- I18n.l("date.formats.short", "09/18/2009"); // mm/dd/yyyy
596
- I18n.l("date.formats.short", (new Date())); // Date object
681
+ I18n.l("date.formats.short", 1251862029000); // Epoch time
682
+ I18n.l("date.formats.short", "09/18/2009"); // mm/dd/yyyy
683
+ I18n.l("date.formats.short", new Date()); // Date object
597
684
  ```
598
685
 
599
686
  You can also add placeholders to the date format:
@@ -602,14 +689,16 @@ You can also add placeholders to the date format:
602
689
  I18n.translations["en"] = {
603
690
  date: {
604
691
  formats: {
605
- ordinal_day: "%B %{day}"
606
- }
607
- }
608
- }
609
- I18n.l("date.formats.ordinal_day", "2009-09-18", { day: '18th' }); // Sep 18th
692
+ ordinal_day: "%B %{day}",
693
+ },
694
+ },
695
+ };
696
+
697
+ I18n.l("date.formats.ordinal_day", "2009-09-18", { day: "18th" }); // Sep 18th
610
698
  ```
611
699
 
612
- If you prefer, you can use the `I18n.toTime` and `I18n.strftime` functions to format dates.
700
+ If you prefer, you can use the `I18n.toTime` and `I18n.strftime` functions to
701
+ format dates.
613
702
 
614
703
  ```javascript
615
704
  var date = new Date();
@@ -648,8 +737,10 @@ The accepted formats for `I18n.strftime` are:
648
737
  Check out `spec/*.spec.js` files for more examples!
649
738
 
650
739
  #### Using pluralization and number formatting together
651
- Sometimes you might want to display translation with formatted number, like adding thousand delimiters to displayed number
652
- You can do this:
740
+
741
+ Sometimes you might want to display translation with formatted number, like
742
+ adding thousand delimiters to displayed number You can do this:
743
+
653
744
  ```json
654
745
  {
655
746
  "en": {
@@ -661,153 +752,176 @@ You can do this:
661
752
  }
662
753
  }
663
754
  ```
755
+
664
756
  ```js
665
757
  var point_in_number = 1000;
666
- I18n.t('point', { count: point_in_number, formatted_number: I18n.toNumber(point_in_number) });
758
+ I18n.t("point", {
759
+ count: point_in_number,
760
+ formatted_number: I18n.toNumber(point_in_number),
761
+ });
667
762
  ```
668
- Output should be `1,000 points`
669
763
 
764
+ Output should be `1,000 points`
670
765
 
671
766
  ## Using multiple exported translation files on a page.
672
- This method is useful for very large apps where a single contained translations.js file is not desirable. Examples would be a global translations file and a more specific route translation file.
767
+
768
+ This method is useful for very large apps where a single contained
769
+ translations.js file is not desirable. Examples would be a global translations
770
+ file and a more specific route translation file.
673
771
 
674
772
  ### Rails without asset pipeline
675
- 1. Setup your `config/i18n-js.yml` to have multiple files and try to minimize any overlap.
676
-
677
- ```yaml
678
- sort_translation_keys: true
679
- fallbacks: false
680
-
681
- translations:
682
- + file: "app/assets/javascript/nls/welcome.js"
683
- only:
684
- + '*.welcome.*'
685
-
686
- + file: "app/assets/javascript/nls/albums.js"
687
- only:
688
- + '*.albums.*'
689
-
690
- + file: "app/assets/javascript/nls/global.js"
691
- only:
692
- + '*'
693
- # Exempt any routes specific translations from being
694
- # included in the global translation file
695
- except:
696
- + '*.welcome.*'
697
- + '*.albums.*'
698
- ```
699
- When `rake i18n:js:export` is executed it will create 3 translations files that can be loaded via the `javascript_include_tag`
700
-
701
- 2. Add the `javascript_include_tag` to your layout and to any route specific files that will require it.
702
- ```ruby
703
- # views/layouts/application.html.erb
704
- <%= javascript_include_tag(
705
- "i18n"
706
- "nls/global"
707
- ) %>
708
- ```
709
- and in the route specific
710
-
711
- ```ruby
712
- # views/welcome/index.html.erb
713
- <%= javascript_include_tag(
714
- "nls/welcome"
715
- ) %>
716
- ```
773
+
774
+ 1. Setup your `config/i18n-js.yml` to have multiple files and try to minimize
775
+ any overlap.
776
+
777
+ ```yaml
778
+ sort_translation_keys: true
779
+ fallbacks: false
780
+
781
+ translations:
782
+ + file: "app/assets/javascript/nls/welcome.js"
783
+ only:
784
+ + '*.welcome.*'
785
+
786
+ + file: "app/assets/javascript/nls/albums.js"
787
+ only:
788
+ + '*.albums.*'
789
+
790
+ + file: "app/assets/javascript/nls/global.js"
791
+ only:
792
+ + '*'
793
+ # Exempt any routes specific translations from being
794
+ # included in the global translation file
795
+ except:
796
+ + '*.welcome.*'
797
+ + '*.albums.*'
798
+ ```
799
+
800
+ When `rake i18n:js:export` is executed it will create 3 translations files that
801
+ can be loaded via the `javascript_include_tag`
802
+
803
+ 2. Add the `javascript_include_tag` to your layout and to any route specific
804
+ files that will require it.
805
+
806
+ ```ruby
807
+ # views/layouts/application.html.erb
808
+ <%= javascript_include_tag(
809
+ "i18n"
810
+ "nls/global"
811
+ ) %>
812
+ ```
813
+
814
+ and in the route specific
815
+
816
+ ```ruby
817
+ # views/welcome/index.html.erb
818
+ <%= javascript_include_tag(
819
+ "nls/welcome"
820
+ ) %>
821
+ ```
717
822
 
718
823
  3. Make sure that you add these files to your `config/application.rb`
719
824
 
720
- ```ruby
721
- config.assets.precompile += %w(
722
- i18n
723
- nls/*
724
- )
725
- ```
825
+ ```ruby
826
+ config.assets.precompile += %w(
827
+ i18n
828
+ nls/*
829
+ )
830
+ ```
726
831
 
727
832
  ### Using require.js / r.js
728
833
 
729
834
  To use this with require.js we are only going to change a few things from above.
730
835
 
731
- 1. In your `config/i18n-js.yml` we need to add a better location for the i18n to be exported. You want to use this location so that it can be properly precompiled by r.js.
732
-
733
- ```yaml
734
- export_i18n_js: "app/assets/javascript/nls"
735
- ```
736
-
737
- 2. In your `config/require.yml` we need to add a map, shim all the translations, and include them into the appropriate modules
738
-
739
- ```yaml
740
- # In your maps add (if you do not have this you will need to add it)
741
- map:
742
- '*':
743
- i18n: 'nls/i18n'
744
-
745
- # In your shims
746
- shims:
747
- nls/welcome:
748
- deps:
749
- + i18n
750
-
751
- nls/global:
752
- deps:
753
- + i18n
754
-
755
- # Finally in your modules
756
- modules:
757
- + name: 'application'
758
- include:
759
- + i18n
760
- + 'nls/global'
761
-
762
- + name: 'welcome'
763
- exclude:
764
- + application
765
- include:
766
- + 'nls/welcome'
767
- ```
768
- 3. When `rake assets:precompile` is executed it will optimize the translations into the correct modules so they are loaded with their assigned module, and loading them with requirejs is as simple as requiring any other shim.
769
-
770
- ```javascript
771
- define(['welcome/other_asset','nls/welcome'], function (otherAsset){
772
- // ...
773
- });
774
- ```
775
- 4. (optional) As an additional configuration we can make a task to be run before the requirejs optimizer. This will allow any automated scripts that run the requirejs optimizer to export the strings before we run r.js
776
-
777
- ```rake
778
- # lib/tasks/i18n.rake
779
- Rake::Task[:'i18n:js:export'].prerequisites.clear
780
- task :'i18n:js:export' => :'i18n:js:before_export'
781
- task :'requirejs:precompile:external' => :'i18n:js:export'
782
-
783
- namespace :i18n do
784
- namespace :js do
785
- task :before_export => :'assets:environment' do
786
- I18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{yml,rb}')]
787
- I18n.backend.load_translations
788
- end
836
+ 1. In your `config/i18n-js.yml` we need to add a better location for the i18n to
837
+ be exported to. You want to use this location so that it can be properly
838
+ precompiled by r.js.
839
+
840
+ ```yaml
841
+ export_i18n_js: "app/assets/javascript/nls"
842
+ ```
843
+
844
+ 2. In your `config/require.yml` we need to add a map, shim all the translations,
845
+ and include them into the appropriate modules
846
+
847
+ ```yaml
848
+ # In your maps add (if you do not have this you will need to add it)
849
+ map:
850
+ '*':
851
+ i18n: 'nls/i18n'
852
+
853
+ # In your shims
854
+ shims:
855
+ nls/welcome:
856
+ deps:
857
+ + i18n
858
+
859
+ nls/global:
860
+ deps:
861
+ + i18n
862
+
863
+ # Finally in your modules
864
+ modules:
865
+ + name: 'application'
866
+ include:
867
+ + i18n
868
+ + 'nls/global'
869
+
870
+ + name: 'welcome'
871
+ exclude:
872
+ + application
873
+ include:
874
+ + 'nls/welcome'
875
+ ```
876
+
877
+ 3. When `rake assets:precompile` is executed it will optimize the translations
878
+ into the correct modules so they are loaded with their assigned module, and
879
+ loading them with requirejs is as simple as requiring any other shim.
880
+
881
+ ```javascript
882
+ define(["welcome/other_asset", "nls/welcome"], function (otherAsset) {
883
+ // ...
884
+ });
885
+ ```
886
+
887
+ 4. (optional) As an additional configuration we can make a task to be run before
888
+ the requirejs optimizer. This will allow any automated scripts that run the
889
+ requirejs optimizer to export the strings before we run r.js.
890
+
891
+ ```rake
892
+ # lib/tasks/i18n.rake
893
+ Rake::Task[:'i18n:js:export'].prerequisites.clear
894
+ task :'i18n:js:export' => :'i18n:js:before_export'
895
+ task :'requirejs:precompile:external' => :'i18n:js:export'
896
+
897
+ namespace :i18n do
898
+ namespace :js do
899
+ task :before_export => :'assets:environment' do
900
+ I18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{yml,rb}')]
901
+ I18n.backend.load_translations
789
902
  end
790
903
  end
791
- ```
904
+ end
905
+ ```
792
906
 
793
907
  ## Using I18n.js with other languages (Python, PHP, ...)
794
908
 
795
- The JavaScript library is language agnostic; so you can use it with PHP, Python, [your favorite language here].
796
- The only requirement is that you need to set the `translations` attribute like following:
909
+ The JavaScript library is language agnostic; so you can use it with PHP, Python,
910
+ [your favorite language here]. The only requirement is that you need to set the
911
+ `translations` attribute like following:
797
912
 
798
913
  ```javascript
799
914
  I18n.translations = {};
800
915
 
801
916
  I18n.translations["en"] = {
802
- message: "Some special message for you"
803
- }
917
+ message: "Some special message for you",
918
+ };
804
919
 
805
920
  I18n.translations["pt-BR"] = {
806
- message: "Uma mensagem especial para você"
807
- }
921
+ message: "Uma mensagem especial para você",
922
+ };
808
923
  ```
809
924
 
810
-
811
925
  ## Known Issues
812
926
 
813
927
  ### Missing translations in precompiled file(s) after adding any new locale file
@@ -815,66 +929,80 @@ I18n.translations["pt-BR"] = {
815
929
  Due to the design of `sprockets`:
816
930
 
817
931
  - `depend_on` only takes file paths, not directory paths
818
- - registered `preprocessors` are only run when the fingerprint of any asset file, including `.erb` files, is changed
932
+ - registered `preprocessors` are only run when the fingerprint of any asset
933
+ file, including `.erb` files, is changed
934
+
935
+ This means that new locale files will not be detected, and so they will not
936
+ trigger a i18n-js refresh. There are a few approaches to work around this:
819
937
 
820
- This means that new locale files will not be detected, and so they will not trigger a i18n-js refresh. There are a few approaches to work around this:
938
+ 1. You can force i18n-js to update its translations by completely clearing the
939
+ assets cache. Use one of the following:
821
940
 
822
- 1. You can force i18n-js to update its translations by completely clearing the assets cache. Use one of the following:
823
-
824
941
  ```bash
825
942
  $ rake assets:clobber
826
943
  # Or, with older versions of Rails:
827
944
  $ rake tmp:cache:clear
828
945
  ```
829
946
 
830
- These commands will remove *all* fingerprinted assets, and you will have to recompile them with
947
+ These commands will remove _all_ fingerprinted assets, and you will have to
948
+ recompile them with
831
949
 
832
950
  ```bash
833
951
  $ rake assets:precompile
834
952
  ```
835
953
 
836
- or similar commands. If you are precompiling assets on the target machine(s), cached pages may be broken by this, so they will need to be refreshed.
954
+ or similar commands. If you are precompiling assets on the target machine(s),
955
+ cached pages may be broken by this, so they will need to be refreshed.
837
956
 
838
957
  2. You can change something in a different locale file.
839
958
 
840
959
  3. Finally, you can change `config.assets.version`.
841
960
 
842
- **Note:** See issue [#213](https://github.com/fnando/i18n-js/issues/213) for more details and discussion of this issue.
961
+ **Note:** See issue [#213](https://github.com/fnando/i18n-js/issues/213) for
962
+ more details and discussion of this issue.
843
963
 
844
964
  ### Translations in JS are not updated when Sprockets not loaded before this gem
845
965
 
846
- The "rails engine" declaration will try to detect existence of "sprockets" before adding the initailizer
847
- If sprockets is loaded after this gem, the preprocessor for
848
- making JS translations file cache to depend on content of locale files will not be hooked.
849
- So ensure sprockets is loaded before this gem like moving entry of sprockets in Gemfile or adding "require" statements for sprockets somewhere.
966
+ The "rails engine" declaration will try to detect existence of "sprockets"
967
+ before adding the initailizer If sprockets is loaded after this gem, the
968
+ preprocessor for making JS translations file cache to depend on content of
969
+ locale files will not be hooked. So ensure sprockets is loaded before this gem
970
+ by moving the entry of sprockets in the Gemfile or adding "require" statements
971
+ for sprockets somewhere.
850
972
 
851
- **Note:** See issue [#404](https://github.com/fnando/i18n-js/issues/404) for more details and discussion of this issue.
973
+ **Note:** See issue [#404](https://github.com/fnando/i18n-js/issues/404) for
974
+ more details and discussion of this issue.
852
975
 
853
976
  ### JS `I18n.toCurrency` & `I18n.toNumber` cannot handle large integers
854
977
 
855
- The above methods use `toFixed` and it only supports 53 bit integers.
856
- Ref: http://2ality.com/2012/07/large-integers.html
978
+ The above methods use `toFixed` and it only supports 53 bit integers. Ref:
979
+ http://2ality.com/2012/07/large-integers.html
857
980
 
858
- Feel free to find & discuss possible solution(s) at issue [#511](https://github.com/fnando/i18n-js/issues/511)
981
+ Feel free to find & discuss possible solution(s) at issue
982
+ [#511](https://github.com/fnando/i18n-js/issues/511)
859
983
 
860
984
  ### Only works with `Simple` backend
861
985
 
862
- If you set `I18n.backend` to something other than the default `Simple` backend, you will likely get an exception like this:
986
+ If you set `I18n.backend` to something other than the default `Simple` backend,
987
+ you will likely get an exception like this:
863
988
 
864
989
  ```
865
990
  Undefined method 'initialized?' for <your backend class>
866
991
  ```
867
992
 
868
- For now, i18n-js is only compatible with the `Simple` backend.
869
- If you need a more sophisticated backend for your rails application, like `I18n::Backend::ActiveRecord`, you can setup i18n-js to get translations from a separate `Simple` backend, by adding the following in an initializer:
993
+ For now, i18n-js is only compatible with the `Simple` backend. If you need a
994
+ more sophisticated backend for your rails application, like
995
+ `I18n::Backend::ActiveRecord`, you can setup i18n-js to get translations from a
996
+ separate `Simple` backend, by adding the following in an initializer:
870
997
 
871
998
  ```ruby
872
999
  I18n::JS.backend = I18n.backend
873
1000
  I18n.backend = I18n::Backend::Chain.new(<your other backend(s)>, I18n.backend)
874
1001
  ```
875
1002
 
876
- This will use your backend with the default `Simple` backend as fallback, while i18n-js only sees and uses the simple backend.
877
- This means however, that only translations from your static locale files will be present in JavaScript.
1003
+ This will use your backend with the default `Simple` backend as fallback, while
1004
+ i18n-js only sees and uses the simple backend. This means however, that only
1005
+ translations from your static locale files will be present in JavaScript.
878
1006
 
879
1007
  If you do cannot use a `Chain`-Backend for some reason, you can also set
880
1008
 
@@ -883,9 +1011,11 @@ I18n::JS.backend = I18n::Backend::Simple.new
883
1011
  I18n.backend = <something different>
884
1012
  ```
885
1013
 
886
- However, the automatic reloading of translations in developement will not work in this case.
887
- This is because Rails calls `I18n.reload!` for each request in development, but `reload!` will not be called on `I18n::JS.backend`, since it is a different object.
888
- One option would be to patch `I18n.reload!` in an initializer:
1014
+ However, the automatic reloading of translations in developement will not work
1015
+ in this case. This is because Rails calls `I18n.reload!` for each request in
1016
+ development, but `reload!` will not be called on `I18n::JS.backend`, since it is
1017
+ a different object. One option would be to patch `I18n.reload!` in an
1018
+ initializer:
889
1019
 
890
1020
  ```ruby
891
1021
  module I18n
@@ -896,11 +1026,12 @@ module I18n
896
1026
  end
897
1027
  ```
898
1028
 
899
- See issue [#428](https://github.com/fnando/i18n-js/issues/428) for more details and discussion of this issue.
1029
+ See issue [#428](https://github.com/fnando/i18n-js/issues/428) for more details
1030
+ and discussion of this issue.
900
1031
 
901
1032
  ## Maintainer
902
1033
 
903
- - Nando Vieira - <http://nandovieira.com.br>
1034
+ - Nando Vieira - <http://nandovieira.com>
904
1035
 
905
1036
  ## Contributing
906
1037
 
@@ -908,13 +1039,14 @@ Once you've made your great commits:
908
1039
 
909
1040
  1. [Fork](http://help.github.com/forking/) I18n.js
910
1041
  2. Create a branch with a clear name
911
- 3. Make your changes (Please also add/change spec, README and CHANGELOG if applicable)
1042
+ 3. Make your changes (Please also add/change spec, README and CHANGELOG if
1043
+ applicable)
912
1044
  4. Push changes to the created branch
913
1045
  5. [Create an Pull Request](http://github.com/fnando/i18n-js/pulls)
914
1046
  6. That's it!
915
1047
 
916
- Please respect the indentation rules and code style.
917
- And use 2 spaces, not tabs. And don't touch the versioning thing.
1048
+ Please respect the indentation rules and code style. And use 2 spaces, not tabs.
1049
+ And don't touch the versioning thing.
918
1050
 
919
1051
  ## Running tests
920
1052
 
@@ -936,21 +1068,19 @@ You can run both Ruby and JavaScript specs with `rake spec`.
936
1068
 
937
1069
  (The MIT License)
938
1070
 
939
- Permission is hereby granted, free of charge, to any person obtaining
940
- a copy of this software and associated documentation files (the
941
- 'Software'), to deal in the Software without restriction, including
942
- without limitation the rights to use, copy, modify, merge, publish,
943
- distribute, sublicense, and/or sell copies of the Software, and to
944
- permit persons to whom the Software is furnished to do so, subject to
945
- the following conditions:
946
-
947
- The above copyright notice and this permission notice shall be
948
- included in all copies or substantial portions of the Software.
949
-
950
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
951
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
952
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
953
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
954
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
955
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
956
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1071
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
1072
+ this software and associated documentation files (the 'Software'), to deal in
1073
+ the Software without restriction, including without limitation the rights to
1074
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
1075
+ the Software, and to permit persons to whom the Software is furnished to do so,
1076
+ subject to the following conditions:
1077
+
1078
+ The above copyright notice and this permission notice shall be included in all
1079
+ copies or substantial portions of the Software.
1080
+
1081
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1082
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
1083
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
1084
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
1085
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1086
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.