i18n-js 3.9.0 → 4.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +4 -0
  3. data/.github/FUNDING.yml +1 -1
  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 -553
  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 +86 -1041
  17. data/Rakefile +10 -20
  18. data/exe/i18n +5 -0
  19. data/i18n-js.gemspec +47 -29
  20. data/lib/guard/i18n-js/templates/Guardfile +10 -0
  21. data/lib/guard/i18n-js/version.rb +13 -0
  22. data/lib/guard/i18n-js.rb +78 -0
  23. data/lib/i18n-js/cli/command.rb +43 -0
  24. data/lib/i18n-js/cli/export_command.rb +108 -0
  25. data/lib/i18n-js/cli/init_command.rb +50 -0
  26. data/lib/i18n-js/cli/ui.rb +30 -0
  27. data/lib/i18n-js/cli/version_command.rb +18 -0
  28. data/lib/i18n-js/cli.rb +47 -0
  29. data/lib/i18n-js/listen.rb +80 -0
  30. data/lib/i18n-js/schema.rb +92 -0
  31. data/lib/i18n-js/version.rb +5 -0
  32. data/lib/i18n-js.rb +66 -1
  33. metadata +122 -196
  34. data/.editorconfig +0 -24
  35. data/.github/workflows/tests.yaml +0 -100
  36. data/.npmignore +0 -27
  37. data/Appraisals +0 -44
  38. data/app/assets/javascripts/i18n/filtered.js.erb +0 -23
  39. data/app/assets/javascripts/i18n/shims.js +0 -240
  40. data/app/assets/javascripts/i18n/translations.js +0 -3
  41. data/app/assets/javascripts/i18n.js +0 -1095
  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/i18njs.png +0 -0
  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 -39
  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/config_store.rb +0 -31
  64. data/lib/i18n/js/private/hash_with_symbol_keys.rb +0 -36
  65. data/lib/i18n/js/segment.rb +0 -81
  66. data/lib/i18n/js/utils.rb +0 -91
  67. data/lib/i18n/js/version.rb +0 -7
  68. data/lib/i18n/js.rb +0 -274
  69. data/lib/rails/generators/i18n/js/config/config_generator.rb +0 -19
  70. data/lib/rails/generators/i18n/js/config/templates/i18n-js.yml +0 -27
  71. data/lib/tasks/export.rake +0 -8
  72. data/package.json +0 -25
  73. data/spec/fixtures/custom_path.yml +0 -5
  74. data/spec/fixtures/default.yml +0 -5
  75. data/spec/fixtures/erb.yml +0 -5
  76. data/spec/fixtures/except_condition.yml +0 -7
  77. data/spec/fixtures/js_available_locales_custom.yml +0 -1
  78. data/spec/fixtures/js_export_dir_custom.yml +0 -7
  79. data/spec/fixtures/js_export_dir_none.yml +0 -6
  80. data/spec/fixtures/js_extend_parent.yml +0 -6
  81. data/spec/fixtures/js_extend_segment.yml +0 -6
  82. data/spec/fixtures/js_file_per_locale.yml +0 -7
  83. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_default_locale_symbol.yml +0 -4
  84. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_hash.yml +0 -6
  85. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_locale.yml +0 -4
  86. data/spec/fixtures/js_file_per_locale_with_fallbacks_as_locale_without_fallback_translations.yml +0 -4
  87. data/spec/fixtures/js_file_per_locale_with_fallbacks_enabled.yml +0 -4
  88. data/spec/fixtures/js_file_per_locale_without_fallbacks.yml +0 -4
  89. data/spec/fixtures/js_file_with_namespace_prefix_and_pretty_print.yml +0 -9
  90. data/spec/fixtures/js_sort_translation_keys_false.yml +0 -6
  91. data/spec/fixtures/js_sort_translation_keys_true.yml +0 -6
  92. data/spec/fixtures/json_only.yml +0 -18
  93. data/spec/fixtures/locales.yml +0 -133
  94. data/spec/fixtures/merge_plurals.yml +0 -6
  95. data/spec/fixtures/merge_plurals_with_no_overrides.yml +0 -4
  96. data/spec/fixtures/merge_plurals_with_partial_overrides.yml +0 -4
  97. data/spec/fixtures/millions.yml +0 -4
  98. data/spec/fixtures/multiple_conditions.yml +0 -7
  99. data/spec/fixtures/multiple_conditions_per_locale.yml +0 -7
  100. data/spec/fixtures/multiple_files.yml +0 -7
  101. data/spec/fixtures/no_config.yml +0 -2
  102. data/spec/fixtures/no_scope.yml +0 -4
  103. data/spec/fixtures/simple_scope.yml +0 -5
  104. data/spec/js/currency.spec.js +0 -62
  105. data/spec/js/current_locale.spec.js +0 -19
  106. data/spec/js/dates.spec.js +0 -276
  107. data/spec/js/defaults.spec.js +0 -31
  108. data/spec/js/extend.spec.js +0 -110
  109. data/spec/js/interpolation.spec.js +0 -124
  110. data/spec/js/jasmine/MIT.LICENSE +0 -20
  111. data/spec/js/jasmine/jasmine-html.js +0 -190
  112. data/spec/js/jasmine/jasmine.css +0 -166
  113. data/spec/js/jasmine/jasmine.js +0 -2476
  114. data/spec/js/jasmine/jasmine_favicon.png +0 -0
  115. data/spec/js/json_parsable.spec.js +0 -14
  116. data/spec/js/locales.spec.js +0 -31
  117. data/spec/js/localization.spec.js +0 -78
  118. data/spec/js/numbers.spec.js +0 -174
  119. data/spec/js/placeholder.spec.js +0 -24
  120. data/spec/js/pluralization.spec.js +0 -219
  121. data/spec/js/prepare_options.spec.js +0 -41
  122. data/spec/js/require.js +0 -2083
  123. data/spec/js/specs.html +0 -49
  124. data/spec/js/specs_requirejs.html +0 -72
  125. data/spec/js/translate.spec.js +0 -304
  126. data/spec/js/translations.js +0 -188
  127. data/spec/js/utility_functions.spec.js +0 -20
  128. data/spec/ruby/i18n/js/fallback_locales_spec.rb +0 -84
  129. data/spec/ruby/i18n/js/segment_spec.rb +0 -286
  130. data/spec/ruby/i18n/js/utils_spec.rb +0 -138
  131. data/spec/ruby/i18n/js_spec.rb +0 -797
  132. data/spec/spec_helper.rb +0 -80
  133. data/yarn.lock +0 -138
data/README.md CHANGED
@@ -1,1097 +1,142 @@
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>
1
+ # i18n-js
4
2
 
5
- <p align="center">
6
- It's a small library to provide the Rails I18n translations on the JavaScript.
7
- </p>
3
+ [![Tests](https://github.com/fnando/i18n-js/workflows/ruby-tests/badge.svg)](https://github.com/fnando/i18n-js)
4
+ [![Code Climate](https://codeclimate.com/github/fnando/i18n-js/badges/gpa.svg)](https://codeclimate.com/github/fnando/i18n-js)
5
+ [![Gem](https://img.shields.io/gem/v/i18n-js.svg)](https://rubygems.org/gems/i18n-js)
6
+ [![Gem](https://img.shields.io/gem/dt/i18n-js.svg)](https://rubygems.org/gems/i18n-js)
8
7
 
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>
8
+ Export [i18n](https://rubygems.org/gems/i18n) translations to JSON. A perfect
9
+ fit if you want to export translations to JavaScript.
18
10
 
19
- ---
20
-
21
- Features:
22
-
23
- - Pluralization
24
- - Date/Time localization
25
- - Number localization
26
- - Locale fallback
27
- - Asset pipeline support
28
- - Lots more! :)
29
-
30
- ## Version Notice
31
-
32
- The `main` branch (including this README) is for latest `3.0.0` instead of
33
- `2.x`.
34
-
35
- ## Usage
36
-
37
- ### Installation
38
-
39
- #### Rails app
40
-
41
- Add the gem to your Gemfile.
42
-
43
- ```ruby
44
- gem "i18n-js"
45
- ```
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
-
62
- #### Rails app with [Asset Pipeline](http://guides.rubyonrails.org/asset_pipeline.html)
63
-
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`.
67
-
68
- ```javascript
69
- //
70
- // This is optional (in case you have `I18n is not defined` error)
71
- // If you want to put this line, you must put it BEFORE `i18n/translations`
72
- //= require i18n
73
- // Some people even need to add the extension to make it work, see https://github.com/fnando/i18n-js/issues/283
74
- //= require i18n.js
75
- //
76
- // This is a must
77
- //= require i18n/translations
78
- ```
79
-
80
- #### Rails app without [Asset Pipeline](http://guides.rubyonrails.org/asset_pipeline.html)
81
-
82
- First, put this in your `application.html` (layout file). Then get the JS files
83
- following the instructions below.
84
-
85
- ```erb
86
- <%# This is just an example, you can put `i18n.js` and `translations.js` anywhere you like %>
87
- <%# Unlike the Asset Pipeline example, you need to require both **in order** %>
88
- <%= javascript_include_tag "i18n" %>
89
- <%= javascript_include_tag "translations", skip_pipeline: true %>
90
- ```
91
-
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.
106
-
107
- #### Export Configuration (For translations)
108
-
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`.
116
-
117
- Examples:
118
-
119
- ```yaml
120
- translations:
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"]
125
- ```
126
-
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
-
131
- ```yaml
132
- translations:
133
- - file: "public/javascripts/en.js"
134
- only: "en.*"
135
- - file: "public/javascripts/pt-BR.js"
136
- only: "pt-BR.*"
137
- ```
138
-
139
- Optionally, you can auto generate a translation file per available locale if you
140
- specify the `%{locale}` placeholder.
141
-
142
- ```yaml
143
- translations:
144
- - file: "public/javascripts/i18n/%{locale}.js"
145
- only: "*"
146
- - file: "public/javascripts/frontend/i18n/%{locale}.js"
147
- only: ["*.frontend", "*.users.*"]
148
- ```
149
-
150
- You can also include ERB in your config file.
151
-
152
- ```yaml
153
- translations:
154
- <% Widgets.each do |widget| %>
155
- - file: <%= "'#{widget.file}'" %>
156
- only: <%= "'#{widget.only}'" %>
157
- <% end %>
158
- ```
159
-
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:
164
-
165
- ```yaml
166
- translations:
167
- - except: ["*.active_admin", "*.ransack", "*.activerecord.errors"]
168
- ```
169
-
170
- #### Export Configuration (For other things)
171
-
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
174
-
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`
180
- - Any non-`String` (`nil`, `false`, `:none`, etc): Disable `i18n.js` exporting
181
-
182
- - `I18n::JS.sort_translation_keys` Expected Type: `Boolean` Default: `true`
183
- Behaviour:
184
-
185
- - Sets whether or not to deep sort all translation keys in order to generate
186
- identical output for the same translations
187
- - Set to true to ensure identical asset fingerprints for the asset pipeline
188
-
189
- - You may also set `export_i18n_js` and `sort_translation_keys` in your config
190
- file, e.g.:
191
-
192
- ```yaml
193
- export_i18n_js: false
194
- # OR
195
- export_i18n_js: "my/path"
196
-
197
- sort_translation_keys: false
198
-
199
- translations:
200
- - ...
201
- ```
202
-
203
- To find more examples on how to use the configuration file please refer to the
204
- tests.
205
-
206
- #### Fallbacks
207
-
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`.
210
-
211
- Examples:
212
-
213
- ```yaml
214
- fallbacks: true
215
-
216
- translations:
217
- - file: "public/javascripts/i18n/%{locale}.js"
218
- only: "*"
219
- ```
220
-
221
- This will enable merging fallbacks into each file. (set to `false` to disable).
222
- If you use `I18n` with fallbacks, the fallbacks defined there will be used.
223
- Otherwise `I18n.default_locale` will be used.
224
-
225
- ```yaml
226
- fallbacks: :de
227
-
228
- translations:
229
- - file: "public/javascripts/i18n/%{locale}.js"
230
- only: "*"
231
- ```
232
-
233
- Here, the specified locale `:de` will be used as fallback for all locales.
234
-
235
- ```yaml
236
- fallbacks:
237
- fr: ["de", "en"]
238
- de: "en"
239
-
240
- translations:
241
- - file: "public/javascripts/i18n/%{locale}.js"
242
- only: "*"
243
- ```
244
-
245
- Fallbacks defined will be used, if not defined (e.g. `:pl`) `I18n.fallbacks` or
246
- `I18n.default_locale` will be used.
247
-
248
- ```yaml
249
- fallbacks: :default_locale
250
-
251
- translations:
252
- - file: "public/javascripts/i18n/%{locale}.js"
253
- only: "*"
254
- ```
255
-
256
- Setting the option to `:default_locale` will enforce the fallback to use the
257
- `I18n.default_locale`, ignoring `I18n.fallbacks`.
258
-
259
- Examples:
260
-
261
- ```yaml
262
- fallbacks: false
263
-
264
- translations:
265
- - file: "public/javascripts/i18n/%{locale}.js"
266
- only: "*"
267
- ```
268
-
269
- You must disable this feature by setting the option to `false`.
270
-
271
- To find more examples on how to use the configuration file please refer to the
272
- tests.
273
-
274
- #### Available locales
275
-
276
- By specifying option `js_available_locales` with a list of locales, this list
277
- would be used instead of default `I18n.available_locales` to generate translations.
278
-
279
- Example:
280
-
281
- ```yaml
282
- js_available_locales: ["de", "en"]
283
- ```
284
-
285
- #### Namespace
286
-
287
- Setting the `namespace` option will change the namespace of the output
288
- Javascript file to something other than `I18n`. This can be useful in
289
- no-conflict scenarios. Example:
290
-
291
- ```yaml
292
- translations:
293
- - file: "public/javascripts/i18n/translations.js"
294
- namespace: "MyNamespace"
295
- ```
296
-
297
- will create:
298
-
299
- ```
300
- MyNamespace.translations || (MyNamespace.translations = {});
301
- MyNamespace.translations["en"] = { ... }
302
- ```
303
-
304
- ### Adding prefix & suffix to the translations file(s)
305
-
306
- Setting the `prefix: "import I18n from 'i18n-js';\n"` option will add the line
307
- at the beginning of the resultant translation file. This can be useful to use
308
- this gem with the [i18n-js](https://www.npmjs.com/package/i18n-js) npm package,
309
- which is quite useful to use it with webpack. The user should provide the
310
- semi-colon and the newline character if needed.
311
-
312
- For example:
313
-
314
- ```yaml
315
- translations:
316
- - file: "public/javascripts/i18n/translations.js"
317
- prefix: "import I18n from 'i18n-js';\n"
318
- ```
319
-
320
- will create:
321
-
322
- ```
323
- import I18n from 'i18n-js';
324
- I18n.translations || (I18n.translations = {});
325
- ```
326
-
327
- `suffix` option is added in https://github.com/fnando/i18n-js/pull/561.
328
- It's similar to `prefix` so won't explain it in details.
329
-
330
- #### Pretty Print
331
-
332
- Set the `pretty_print` option if you would like whitespace and indentation in
333
- your output file (default: false)
334
-
335
- ```yaml
336
- translations:
337
- - file: "public/javascripts/i18n/translations.js"
338
- pretty_print: true
339
- ```
340
-
341
- #### Javascript Deep Merge (:js_extend option)
342
-
343
- By default, the output file Javascript will call the `I18n.extend` method to
344
- ensure that newly loaded locale files are deep-merged with any locale data
345
- already in memory. To disable this either globally or per-file, set the
346
- `js_extend` option to false
347
-
348
- ```yaml
349
- js_extend: false # this will disable Javascript I18n.extend globally
350
- translations:
351
- - file: "public/javascripts/i18n/translations.js"
352
- js_extend: false # this will disable Javascript I18n.extend for this file
353
- ```
354
-
355
- #### Vanilla JavaScript
356
-
357
- Just add the `i18n.js` file to your page. You'll have to build the translations
358
- object by hand or using your favorite programming language. More info below.
359
-
360
- #### Via NPM with webpack and CommonJS
361
-
362
- Add the following line to your package.json dependencies where version is the
363
- version you want:
364
-
365
- ```javascript
366
- "i18n-js": "{version_constraint}"
367
-
368
- // Or if you want unreleased version
369
- // npm install requires it to be the gzipped tarball, see [npm install](https://www.npmjs.org/doc/cli/npm-install.html)
370
- "i18n-js": "https://github.com/fnando/i18n-js/archive/{tag_name_or_branch_name_or_commit_sha}.tar.gz"
371
- ```
372
-
373
- Run npm install then use via
374
-
375
- ```javascript
376
- var i18n = require("i18n-js");
377
- ```
378
-
379
- ### Setting up
380
-
381
- You **don't** need to set up a thing. The default settings will work just okay.
382
- But if you want to split translations into several files or specify contexts,
383
- you can follow the rest of this setting up section.
384
-
385
- Set your locale is easy as
386
-
387
- ```javascript
388
- I18n.defaultLocale = "pt-BR";
389
- I18n.locale = "pt-BR";
390
- I18n.currentLocale();
391
- // pt-BR
392
- ```
393
-
394
- **NOTE:** You can now apply your configuration **before I18n** is loaded like
395
- this:
396
-
397
- ```javascript
398
- I18n = {}; // You must define this object in top namespace, which should be `window`
399
- I18n.defaultLocale = "pt-BR";
400
- I18n.locale = "pt-BR";
401
-
402
- // Load I18n from `i18n.js`, `application.js` or whatever
403
-
404
- I18n.currentLocale();
405
- // pt-BR
406
- ```
407
-
408
- In practice, you'll have something like the following in your
409
- `application.html.erb`:
410
-
411
- ```erb
412
- <script type="text/javascript">
413
- I18n.defaultLocale = "<%= I18n.default_locale %>";
414
- I18n.locale = "<%= I18n.locale %>";
415
- </script>
416
- ```
417
-
418
- You can use translate your messages:
419
-
420
- ```javascript
421
- I18n.t("some.scoped.translation");
422
- // or translate with explicit setting of locale
423
- I18n.t("some.scoped.translation", { locale: "fr" });
424
- ```
425
-
426
- You can also interpolate values:
427
-
428
- ```javascript
429
- // You need the `translations` object setup first
430
- I18n.translations["en"] = {
431
- greeting: "Hello %{name}",
432
- };
433
-
434
- I18n.t("greeting", { name: "John Doe" });
435
- ```
436
-
437
- You can set default values for missing scopes:
438
-
439
- ```javascript
440
- // simple translation
441
- I18n.t("some.missing.scope", { defaultValue: "A default message" });
442
-
443
- // with interpolation
444
- I18n.t("noun", { defaultValue: "I'm a {{noun}}", noun: "Mac" });
445
- ```
446
-
447
- You can also provide a list of default fallbacks for missing scopes:
448
-
449
- ```javascript
450
- // As a scope
451
- I18n.t("some.missing.scope", { defaults: [{ scope: "some.existing.scope" }] });
452
-
453
- // As a simple translation
454
- I18n.t("some.missing.scope", { defaults: [{ message: "Some message" }] });
455
- ```
11
+ Oh, you don't use Ruby? No problem! You can still use i18n-js and the
12
+ [companion JavaScript package](https://npmjs.com/package/i18n-js).
456
13
 
457
- Default values must be provided as an array of hashes where the key is the type
458
- of translation desired, a `scope` or a `message`. The translation returned will
459
- be either the first scope recognized, or the first message defined.
14
+ ## Installation
460
15
 
461
- The translation will fallback to the `defaultValue` translation if no scope in
462
- `defaults` matches and if no default of type `message` is found.
463
-
464
- Translation fallback can be enabled by enabling the `I18n.fallbacks` option:
465
-
466
- ```erb
467
- <script type="text/javascript">
468
- I18n.fallbacks = true;
469
- </script>
470
- ```
471
-
472
- By default missing translations will first be looked for in less specific
473
- versions of the requested locale and if that fails by taking them from your
474
- `I18n.defaultLocale`.
475
-
476
- ```javascript
477
- // if I18n.defaultLocale = "en" and translation doesn't exist
478
- // for I18n.locale = "de-DE" this key will be taken from "de" locale scope
479
- // or, if that also doesn't exist, from "en" locale scope
480
- I18n.t("some.missing.scope");
481
- ```
482
-
483
- Custom fallback rules can also be specified for a particular language. There are
484
- three different ways of doing it so:
485
-
486
- ```javascript
487
- I18n.locales.no = ["nb", "en"];
488
- I18n.locales.no = "nb";
489
- I18n.locales.no = function (locale) {
490
- return ["nb"];
491
- };
492
- ```
493
-
494
- ### Translation Missing Behaviour Control
495
-
496
- By default a missing translation will be displayed as
497
-
498
- [missing "name of scope" translation]
499
-
500
- While you are developing or if you do not want to provide a translation in the
501
- default language you can set
502
-
503
- ```javascript
504
- I18n.missingBehaviour = "guess";
505
- ```
506
-
507
- this will take the last section of your scope and guess the intended value.
508
- Camel case becomes lower cased text and underscores are replaced with space
509
-
510
- questionnaire.whatIsYourFavorite_ChristmasPresent
511
-
512
- becomes "what is your favorite Christmas present"
513
-
514
- #### Option `missingTranslationPrefix`
515
-
516
- In order to still detect untranslated strings, you can set
517
- `I18n.missingTranslationPrefix` to something like:
518
-
519
- ```javascript
520
- I18n.missingTranslationPrefix = "EE: ";
521
- ```
522
-
523
- And result will be:
524
-
525
- ```javascript
526
- "EE: what is your favorite Christmas present";
527
-
528
- ```
529
-
530
- This will help you doing automated tests against your localisation assets.
531
-
532
- #### Customize return when translation entry missing
533
-
534
- Some people prefer returning `null`/`undefined` for missing translation:
535
-
536
- ```javascript
537
- I18n.missingTranslation = function (scope, options) {
538
- return undefined;
539
- };
540
- ```
541
-
542
- ### Option `defaultSeparator` (global) / `separator` (local)
543
-
544
- Default separator of translation key is `.` (dot)
545
- Meaning `I18n.t("scope.entry")` would search for translation entry `I18n.translations[locale].scope.entry`
546
- Using a different separator can be done either globally or locally.
547
-
548
- Globally: `I18n.defaultSeparator = newSeparator`
549
- Locally: `I18n.t("full_sentences|Server Busy. Please retry later", {separator: '|'})`
550
-
551
- ### Pluralization
552
-
553
- Pluralization is possible as well and by default provides English rules:
554
-
555
- ```javascript
556
- I18n.t("inbox.counting", { count: 10 }); // You have 10 messages
557
- ```
558
-
559
- The sample above expects the following translation:
560
-
561
- ```yaml
562
- en:
563
- inbox:
564
- counting:
565
- one: You have 1 new message
566
- other: You have {{count}} new messages
567
- zero: You have no messages
568
- ```
569
-
570
- **NOTE:** Rails I18n recognizes the `zero` option.
571
-
572
- If you need special rules just define them for your language, for example
573
- Russian, just add a new pluralizer:
574
-
575
- ```javascript
576
- I18n.pluralization["ru"] = function (count) {
577
- var key =
578
- count % 10 == 1 && count % 100 != 11
579
- ? "one"
580
- : [2, 3, 4].indexOf(count % 10) >= 0 &&
581
- [12, 13, 14].indexOf(count % 100) < 0
582
- ? "few"
583
- : count % 10 == 0 ||
584
- [5, 6, 7, 8, 9].indexOf(count % 10) >= 0 ||
585
- [11, 12, 13, 14].indexOf(count % 100) >= 0
586
- ? "many"
587
- : "other";
588
- return [key];
589
- };
590
- ```
591
-
592
- You can find all rules on
593
- <https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_plural_rules.html>.
594
-
595
- If you're using the same scope over and over again, you may use the `scope`
596
- option.
597
-
598
- ```javascript
599
- var options = { scope: "activerecord.attributes.user" };
600
-
601
- I18n.t("name", options);
602
- I18n.t("email", options);
603
- I18n.t("username", options);
604
- ```
605
-
606
- You can also provide an array as scope.
607
-
608
- ```javascript
609
- // use the greetings.hello scope
610
- I18n.t(["greetings", "hello"]);
611
- ```
612
-
613
- #### Number formatting
614
-
615
- Similar to Rails helpers, you have localized number and currency formatting.
616
-
617
- ```javascript
618
- I18n.l("currency", 1990.99);
619
- // $1,990.99
620
-
621
- I18n.l("number", 1990.99);
622
- // 1,990.99
623
-
624
- I18n.l("percentage", 123.45);
625
- // 123.450%
626
- ```
627
-
628
- To have more control over number formatting, you can use the `I18n.toNumber`,
629
- `I18n.toPercentage`, `I18n.toCurrency` and `I18n.toHumanSize` functions.
630
-
631
- ```javascript
632
- I18n.toNumber(1000); // 1,000.000
633
- I18n.toCurrency(1000); // $1,000.00
634
- I18n.toPercentage(100); // 100.000%
635
- ```
636
-
637
- The `toNumber` and `toPercentage` functions accept the following options:
638
-
639
- - `precision`: defaults to `3`
640
- - `separator`: defaults to `.`
641
- - `delimiter`: defaults to `,`
642
- - `strip_insignificant_zeros`: defaults to `false`
643
-
644
- See some number formatting examples:
645
-
646
- ```javascript
647
- I18n.toNumber(1000, { precision: 0 }); // 1,000
648
- I18n.toNumber(1000, { delimiter: ".", separator: "," }); // 1.000,000
649
- I18n.toNumber(1000, { delimiter: ".", precision: 0 }); // 1.000
650
- ```
651
-
652
- The `toCurrency` function accepts the following options:
653
-
654
- - `precision`: sets the level of precision
655
- - `separator`: sets the separator between the units
656
- - `delimiter`: sets the thousands delimiter
657
- - `format`: sets the format of the output string
658
- - `unit`: sets the denomination of the currency
659
- - `strip_insignificant_zeros`: defaults to `false`
660
- - `sign_first`: defaults to `true`
661
-
662
- You can provide only the options you want to override:
663
-
664
- ```javascript
665
- I18n.toCurrency(1000, { precision: 0 }); // $1,000
666
- ```
667
-
668
- The `toHumanSize` function accepts the following options:
669
-
670
- - `precision`: defaults to `1`
671
- - `separator`: defaults to `.`
672
- - `delimiter`: defaults to `""`
673
- - `strip_insignificant_zeros`: defaults to `false`
674
- - `format`: defaults to `%n%u`
675
- - `scope`: defaults to `""`
676
-
677
- <!---->
678
-
679
- ```javascript
680
- I18n.toHumanSize(1234); // 1KB
681
- I18n.toHumanSize(1234 * 1024); // 1MB
682
- ```
683
-
684
- #### Date formatting
685
-
686
- ```javascript
687
- // accepted formats
688
- I18n.l("date.formats.short", "2009-09-18"); // yyyy-mm-dd
689
- I18n.l("time.formats.short", "2009-09-18 23:12:43"); // yyyy-mm-dd hh:mm:ss
690
- I18n.l("time.formats.short", "2009-11-09T18:10:34"); // JSON format with local Timezone (part of ISO-8601)
691
- I18n.l("time.formats.short", "2009-11-09T18:10:34Z"); // JSON format in UTC (part of ISO-8601)
692
- I18n.l("date.formats.short", 1251862029000); // Epoch time
693
- I18n.l("date.formats.short", "09/18/2009"); // mm/dd/yyyy
694
- I18n.l("date.formats.short", new Date()); // Date object
695
- ```
696
-
697
- You can also add placeholders to the date format:
698
-
699
- ```javascript
700
- I18n.translations["en"] = {
701
- date: {
702
- formats: {
703
- ordinal_day: "%B %{day}",
704
- },
705
- },
706
- };
707
-
708
- I18n.l("date.formats.ordinal_day", "2009-09-18", { day: "18th" }); // Sep 18th
709
- ```
710
-
711
- If you prefer, you can use the `I18n.toTime` and `I18n.strftime` functions to
712
- format dates.
713
-
714
- ```javascript
715
- var date = new Date();
716
- I18n.toTime("date.formats.short", "2009-09-18");
717
- I18n.toTime("date.formats.short", date);
718
- I18n.strftime(date, "%d/%m/%Y");
16
+ ```bash
17
+ gem install i18n-js
719
18
  ```
720
19
 
721
- The accepted formats for `I18n.strftime` are:
722
-
723
- %a - The abbreviated weekday name (Sun)
724
- %A - The full weekday name (Sunday)
725
- %b - The abbreviated month name (Jan)
726
- %B - The full month name (January)
727
- %c - The preferred local date and time representation
728
- %d - Day of the month (01..31)
729
- %-d - Day of the month (1..31)
730
- %H - Hour of the day, 24-hour clock (00..23)
731
- %-H/%k - Hour of the day, 24-hour clock (0..23)
732
- %I - Hour of the day, 12-hour clock (01..12)
733
- %-I/%l - Hour of the day, 12-hour clock (1..12)
734
- %m - Month of the year (01..12)
735
- %-m - Month of the year (1..12)
736
- %M - Minute of the hour (00..59)
737
- %-M - Minute of the hour (0..59)
738
- %p - Meridian indicator (AM or PM)
739
- %P - Meridian indicator (am or pm)
740
- %S - Second of the minute (00..60)
741
- %-S - Second of the minute (0..60)
742
- %w - Day of the week (Sunday is 0, 0..6)
743
- %y - Year without a century (00..99)
744
- %-y - Year without a century (0..99)
745
- %Y - Year with century
746
- %z/%Z - Timezone offset (+0545)
747
-
748
- Check out `spec/*.spec.js` files for more examples!
20
+ Or add the following line to your project's Gemfile:
749
21
 
750
- #### Using pluralization and number formatting together
751
-
752
- Sometimes you might want to display translation with formatted number, like
753
- adding thousand delimiters to displayed number You can do this:
754
-
755
- ```json
756
- {
757
- "en": {
758
- "point": {
759
- "one": "1 Point",
760
- "other": "{{formatted_number}} Points",
761
- "zero": "0 Points"
762
- }
763
- }
764
- }
765
- ```
766
-
767
- ```js
768
- var point_in_number = 1000;
769
- I18n.t("point", {
770
- count: point_in_number,
771
- formatted_number: I18n.toNumber(point_in_number),
772
- });
22
+ ```ruby
23
+ gem "i18n-js", "~> 4.0.0.alpha1"
773
24
  ```
774
25
 
775
- Output should be `1,000 points`
776
-
777
- ## Using multiple exported translation files on a page.
778
-
779
- This method is useful for very large apps where a single contained
780
- translations.js file is not desirable. Examples would be a global translations
781
- file and a more specific route translation file.
26
+ ## Usage
782
27
 
783
- ### Rails without asset pipeline
28
+ About patterns:
784
29
 
785
- 1. Setup your `config/i18n-js.yml` to have multiple files and try to minimize
786
- any overlap.
30
+ - Patterns can use `*` as a wildcard and can appear more than once.
31
+ - `*` will include everything
32
+ - `*.messages.*`
33
+ - Patterns starting with `!` are excluded.
34
+ - `!*.activerecord.*` will exclude all ActiveRecord translations.
787
35
 
788
- ```yaml
789
- sort_translation_keys: true
790
- fallbacks: false
36
+ The config file:
791
37
 
38
+ ```yml
39
+ ---
792
40
  translations:
793
- + file: "app/assets/javascript/nls/welcome.js"
794
- only:
795
- + '*.welcome.*'
796
-
797
- + file: "app/assets/javascript/nls/albums.js"
798
- only:
799
- + '*.albums.*'
800
-
801
- + file: "app/assets/javascript/nls/global.js"
802
- only:
803
- + '*'
804
- # Exempt any routes specific translations from being
805
- # included in the global translation file
806
- except:
807
- + '*.welcome.*'
808
- + '*.albums.*'
809
- ```
810
-
811
- When `rake i18n:js:export` is executed it will create 3 translations files that
812
- can be loaded via the `javascript_include_tag`
813
-
814
- 2. Add the `javascript_include_tag` to your layout and to any route specific
815
- files that will require it.
816
-
817
- ```ruby
818
- # views/layouts/application.html.erb
819
- <%= javascript_include_tag(
820
- "i18n"
821
- "nls/global"
822
- ) %>
823
- ```
824
-
825
- and in the route specific
41
+ - file: app/frontend/locales/en.json
42
+ patterns:
43
+ - "*"
44
+ - "!*.activerecord"
45
+ - "!*.errors"
46
+ - "!*.number.nth"
826
47
 
827
- ```ruby
828
- # views/welcome/index.html.erb
829
- <%= javascript_include_tag(
830
- "nls/welcome"
831
- ) %>
48
+ - file: app/frontend/locales/:locale.json
49
+ patterns:
50
+ - "*"
832
51
  ```
833
52
 
834
- 3. Make sure that you add these files to your `config/application.rb`
53
+ The Ruby API:
835
54
 
836
55
  ```ruby
837
- config.assets.precompile += %w(
838
- i18n
839
- nls/*
840
- )
841
- ```
842
-
843
- ### Using require.js / r.js
56
+ require "i18n-js"
844
57
 
845
- To use this with require.js we are only going to change a few things from above.
846
-
847
- 1. In your `config/i18n-js.yml` we need to add a better location for the i18n to
848
- be exported to. You want to use this location so that it can be properly
849
- precompiled by r.js.
850
-
851
- ```yaml
852
- export_i18n_js: "app/assets/javascript/nls"
58
+ I18nJS.call(config_file: "config/i18n.yml")
59
+ I18nJS.call(config: config)
853
60
  ```
854
61
 
855
- 2. In your `config/require.yml` we need to add a map, shim all the translations,
856
- and include them into the appropriate modules
857
-
858
- ```yaml
859
- # In your maps add (if you do not have this you will need to add it)
860
- map:
861
- '*':
862
- i18n: 'nls/i18n'
863
-
864
- # In your shims
865
- shims:
866
- nls/welcome:
867
- deps:
868
- + i18n
869
-
870
- nls/global:
871
- deps:
872
- + i18n
62
+ The CLI API:
873
63
 
874
- # Finally in your modules
875
- modules:
876
- + name: 'application'
877
- include:
878
- + i18n
879
- + 'nls/global'
880
-
881
- + name: 'welcome'
882
- exclude:
883
- + application
884
- include:
885
- + 'nls/welcome'
64
+ ```console
65
+ $ i18n init --config config/i18n.yml
66
+ $ i18n export --config config/i18n.yml --require config/environment.rb
886
67
  ```
887
68
 
888
- 3. When `rake assets:precompile` is executed it will optimize the translations
889
- into the correct modules so they are loaded with their assigned module, and
890
- loading them with requirejs is as simple as requiring any other shim.
69
+ By default, `i18n` will use `config/i18n.yml` and `config/environment.rb` as the
70
+ configuration files. If you don't have these files, then you'll need to specify
71
+ both `--config` and `--require`.
891
72
 
892
- ```javascript
893
- define(["welcome/other_asset", "nls/welcome"], function (otherAsset) {
894
- // ...
895
- });
896
- ```
73
+ ## Automatically export translations
897
74
 
898
- 4. (optional) As an additional configuration we can make a task to be run before
899
- the requirejs optimizer. This will allow any automated scripts that run the
900
- requirejs optimizer to export the strings before we run r.js.
75
+ ### Using guard
901
76
 
902
- ```rake
903
- # lib/tasks/i18n.rake
904
- Rake::Task[:'i18n:js:export'].prerequisites.clear
905
- task :'i18n:js:export' => :'i18n:js:before_export'
906
- task :'requirejs:precompile:external' => :'i18n:js:export'
77
+ Install [guard](https://rubygems.org/packages/guard) and
78
+ [guard-compat](https://rubygems.org/packages/guard-compat). Then create a
79
+ Guardfile with the following configuration:
907
80
 
908
- namespace :i18n do
909
- namespace :js do
910
- task :before_export => :'assets:environment' do
911
- I18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{yml,rb}')]
912
- I18n.backend.load_translations
913
- end
914
- end
81
+ ```ruby
82
+ guard(:"i18n-js",
83
+ run_on_start: true,
84
+ config_file: "./config/i18n.yml",
85
+ require_file: "./config/environment.rb") do
86
+ watch(%r{^(app|config)/locales/.+\.(yml|po)$})
87
+ watch(%r{^config/i18n.yml$})
88
+ watch("Gemfile")
915
89
  end
916
90
  ```
917
91
 
918
- ## Using I18n.js with other languages (Python, PHP, ...)
919
-
920
- The JavaScript library is language agnostic; so you can use it with PHP, Python,
921
- [your favorite language here]. The only requirement is that you need to set the
922
- `translations` attribute like following:
923
-
924
- ```javascript
925
- I18n.translations = {};
926
-
927
- I18n.translations["en"] = {
928
- message: "Some special message for you",
929
- };
930
-
931
- I18n.translations["pt-BR"] = {
932
- message: "Uma mensagem especial para você",
933
- };
934
- ```
935
-
936
- ## Known Issues
937
-
938
- ### Missing translations in precompiled file(s) after adding any new locale file
92
+ If you files in a different location, the remember to configure file paths
93
+ accordingly.
939
94
 
940
- Due to the design of `sprockets`:
95
+ Now you can run `guard start -i`.
941
96
 
942
- - `depend_on` only takes file paths, not directory paths
943
- - registered `preprocessors` are only run when the fingerprint of any asset
944
- file, including `.erb` files, is changed
97
+ ### Using listen
945
98
 
946
- This means that new locale files will not be detected, and so they will not
947
- trigger a i18n-js refresh. There are a few approaches to work around this:
948
-
949
- 1. You can force i18n-js to update its translations by completely clearing the
950
- assets cache. Use one of the following:
951
-
952
- ```bash
953
- $ rake assets:clobber
954
- # Or, with older versions of Rails:
955
- $ rake tmp:cache:clear
956
- ```
957
-
958
- These commands will remove _all_ fingerprinted assets, and you will have to
959
- recompile them with
960
-
961
- ```bash
962
- $ rake assets:precompile
963
- ```
964
-
965
- or similar commands. If you are precompiling assets on the target machine(s),
966
- cached pages may be broken by this, so they will need to be refreshed.
967
-
968
- 2. You can change something in a different locale file.
969
-
970
- 3. Finally, you can change `config.assets.version`.
971
-
972
- **Note:** See issue [#213](https://github.com/fnando/i18n-js/issues/213) for
973
- more details and discussion of this issue.
974
-
975
- ### Translations in JS are not updated when Sprockets not loaded before this gem
976
-
977
- The "rails engine" declaration will try to detect existence of "sprockets"
978
- before adding the initailizer If sprockets is loaded after this gem, the
979
- preprocessor for making JS translations file cache to depend on content of
980
- locale files will not be hooked. So ensure sprockets is loaded before this gem
981
- by moving the entry of sprockets in the Gemfile or adding "require" statements
982
- for sprockets somewhere.
983
-
984
- **Note:** See issue [#404](https://github.com/fnando/i18n-js/issues/404) for
985
- more details and discussion of this issue.
986
-
987
- ### JS `I18n.toCurrency` & `I18n.toNumber` cannot handle large integers
988
-
989
- The above methods use `toFixed` and it only supports 53 bit integers. Ref:
990
- http://2ality.com/2012/07/large-integers.html
991
-
992
- Feel free to find & discuss possible solution(s) at issue
993
- [#511](https://github.com/fnando/i18n-js/issues/511)
994
-
995
- ### Only works with `Simple` backend
996
-
997
- If you set `I18n.backend` to something other than the default `Simple` backend,
998
- you will likely get an exception like this:
999
-
1000
- ```
1001
- Undefined method 'initialized?' for <your backend class>
1002
- ```
1003
-
1004
- For now, i18n-js is only compatible with the `Simple` backend. If you need a
1005
- more sophisticated backend for your rails application, like
1006
- `I18n::Backend::ActiveRecord`, you can setup i18n-js to get translations from a
1007
- separate `Simple` backend, by adding the following in an initializer:
99
+ Create a file under `config/initializers/i18n.rb` with the following content:
1008
100
 
1009
101
  ```ruby
1010
- I18n::JS.backend = I18n.backend
1011
- I18n.backend = I18n::Backend::Chain.new(<your other backend(s)>, I18n.backend)
1012
- ```
1013
-
1014
- This will use your backend with the default `Simple` backend as fallback, while
1015
- i18n-js only sees and uses the simple backend. This means however, that only
1016
- translations from your static locale files will be present in JavaScript.
102
+ # frozen_string_literal: true
1017
103
 
1018
- If you do cannot use a `Chain`-Backend for some reason, you can also set
104
+ require "i18n-js/listen"
1019
105
 
1020
- ```ruby
1021
- I18n::JS.backend = I18n::Backend::Simple.new
1022
- I18n.backend = <something different>
106
+ I18nJS.listen
1023
107
  ```
1024
108
 
1025
- However, the automatic reloading of translations in developement will not work
1026
- in this case. This is because Rails calls `I18n.reload!` for each request in
1027
- development, but `reload!` will not be called on `I18n::JS.backend`, since it is
1028
- a different object. One option would be to patch `I18n.reload!` in an
1029
- initializer:
109
+ The code above will watch for changes based on `config/i18n.yml` and
110
+ `config/locales`. You can customize these options with
111
+ `I18nJS.listen(config_file: "config/i18n.yml", locales_dir: "config/locales")`.
1030
112
 
1031
- ```ruby
1032
- module I18n
1033
- def self.reload!
1034
- I18n::JS.backend.reload!
1035
- super
1036
- end
1037
- end
1038
- ```
113
+ ### Integrating with your frontend
1039
114
 
1040
- See issue [#428](https://github.com/fnando/i18n-js/issues/428) for more details
1041
- and discussion of this issue.
115
+ You're done exporting files, now what? Well, go to
116
+ [i18n](https://github.com/fnando/i18n) to discover how to use the NPM package
117
+ that loads all the exported translation.
1042
118
 
1043
119
  ## Maintainer
1044
120
 
1045
- - Nando Vieira - <http://nandovieira.com>
1046
-
1047
- ## Contributing
1048
-
1049
- Once you've made your great commits:
1050
-
1051
- 1. [Fork](http://help.github.com/forking/) I18n.js
1052
- 2. Create a branch with a clear name
1053
- 3. Make your changes (Please also add/change spec, README and CHANGELOG if
1054
- applicable)
1055
- 4. Push changes to the created branch
1056
- 5. [Create an Pull Request](http://github.com/fnando/i18n-js/pulls)
1057
- 6. That's it!
1058
-
1059
- Please respect the indentation rules and code style. And use 2 spaces, not tabs.
1060
- And don't touch the versioning thing.
1061
-
1062
- ## Running tests
121
+ - [Nando Vieira](https://github.com/fnando)
1063
122
 
1064
- You can run I18n tests using Node.js or your browser.
123
+ ## Contributors
1065
124
 
1066
- To use Node.js, install the `jasmine-node` library:
125
+ - https://github.com/fnando/i18n-js/contributors
1067
126
 
1068
- $ npm install jasmine-node
1069
-
1070
- Then execute the following command from the lib's root directory:
1071
-
1072
- $ npm test
1073
-
1074
- To run using your browser, just open the `spec/js/specs.html` file.
127
+ ## Contributing
1075
128
 
1076
- You can run both Ruby and JavaScript specs with `rake spec`.
129
+ For more details about how to contribute, please read
130
+ https://github.com/fnando/i18n-js/blob/main/CONTRIBUTING.md.
1077
131
 
1078
132
  ## License
1079
133
 
1080
- (The MIT License)
1081
-
1082
- Permission is hereby granted, free of charge, to any person obtaining a copy of
1083
- this software and associated documentation files (the 'Software'), to deal in
1084
- the Software without restriction, including without limitation the rights to
1085
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
1086
- the Software, and to permit persons to whom the Software is furnished to do so,
1087
- subject to the following conditions:
134
+ The gem is available as open source under the terms of the
135
+ [MIT License](https://opensource.org/licenses/MIT). A copy of the license can be
136
+ found at https://github.com/fnando/i18n-js/blob/main/LICENSE.md.
1088
137
 
1089
- The above copyright notice and this permission notice shall be included in all
1090
- copies or substantial portions of the Software.
138
+ ## Code of Conduct
1091
139
 
1092
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1093
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
1094
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
1095
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
1096
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1097
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
140
+ Everyone interacting in the i18n-js project's codebases, issue trackers, chat
141
+ rooms and mailing lists is expected to follow the
142
+ [code of conduct](https://github.com/fnando/i18n-js/blob/main/CODE_OF_CONDUCT.md).