roda-i18n 0.4.0 → 0.5.0
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 +5 -5
- data/.github/dependabot.yml +24 -0
- data/.github/workflows/ruby.yml +37 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +30 -0
- data/.rubocop_todo.yml +34 -0
- data/CHANGELOG.md +20 -0
- data/Gemfile +17 -0
- data/README.md +14 -12
- data/Rakefile +10 -14
- data/lib/roda/i18n/version.rb +3 -3
- data/lib/roda/i18n.rb +2 -0
- data/lib/roda/plugins/i18n.rb +125 -139
- data/roda-i18n.gemspec +22 -28
- metadata +22 -156
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5c59dec3caf930c42ea639d9d803cd1f96351f4e26de874031d46376ca047b38
|
4
|
+
data.tar.gz: 39970d149489f36de80048d86c2451d74922ffee54a6df8459b3e278d5bd43d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae7c28fff45a8bd38ec31b89843132c1a6fd8c09f248078589f7249d8f5b26e5b32b6a8a2843f3a67bd2c919f14cac25c32fda1c7fd064b208774c735e2c9e5a
|
7
|
+
data.tar.gz: ed1d0c3bd35f808b89e88c02fac1a3c626d40bb5235a6fa3c540cd893938e749d471c735ce70f2a782a485d067fa640763bc5d4b22d34b59be228b3faee498e6
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# To get started with Dependabot version updates, you'll need to specify which
|
2
|
+
# package ecosystems to update and where the package manifests are located.
|
3
|
+
# Please see the documentation for all configuration options:
|
4
|
+
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
5
|
+
|
6
|
+
version: 2
|
7
|
+
updates:
|
8
|
+
- package-ecosystem: "github-actions"
|
9
|
+
directory: "/"
|
10
|
+
schedule:
|
11
|
+
interval: "weekly"
|
12
|
+
day: "saturday"
|
13
|
+
time: "21:45"
|
14
|
+
timezone: "Europe/Berlin"
|
15
|
+
- package-ecosystem: "bundler" # See documentation for possible values
|
16
|
+
directory: "/" # Location of package manifests
|
17
|
+
groups:
|
18
|
+
patch-and-minor-dependencies:
|
19
|
+
update-types: ["patch", "minor"]
|
20
|
+
schedule:
|
21
|
+
interval: "weekly"
|
22
|
+
day: "saturday"
|
23
|
+
time: "21:45"
|
24
|
+
timezone: "Europe/Berlin"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
|
6
|
+
# GitHub recommends pinning actions to a commit SHA.
|
7
|
+
# To get a newer version, you will need to update the SHA.
|
8
|
+
# You can also reference a tag or branch, but the action may change without warning.
|
9
|
+
|
10
|
+
name: Ruby
|
11
|
+
|
12
|
+
on:
|
13
|
+
pull_request:
|
14
|
+
branches: [master]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
lint_and_test:
|
18
|
+
env:
|
19
|
+
RACK_ENV: test
|
20
|
+
strategy:
|
21
|
+
fail-fast: false
|
22
|
+
matrix:
|
23
|
+
# os: [ubuntu-latest, macos-latest]
|
24
|
+
os: [ubuntu-latest]
|
25
|
+
ruby: ["3.0", "3.1", "3.2", "3.3"]
|
26
|
+
runs-on: ${{ matrix.os }}
|
27
|
+
timeout-minutes: 2
|
28
|
+
|
29
|
+
steps:
|
30
|
+
- uses: actions/checkout@v4
|
31
|
+
- name: Set up Ruby
|
32
|
+
uses: ruby/setup-ruby@v1
|
33
|
+
with:
|
34
|
+
ruby-version: ${{ matrix.ruby }}
|
35
|
+
bundler-cache: true
|
36
|
+
- name: Run rake (lint and test)
|
37
|
+
run: bundle exec rake
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
require:
|
4
|
+
- rubocop-rake
|
5
|
+
- rubocop-performance
|
6
|
+
- rubocop-minitest
|
7
|
+
|
8
|
+
# The behavior of RuboCop can be controlled via the .rubocop.yml
|
9
|
+
# configuration file. It makes it possible to enable/disable
|
10
|
+
# certain cops (checks) and to alter their behavior if they accept
|
11
|
+
# any parameters. The file can be placed either in your home
|
12
|
+
# directory or in some project directory.
|
13
|
+
#
|
14
|
+
# RuboCop will start looking for the configuration file in the directory
|
15
|
+
# where the inspected file is and continue its way up to the root directory.
|
16
|
+
#
|
17
|
+
# See https://docs.rubocop.org/rubocop/configuration
|
18
|
+
|
19
|
+
AllCops:
|
20
|
+
NewCops: enable
|
21
|
+
|
22
|
+
Layout/LineLength:
|
23
|
+
Exclude:
|
24
|
+
- "roda-i18n.gemspec"
|
25
|
+
|
26
|
+
Style/Documentation:
|
27
|
+
Exclude:
|
28
|
+
- 'spec/**/*'
|
29
|
+
- 'test/**/*'
|
30
|
+
- 'lib/roda/plugins/i18n.rb'
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2024-09-09 20:36:04 UTC using RuboCop version 1.66.1.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 4
|
10
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
11
|
+
Metrics/AbcSize:
|
12
|
+
Max: 39
|
13
|
+
|
14
|
+
# Offense count: 15
|
15
|
+
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
|
16
|
+
# AllowedMethods: refine
|
17
|
+
Metrics/BlockLength:
|
18
|
+
Max: 639
|
19
|
+
|
20
|
+
# Offense count: 2
|
21
|
+
# Configuration parameters: CountComments, CountAsOne.
|
22
|
+
Metrics/ClassLength:
|
23
|
+
Max: 641
|
24
|
+
|
25
|
+
# Offense count: 1
|
26
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
27
|
+
Metrics/CyclomaticComplexity:
|
28
|
+
Max: 9
|
29
|
+
|
30
|
+
# Offense count: 8
|
31
|
+
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
|
32
|
+
Metrics/MethodLength:
|
33
|
+
Max: 22
|
34
|
+
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## next (unreleased)
|
4
|
+
|
5
|
+
* Merge pull request #5 from simonneutert/bump-dependencies - Add/Bump dependencies, minimum Ruby version to 3.0.0
|
6
|
+
|
7
|
+
* __Breaking Changes:__
|
8
|
+
* minimum Ruby version is now >= 3.0.0
|
9
|
+
|
10
|
+
* __Dependencies:__
|
11
|
+
* Add `date` to `gemspec`
|
12
|
+
* Bump `r18n-core` to `~> 5.0`
|
13
|
+
* Bump `roda` to `~> 3.8`
|
14
|
+
* Bump `rack-test` to `1.1.0`
|
15
|
+
|
16
|
+
* Bump `bundler` to `~> 2.5`
|
17
|
+
* Bump `rack-test` to `~> 2.1`
|
18
|
+
* Bump `rake` to `~> 13.2`
|
19
|
+
|
20
|
+
* __Tests:__
|
21
|
+
* switched from rack session to roda session (as plugin in test suite)
|
22
|
+
* fixed failing tests and updated fixtures for proper YAML due to the above changes (Psych was freaking out about the prior YAML formatting)
|
3
23
|
|
4
24
|
## 0.4.0 (2018-05-08)
|
5
25
|
|
data/Gemfile
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in roda-i18n.gemspec
|
4
6
|
gemspec
|
7
|
+
|
8
|
+
gem 'bundler', '~> 2.5'
|
9
|
+
gem 'erubis'
|
10
|
+
gem 'kramdown'
|
11
|
+
gem 'minitest', '~> 5.7', '>= 5.7.0'
|
12
|
+
gem 'minitest-hooks', '~> 1.1', '>= 1.1.0'
|
13
|
+
gem 'minitest-rg'
|
14
|
+
gem 'nokogiri'
|
15
|
+
gem 'rack-test', '~> 2.1'
|
16
|
+
gem 'rake', '~> 13.2'
|
17
|
+
gem 'rubocop'
|
18
|
+
gem 'rubocop-minitest'
|
19
|
+
gem 'rubocop-performance'
|
20
|
+
gem 'rubocop-rake'
|
21
|
+
gem 'simplecov'
|
data/README.md
CHANGED
@@ -14,13 +14,13 @@ Extensively tested and with 100% code test coverage.
|
|
14
14
|
To use this gem, just do
|
15
15
|
|
16
16
|
```bash
|
17
|
-
|
17
|
+
$ (sudo) gem install roda-i18n
|
18
18
|
```
|
19
19
|
|
20
20
|
or if you use Bundler
|
21
21
|
|
22
22
|
```ruby
|
23
|
-
gem
|
23
|
+
gem 'roda-i18n'
|
24
24
|
```
|
25
25
|
|
26
26
|
<br>
|
@@ -62,7 +62,7 @@ plugin :i18n, :locale => ['de'], :translations => ['absolute/path/2/i18n']
|
|
62
62
|
1. You must set `opts[:root]` in your app if you do not define the `:translations` path during
|
63
63
|
plugin configuration.
|
64
64
|
|
65
|
-
|
65
|
+
2. When overriding `:translations` the **any path(s) given must be absolute**.
|
66
66
|
|
67
67
|
|
68
68
|
#### Loading translations from multiple i18n directories
|
@@ -304,7 +304,7 @@ plugin :i18n, :translations => ['app1/i18n', 'app2/i18n', 'app3/i18n']
|
|
304
304
|
|
305
305
|
### Sequel DBLoader for DB based translations support
|
306
306
|
|
307
|
-
|
307
|
+
Some form of built-in support for storing / loading translations from a Sequel based DB.
|
308
308
|
|
309
309
|
|
310
310
|
<br>
|
@@ -327,23 +327,25 @@ Som form of built-in support for storing / loading translations from a Sequel ba
|
|
327
327
|
|
328
328
|
## Credits
|
329
329
|
|
330
|
-
* This plugin
|
330
|
+
* This plugin has been inspired by the `sinatra-i18n` gem available at
|
331
331
|
[github/ai/r18n](http://github.com/ai/r18n) created by [Andrey Sitnik](http://github.com/ai).
|
332
332
|
|
333
|
-
* Testing code
|
333
|
+
* Testing code has been partly copied from [Forme](https://github.com/jeremyevans/forme).
|
334
334
|
|
335
|
-
* Inspiration and assistance by [Jeremy Evans](github.com/jeremyevans). Many thanks Jeremy!!
|
335
|
+
* Inspiration and assistance by [Jeremy Evans](https://github.com/jeremyevans). Many thanks Jeremy!!
|
336
336
|
|
337
337
|
* Code fixes and improvements by:
|
338
338
|
|
339
|
-
* [Jonathan Duarte](github.com/jonduarte). Many thanks Jonathan
|
339
|
+
* [Jonathan Duarte](https://github.com/jonduarte). Many thanks Jonathan for PR [#3](https://github.com/kematzy/roda-i18n/pull/3)
|
340
340
|
|
341
|
+
* [Adam Daniels](https://github.com/adam12). Many thanks Adam for PR [#4](https://github.com/kematzy/roda-i18n/pull/4), [#5](https://github.com/kematzy/roda-i18n/pull/5) & [#6](https://github.com/kematzy/roda-i18n/pull/6)
|
342
|
+
|
343
|
+
* [Firas Zaidan](https://github.com/zaidan). Many thanks Firas for PR [#7](https://github.com/kematzy/roda-i18n/pull/7)
|
344
|
+
|
345
|
+
* [Simon Neutert](https://github.com/simonneutert). Many thanks Simon for PR [#8](https://github.com/kematzy/roda-i18n/pull/8)
|
341
346
|
|
342
347
|
## Licence
|
343
348
|
|
344
349
|
MIT
|
345
350
|
|
346
|
-
Copyright: 2015 Kematzy
|
347
|
-
|
348
|
-
|
349
|
-
|
351
|
+
Copyright: 2015 - 2024 Kematzy
|
data/Rakefile
CHANGED
@@ -1,29 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bundler/gem_tasks'
|
4
|
+
require 'rubocop/rake_task'
|
2
5
|
require 'rake/testtask'
|
3
6
|
|
7
|
+
RuboCop::RakeTask.new
|
8
|
+
|
4
9
|
Rake::TestTask.new(:spec) do |t|
|
5
10
|
t.libs << 'spec'
|
6
11
|
t.libs << 'lib'
|
7
12
|
t.test_files = FileList['spec/**/*_spec.rb']
|
8
13
|
end
|
9
14
|
|
10
|
-
task :
|
11
|
-
|
15
|
+
task default: %i[rubocop spec]
|
16
|
+
|
17
|
+
desc 'alias for spec task'
|
18
|
+
task test: :spec
|
12
19
|
|
13
20
|
desc 'Run specs with coverage'
|
14
21
|
task :coverage do
|
15
22
|
ENV['COVERAGE'] = '1'
|
16
23
|
Rake::Task['spec'].invoke
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
desc 'Run Rubocop report'
|
21
|
-
task :rubocop do
|
22
|
-
res = `which rubocop`
|
23
|
-
if res != ""
|
24
|
-
`rubocop -f html -o ./rubocop/report.html lib/`
|
25
|
-
# `open rubocop/report.html` # if OSX
|
26
|
-
else
|
27
|
-
puts "\nERROR: 'rubocop' gem is not installed or available. Please install with 'gem install rubocop'."
|
28
|
-
end
|
24
|
+
# `open coverage/index.html` # if OSX
|
29
25
|
end
|
data/lib/roda/i18n/version.rb
CHANGED
data/lib/roda/i18n.rb
CHANGED
data/lib/roda/plugins/i18n.rb
CHANGED
@@ -1,217 +1,210 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'r18n-core'
|
2
4
|
|
3
|
-
#
|
4
5
|
class Roda
|
5
|
-
|
6
|
-
#
|
7
6
|
module RodaPlugins
|
8
|
-
|
9
7
|
# The i18n plugin allows you to easily add internationalisation (i18n) and
|
10
8
|
# localisation support to your Roda app, by adding the following:
|
11
|
-
#
|
9
|
+
#
|
12
10
|
# plugin :i18n
|
13
|
-
#
|
14
|
-
# By default the default locale is set to <tt>'en'</tt> and the translations directory
|
11
|
+
#
|
12
|
+
# By default the default locale is set to <tt>'en'</tt> and the translations directory
|
15
13
|
# is set to <tt>'i18n'</tt> in the rooot of your app.
|
16
|
-
#
|
14
|
+
#
|
17
15
|
# Both <tt>:locale</tt> and <tt>:translations</tt> can be overridden during configuration:
|
18
|
-
#
|
16
|
+
#
|
19
17
|
# plugin :i18n, :locale => ['de'], :translations => ['absolute/path/2/i18n']
|
20
|
-
#
|
21
|
-
# Please note!
|
18
|
+
#
|
19
|
+
# Please note!
|
22
20
|
# 1) You must set +opts[:root]+ in your app if you don't define the +:translations+ path.
|
23
|
-
#
|
21
|
+
#
|
24
22
|
# 2) When overriding <tt>:translations</tt> the path given <b>must be absolute</b>.
|
25
|
-
#
|
23
|
+
#
|
26
24
|
# The path supports 'wildcards', ie: path/**/i18n so you can load translations from multiple
|
27
25
|
# combined apps each with their own <tt>i18n</tt> folder with translations.
|
28
|
-
#
|
29
|
-
# Note! when loading translations from multiple sources and the same translation key is used
|
30
|
-
# in both files, the first loaded file takes precedence, ie: <tt>./i18n/en.yml</tt> takes
|
26
|
+
#
|
27
|
+
# Note! when loading translations from multiple sources and the same translation key is used
|
28
|
+
# in both files, the first loaded file takes precedence, ie: <tt>./i18n/en.yml</tt> takes
|
31
29
|
# precedence over <tt>./apps/app1/i18n/en.yml</tt>
|
32
|
-
#
|
30
|
+
#
|
33
31
|
# == USAGE
|
34
|
-
#
|
32
|
+
#
|
35
33
|
# The i18n plugin depends upon simple YAML based translations files:
|
36
|
-
#
|
34
|
+
#
|
37
35
|
# # app/i18n/en.yml
|
38
|
-
#
|
36
|
+
#
|
39
37
|
# user:
|
40
38
|
# edit: Edit user
|
41
39
|
# name: User name is %1
|
42
40
|
# count: !!pl
|
43
41
|
# 1: There is 1 user
|
44
42
|
# n: There are %1 users
|
45
|
-
#
|
46
|
-
#
|
43
|
+
#
|
44
|
+
#
|
47
45
|
# and the <tt>:t</tt> instance method to output the translations:
|
48
|
-
#
|
49
|
-
#
|
46
|
+
#
|
47
|
+
#
|
50
48
|
# t.user.edit #=> "Edit user"
|
51
49
|
# t.user.name('John') #=> "User name is John"
|
52
50
|
# t.user.count(5) #=> "There are 5 users"
|
53
|
-
#
|
51
|
+
#
|
54
52
|
# t.does.not.exist | 'default' #=> "default"
|
55
|
-
#
|
56
|
-
#
|
53
|
+
#
|
54
|
+
#
|
57
55
|
# the <tt>:l</tt> instance method provides built-in localisations support:
|
58
|
-
#
|
56
|
+
#
|
59
57
|
# l Time.now #=> "03/01/2010 18:54"
|
60
58
|
# l Time.now, :human #=> "now"
|
61
59
|
# l Time.now, :full #=> "3rd of January, 2010 18:54"
|
62
|
-
#
|
60
|
+
#
|
63
61
|
# Both the +:t+ and +:l+ methods are available in the route and template (erb) scopes. ie:
|
64
|
-
#
|
62
|
+
#
|
65
63
|
# route do |r|
|
66
64
|
# r.root do
|
67
65
|
# t.welcome.message
|
68
66
|
# end
|
69
67
|
# end
|
70
|
-
#
|
68
|
+
#
|
71
69
|
# # app/views/layout.erb
|
72
70
|
# <snip...>
|
73
71
|
# <h1><%= t.welcome.message %></h1>
|
74
72
|
# <snip...>
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
73
|
+
#
|
74
|
+
#
|
75
|
+
#
|
78
76
|
# Visit [R18n](https://github.com/ai/r18n/tree/master/r18n-core) for more information.
|
79
|
-
#
|
80
|
-
#
|
77
|
+
#
|
78
|
+
#
|
81
79
|
# The i18n plugin also makes it easy to handle locales:
|
82
|
-
#
|
83
|
-
#
|
80
|
+
#
|
81
|
+
#
|
84
82
|
# === <tt>:locale</tt> RequestMethod
|
85
|
-
#
|
83
|
+
#
|
86
84
|
# This request method makes it to handle translations based upon the :locale prefix on a URL,
|
87
85
|
# ie: <tt>blog.com/de/posts</tt>, just use the following code:
|
88
|
-
#
|
86
|
+
#
|
89
87
|
# route do |r|
|
90
|
-
#
|
88
|
+
#
|
91
89
|
# r.locale do # or r.i18n_locale
|
92
|
-
# r.is 'posts' do
|
90
|
+
# r.is 'posts' do
|
93
91
|
# t.posts.header
|
94
92
|
# end
|
95
93
|
# end
|
96
|
-
#
|
94
|
+
#
|
97
95
|
# end
|
98
|
-
#
|
99
|
-
#
|
96
|
+
#
|
97
|
+
#
|
100
98
|
# === <tt>:i18n_set_locale_from</tt> RequestMethod
|
101
|
-
#
|
99
|
+
#
|
102
100
|
# Obtains the locale from either ENV, HTTP (browser), Params or Session values
|
103
|
-
#
|
104
|
-
#
|
101
|
+
#
|
102
|
+
#
|
105
103
|
# Naturally we can allow browsers to override the default locale within routes, like this:
|
106
|
-
#
|
104
|
+
#
|
107
105
|
# route do |r|
|
108
106
|
# i18n_set_locale_from(:http) #=> set to the browser's default locale (en-US)
|
109
107
|
# r.get '' do
|
110
108
|
# t.hello #=> 'Howdy, I speak American English'
|
111
109
|
# end
|
112
110
|
# end
|
113
|
-
#
|
111
|
+
#
|
114
112
|
# The def
|
115
|
-
#
|
116
|
-
#
|
113
|
+
#
|
114
|
+
#
|
117
115
|
# route do |r|
|
118
116
|
# i18n_set_locale('de')
|
119
117
|
# r.get 'in-german' do
|
120
118
|
# t.hello #=> 'Guten tag, ich spreche deutsch'
|
121
119
|
# end
|
122
120
|
# end
|
123
|
-
#
|
124
|
-
#
|
125
|
-
#
|
126
|
-
#
|
121
|
+
#
|
122
|
+
#
|
123
|
+
#
|
124
|
+
#
|
127
125
|
module RodaI18n
|
128
|
-
|
129
126
|
# default options
|
130
127
|
OPTS = {
|
131
128
|
# set the default locale
|
132
|
-
locale:
|
129
|
+
locale: 'en',
|
133
130
|
# set the default fallback locale
|
134
|
-
default_locale:
|
131
|
+
default_locale: 'en',
|
135
132
|
# set the default translations.
|
136
|
-
translations:
|
133
|
+
translations: nil
|
137
134
|
}.freeze
|
138
|
-
|
139
|
-
|
135
|
+
|
140
136
|
def self.configure(app, opts = OPTS)
|
141
|
-
if app.opts[:i18n]
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
137
|
+
opts = if app.opts[:i18n]
|
138
|
+
app.opts[:i18n][:orig_opts].merge(opts)
|
139
|
+
else
|
140
|
+
OPTS.merge(opts)
|
141
|
+
end
|
142
|
+
|
147
143
|
app.opts[:i18n] = opts.dup
|
148
144
|
app.opts[:i18n][:orig_opts] = opts
|
149
145
|
opts = app.opts[:i18n]
|
150
|
-
|
146
|
+
|
151
147
|
# set the translations path to defaults if nil
|
152
148
|
opts[:translations] = File.expand_path('i18n', app.opts[:root]) if opts[:translations].nil?
|
153
149
|
::R18n.default_places = opts[:translations]
|
154
|
-
|
155
|
-
# default_locale is either 'en' or the set value, so reset :default_locale if
|
150
|
+
|
151
|
+
# default_locale is either 'en' or the set value, so reset :default_locale if
|
156
152
|
# it is somehow nil or an empty string ' '
|
157
|
-
if opts[:default_locale].nil? || opts[:default_locale] =~ /^\s*$/
|
158
|
-
opts[:default_locale] = 'en'
|
159
|
-
end
|
153
|
+
opts[:default_locale] = 'en' if opts[:default_locale].nil? || opts[:default_locale] =~ /^\s*$/
|
160
154
|
::R18n::I18n.default = opts[:default_locale]
|
161
|
-
|
155
|
+
|
162
156
|
::R18n.clear_cache! if ENV['RACK_ENV'] != 'production'
|
163
|
-
i18n
|
164
|
-
opts[:locale],
|
157
|
+
i18n = R18n::I18n.new(
|
158
|
+
opts[:locale],
|
165
159
|
::R18n.default_places,
|
166
|
-
off_filters:
|
167
|
-
on_filters:
|
160
|
+
off_filters: :untranslated,
|
161
|
+
on_filters: :untranslated_html
|
168
162
|
)
|
169
163
|
::R18n.set(i18n)
|
170
164
|
end
|
171
|
-
|
165
|
+
|
172
166
|
# methods used within Roda's route block
|
173
|
-
#
|
167
|
+
#
|
174
168
|
module RequestMethods
|
175
|
-
|
176
169
|
# Obtains the locale from either ENV, HTTP (browser), Params or Session
|
177
170
|
# values.
|
178
|
-
#
|
171
|
+
#
|
179
172
|
# route do |r|
|
180
173
|
# # A): set from URL params ie: GET /posts?locale=de
|
181
174
|
# r.i18n_set_locale_from(:params)
|
182
|
-
#
|
175
|
+
#
|
183
176
|
# /url?locale=de
|
184
177
|
# <%= t.one %> #=> Ein
|
185
178
|
# /url?locale=es
|
186
179
|
# <%= t.one %> #=> Uno
|
187
|
-
#
|
180
|
+
#
|
188
181
|
# # B): set from session[:locale] (if present)
|
189
182
|
# r.i18n_set_locale_from(:session)
|
190
|
-
#
|
183
|
+
#
|
191
184
|
# session[:locale] = 'de'
|
192
185
|
# <%= t.one %> #=> Ein
|
193
186
|
# session[:locale] = 'es'
|
194
187
|
# <%= t.one %> #=> Uno
|
195
|
-
#
|
188
|
+
#
|
196
189
|
# # C): set from the browser's HTTP request locale
|
197
190
|
# r.i18n_set_locale_from(:http)
|
198
|
-
#
|
191
|
+
#
|
199
192
|
# HTTP_ACCEPT_LANGUAGE = 'sv-se;q=1,es;q=0.8,en;q=0.6'
|
200
193
|
# <%= t.one %> #=> Ett
|
201
|
-
#
|
194
|
+
#
|
202
195
|
# # D): set from the server ENV['LANG'] variable
|
203
196
|
# r.i18n_set_locale_from(:ENV)
|
204
|
-
#
|
197
|
+
#
|
205
198
|
# ENV['LANG'] = 'en_US.UTF8'
|
206
199
|
# <%= t.one %> #=> One
|
207
200
|
# ENV['LANG'] = 'es'
|
208
201
|
# <%= t.one %> #=> Uno
|
209
|
-
#
|
210
|
-
# r.is 'posts' do
|
202
|
+
#
|
203
|
+
# r.is 'posts' do
|
211
204
|
# t.posts.header # use translations
|
212
205
|
# end
|
213
206
|
# end
|
214
|
-
#
|
207
|
+
#
|
215
208
|
def i18n_set_locale_from(type)
|
216
209
|
case type.to_sym
|
217
210
|
when :http
|
@@ -228,73 +221,73 @@ class Roda
|
|
228
221
|
end
|
229
222
|
# sanity check: set to default locale if not set above
|
230
223
|
loc = ::R18n::I18n.default.to_s if loc.nil?
|
231
|
-
|
224
|
+
|
232
225
|
i18n = ::R18n::I18n.new(
|
233
|
-
loc,
|
226
|
+
loc,
|
234
227
|
::R18n.default_places,
|
235
|
-
off_filters:
|
236
|
-
on_filters:
|
228
|
+
off_filters: :untranslated,
|
229
|
+
on_filters: :untranslated_html
|
237
230
|
)
|
238
231
|
::R18n.set(i18n)
|
239
232
|
end
|
240
|
-
|
233
|
+
|
241
234
|
# Enables setting temporary :locale blocks within the routing block.
|
242
|
-
#
|
235
|
+
#
|
243
236
|
# route do |r|
|
244
|
-
#
|
237
|
+
#
|
245
238
|
# r.i18n_set_locale('de') do
|
246
239
|
# # within this block the locale is DE (German)
|
247
240
|
# end
|
248
|
-
#
|
241
|
+
#
|
249
242
|
# r.i18n_set_locale('es') do
|
250
243
|
# # within this block the locale is ES (Spanish)
|
251
244
|
# end
|
252
|
-
#
|
245
|
+
#
|
253
246
|
# end
|
254
|
-
#
|
255
|
-
def i18n_set_locale(locale
|
247
|
+
#
|
248
|
+
def i18n_set_locale(locale)
|
256
249
|
locale = ::R18n::I18n.default.to_s if locale.nil?
|
257
|
-
|
250
|
+
|
258
251
|
i18n = ::R18n::I18n.new(
|
259
|
-
locale,
|
260
|
-
::R18n.default_places,
|
261
|
-
off_filters:
|
262
|
-
on_filters:
|
252
|
+
locale,
|
253
|
+
::R18n.default_places,
|
254
|
+
off_filters: :untranslated,
|
255
|
+
on_filters: :untranslated_html
|
263
256
|
)
|
264
257
|
::R18n.set(i18n)
|
265
258
|
yield if block_given?
|
266
259
|
# return # NB!! needed to enable routes below to work
|
267
260
|
end
|
268
|
-
|
261
|
+
|
269
262
|
# Match only paths that contain one available locale from the ::R18n.available_locales
|
270
263
|
# list, otherwise skip it.
|
271
264
|
#
|
272
265
|
# This custom matcher allows us to have other routes below the r.locale .. declaration
|
273
266
|
def _match_available_locales_only
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
267
|
+
lambda do
|
268
|
+
locale = remaining_path.split('/').reject(&:empty?).first.to_s
|
269
|
+
if ::R18n.available_locales.map { |locale| locale.code.downcase }.include?(locale.downcase)
|
270
|
+
@captures.push(locale)
|
271
|
+
@remaining_path = remaining_path.sub("/#{locale}", '')
|
272
|
+
end
|
273
|
+
end
|
281
274
|
end
|
282
|
-
|
275
|
+
|
283
276
|
# Sets the locale based upon <tt>:locale</tt> prefixed routes
|
284
|
-
#
|
277
|
+
#
|
285
278
|
# route do |r|
|
286
279
|
# r.locale do
|
287
280
|
# # all routes are prefixed with '/:locale'
|
288
281
|
# # ie: GET /de/posts => will use DE translations
|
289
282
|
# # ie: GET /es/posts => will use ES translations
|
290
|
-
# r.is 'posts' do
|
283
|
+
# r.is 'posts' do
|
291
284
|
# t.posts.header # use translations or locales
|
292
285
|
# end
|
293
286
|
# end
|
294
287
|
# r.get(:about) { erb(:about) }
|
295
288
|
# end
|
296
289
|
#
|
297
|
-
def locale(opts = {}
|
290
|
+
def locale(opts = {})
|
298
291
|
on(_match_available_locales_only, opts) do |l|
|
299
292
|
loc = l || Roda.opts[:locale]
|
300
293
|
::R18n.set(loc)
|
@@ -302,25 +295,20 @@ class Roda
|
|
302
295
|
return # NB!! needed to enable routes below to work
|
303
296
|
end
|
304
297
|
end
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
298
|
+
alias i18n_locale locale
|
299
|
+
end
|
300
|
+
|
310
301
|
module ClassMethods
|
311
|
-
|
312
302
|
# Return the i18n options for this plugin.
|
313
303
|
def i18n_opts
|
314
304
|
opts[:i18n]
|
315
305
|
end
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
306
|
+
end
|
307
|
+
|
320
308
|
# defines method available within the views / routing block
|
321
309
|
module InstanceMethods
|
322
310
|
include ::R18n::Helpers
|
323
|
-
|
311
|
+
|
324
312
|
def i18n_available_locales
|
325
313
|
@available_locales = []
|
326
314
|
::R18n.available_locales.each do |l|
|
@@ -328,15 +316,13 @@ class Roda
|
|
328
316
|
end
|
329
317
|
@available_locales
|
330
318
|
end
|
331
|
-
|
319
|
+
|
332
320
|
def i18n_default_places
|
333
321
|
::R18n.default_places
|
334
322
|
end
|
335
|
-
|
336
323
|
end
|
337
|
-
|
338
|
-
|
339
|
-
|
324
|
+
end
|
325
|
+
|
340
326
|
register_plugin(:i18n, RodaI18n)
|
341
|
-
end
|
342
|
-
end
|
327
|
+
end
|
328
|
+
end
|
data/roda-i18n.gemspec
CHANGED
@@ -1,19 +1,20 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'roda/i18n/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = 'roda-i18n'
|
8
|
-
spec.version =
|
9
|
+
spec.version = Roda::I18n::VERSION
|
9
10
|
spec.authors = ['Kematzy']
|
10
11
|
spec.email = ['kematzy@gmail.com']
|
11
|
-
|
12
|
+
|
12
13
|
spec.summary = 'Roda Internationalisation plugin'
|
13
|
-
spec.description =
|
14
|
+
spec.description = 'The Roda-i18n plugin enables easy addition of internationalisation (i18n) and localisation support in Roda apps'
|
14
15
|
spec.homepage = 'http://github.com/kematzy/roda-i18n'
|
15
16
|
spec.license = 'MIT'
|
16
|
-
|
17
|
+
|
17
18
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
19
|
# delete this section to allow pushing this gem to any host.
|
19
20
|
# if spec.respond_to?(:metadata)
|
@@ -23,28 +24,21 @@ Gem::Specification.new do |spec|
|
|
23
24
|
# end
|
24
25
|
|
25
26
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
-
spec.bindir =
|
27
|
+
spec.bindir = 'exe'
|
27
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
-
spec.require_paths = [
|
29
|
-
|
29
|
+
spec.require_paths = ['lib']
|
30
|
+
|
30
31
|
spec.platform = Gem::Platform::RUBY
|
31
|
-
spec.
|
32
|
-
spec.
|
33
|
-
|
34
|
-
|
35
|
-
spec.
|
36
|
-
|
37
|
-
spec.
|
38
|
-
|
39
|
-
spec.
|
40
|
-
spec.
|
41
|
-
|
42
|
-
spec.
|
43
|
-
spec.add_development_dependency 'minitest', '~> 5.7', '>= 5.7.0'
|
44
|
-
spec.add_development_dependency 'minitest-hooks', '~> 1.1', '>= 1.1.0'
|
45
|
-
spec.add_development_dependency 'minitest-rg'
|
46
|
-
spec.add_development_dependency 'rack-test', '~> 1.0'
|
47
|
-
spec.add_development_dependency 'nokogiri'
|
48
|
-
spec.add_development_dependency 'simplecov'
|
49
|
-
|
32
|
+
spec.extra_rdoc_files = ['README.md', 'MIT-LICENSE']
|
33
|
+
spec.rdoc_options += ['--quiet', '--line-numbers', '--inline-source', '--title',
|
34
|
+
'Roda-i18n: internationalisation plugin', '--main', 'README.md']
|
35
|
+
|
36
|
+
spec.required_ruby_version = '>= 3.0.0'
|
37
|
+
|
38
|
+
spec.add_dependency 'date'
|
39
|
+
spec.add_dependency 'r18n-core', '~> 5.0'
|
40
|
+
spec.add_dependency 'roda', '~> 3.8'
|
41
|
+
spec.add_dependency 'tilt'
|
42
|
+
|
43
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
50
44
|
end
|
metadata
CHANGED
@@ -1,31 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roda-i18n
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kematzy
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '3.7'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '3.7'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: tilt
|
14
|
+
name: date
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - ">="
|
@@ -44,160 +30,36 @@ dependencies:
|
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
33
|
+
version: '5.0'
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.10'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.10'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '12.3'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '12.3'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: erubis
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: kramdown
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: minitest
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '5.7'
|
118
|
-
- - ">="
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
version: 5.7.0
|
121
|
-
type: :development
|
122
|
-
prerelease: false
|
123
|
-
version_requirements: !ruby/object:Gem::Requirement
|
124
|
-
requirements:
|
125
|
-
- - "~>"
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
version: '5.7'
|
128
|
-
- - ">="
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: 5.7.0
|
40
|
+
version: '5.0'
|
131
41
|
- !ruby/object:Gem::Dependency
|
132
|
-
name:
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
134
|
-
requirements:
|
135
|
-
- - "~>"
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
version: '1.1'
|
138
|
-
- - ">="
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
version: 1.1.0
|
141
|
-
type: :development
|
142
|
-
prerelease: false
|
143
|
-
version_requirements: !ruby/object:Gem::Requirement
|
144
|
-
requirements:
|
145
|
-
- - "~>"
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
version: '1.1'
|
148
|
-
- - ">="
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: 1.1.0
|
151
|
-
- !ruby/object:Gem::Dependency
|
152
|
-
name: minitest-rg
|
153
|
-
requirement: !ruby/object:Gem::Requirement
|
154
|
-
requirements:
|
155
|
-
- - ">="
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: '0'
|
158
|
-
type: :development
|
159
|
-
prerelease: false
|
160
|
-
version_requirements: !ruby/object:Gem::Requirement
|
161
|
-
requirements:
|
162
|
-
- - ">="
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
version: '0'
|
165
|
-
- !ruby/object:Gem::Dependency
|
166
|
-
name: rack-test
|
42
|
+
name: roda
|
167
43
|
requirement: !ruby/object:Gem::Requirement
|
168
44
|
requirements:
|
169
45
|
- - "~>"
|
170
46
|
- !ruby/object:Gem::Version
|
171
|
-
version: '
|
172
|
-
type: :
|
47
|
+
version: '3.8'
|
48
|
+
type: :runtime
|
173
49
|
prerelease: false
|
174
50
|
version_requirements: !ruby/object:Gem::Requirement
|
175
51
|
requirements:
|
176
52
|
- - "~>"
|
177
53
|
- !ruby/object:Gem::Version
|
178
|
-
version: '
|
179
|
-
- !ruby/object:Gem::Dependency
|
180
|
-
name: nokogiri
|
181
|
-
requirement: !ruby/object:Gem::Requirement
|
182
|
-
requirements:
|
183
|
-
- - ">="
|
184
|
-
- !ruby/object:Gem::Version
|
185
|
-
version: '0'
|
186
|
-
type: :development
|
187
|
-
prerelease: false
|
188
|
-
version_requirements: !ruby/object:Gem::Requirement
|
189
|
-
requirements:
|
190
|
-
- - ">="
|
191
|
-
- !ruby/object:Gem::Version
|
192
|
-
version: '0'
|
54
|
+
version: '3.8'
|
193
55
|
- !ruby/object:Gem::Dependency
|
194
|
-
name:
|
56
|
+
name: tilt
|
195
57
|
requirement: !ruby/object:Gem::Requirement
|
196
58
|
requirements:
|
197
59
|
- - ">="
|
198
60
|
- !ruby/object:Gem::Version
|
199
61
|
version: '0'
|
200
|
-
type: :
|
62
|
+
type: :runtime
|
201
63
|
prerelease: false
|
202
64
|
version_requirements: !ruby/object:Gem::Requirement
|
203
65
|
requirements:
|
@@ -214,7 +76,11 @@ extra_rdoc_files:
|
|
214
76
|
- README.md
|
215
77
|
- MIT-LICENSE
|
216
78
|
files:
|
79
|
+
- ".github/dependabot.yml"
|
80
|
+
- ".github/workflows/ruby.yml"
|
217
81
|
- ".gitignore"
|
82
|
+
- ".rubocop.yml"
|
83
|
+
- ".rubocop_todo.yml"
|
218
84
|
- ".travis.yml"
|
219
85
|
- CHANGELOG.md
|
220
86
|
- Gemfile
|
@@ -228,8 +94,9 @@ files:
|
|
228
94
|
homepage: http://github.com/kematzy/roda-i18n
|
229
95
|
licenses:
|
230
96
|
- MIT
|
231
|
-
metadata:
|
232
|
-
|
97
|
+
metadata:
|
98
|
+
rubygems_mfa_required: 'true'
|
99
|
+
post_install_message:
|
233
100
|
rdoc_options:
|
234
101
|
- "--quiet"
|
235
102
|
- "--line-numbers"
|
@@ -244,16 +111,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
244
111
|
requirements:
|
245
112
|
- - ">="
|
246
113
|
- !ruby/object:Gem::Version
|
247
|
-
version:
|
114
|
+
version: 3.0.0
|
248
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
249
116
|
requirements:
|
250
117
|
- - ">="
|
251
118
|
- !ruby/object:Gem::Version
|
252
119
|
version: '0'
|
253
120
|
requirements: []
|
254
|
-
|
255
|
-
|
256
|
-
signing_key:
|
121
|
+
rubygems_version: 3.5.11
|
122
|
+
signing_key:
|
257
123
|
specification_version: 4
|
258
124
|
summary: Roda Internationalisation plugin
|
259
125
|
test_files: []
|