preferred_locale 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +9 -1
- data/README.md +38 -2
- data/lib/preferred_locale/version.rb +1 -1
- data/lib/preferred_locale.rb +9 -3
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b3dd0a6d6efe6ee0a04861617f18a144ca0055416e8625f332927656d1af7dc
|
4
|
+
data.tar.gz: 19a440f91a0cc1c84a017e7fdb9c53d7e1031111229bc5d11daad613bcf4c71a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a03628fe5782f91dc4d0f451ddb9362a15494e5b71c6b69bd301e5f33283059ea7f30552f7dcde0365600eadcf261be2ba1fad2944f22d6c0aea58bab40f6cad
|
7
|
+
data.tar.gz: fa21679df9523936a3695e06dc37320bad283eda0acb1f1bb6f1351b1c2cd1f671b55fc1a7e4a493d6ccd08cb61a1986da91acfaa0a9503e28327306bf04d705
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
## [1.0.0
|
3
|
+
## [1.1.0](https://github.com/hummingbird-me/preferred_locale/releases/tag/v1.1.0) - 2023-05-06
|
4
|
+
|
5
|
+
- Improve documentation
|
6
|
+
- Don't add an implicit (language) fallback if the language is explicitly provided elsewhere in a
|
7
|
+
list. For example, if `en-US` and `en` are both in the list, don't add `en` as a fallback for
|
8
|
+
`en-US`.
|
9
|
+
|
10
|
+
## [1.0.0](https://github.com/hummingbird-me/preferred_locale/releases/tag/v1.0.0) - 2023-05-05
|
4
11
|
|
5
12
|
- Initial release
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
preferred_locale (1.
|
4
|
+
preferred_locale (1.1.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
10
|
diff-lcs (1.5.0)
|
11
|
+
docile (1.4.0)
|
11
12
|
json (2.6.3)
|
12
13
|
parallel (1.23.0)
|
13
14
|
parser (3.2.2.1)
|
@@ -50,6 +51,12 @@ GEM
|
|
50
51
|
rubocop (~> 1.33)
|
51
52
|
rubocop-capybara (~> 2.17)
|
52
53
|
ruby-progressbar (1.13.0)
|
54
|
+
simplecov (0.22.0)
|
55
|
+
docile (~> 1.1)
|
56
|
+
simplecov-html (~> 0.11)
|
57
|
+
simplecov_json_formatter (~> 0.1)
|
58
|
+
simplecov-html (0.12.3)
|
59
|
+
simplecov_json_formatter (0.1.4)
|
53
60
|
unicode-display_width (2.4.2)
|
54
61
|
|
55
62
|
PLATFORMS
|
@@ -64,6 +71,7 @@ DEPENDENCIES
|
|
64
71
|
rubocop
|
65
72
|
rubocop-performance
|
66
73
|
rubocop-rspec
|
74
|
+
simplecov
|
67
75
|
|
68
76
|
BUNDLED WITH
|
69
77
|
2.3.13
|
data/README.md
CHANGED
@@ -5,6 +5,42 @@ practice, this usually means finding the best locale between `I18n.available_loc
|
|
5
5
|
`Accept-Language` header from the request, but it could also be used to find the best locale between
|
6
6
|
something in your database and a user's preferences.
|
7
7
|
|
8
|
+
This is similar to the [http_accept_language gem](https://github.com/iain/http_accept_language) and
|
9
|
+
the [preferred-locale JS library](https://github.com/wopian/preferred-locale) in that it attempts to
|
10
|
+
resolve mismatches in specificity (ie, `en-US` vs `en`), but differs slightly in algorithm and in
|
11
|
+
API design.
|
12
|
+
|
13
|
+
## Algorithm
|
14
|
+
|
15
|
+
For available locales from the application:
|
16
|
+
|
17
|
+
1. Start with available locales:
|
18
|
+
- `['en-US', 'pt-BR', 'ja-JP', 'pt']`
|
19
|
+
2. Normalize them to lowercase mapped to the original values:
|
20
|
+
- `{'en-us' => 'en-US', 'pt-br' => 'pt-BR', 'ja-jp' => 'ja-JP', 'pt' => 'pt'}`
|
21
|
+
3. Add "implicit" locales as fallbacks:
|
22
|
+
- `{'en-us' => 'en-US', 'en' => 'en-US', 'pt-br' => 'pt-BR', 'ja-jp' => 'ja-JP', 'ja' => 'ja-JP',
|
23
|
+
'pt' => 'pt'}`
|
24
|
+
- Note that `en` and `ja` are added as fallbacks for `en-US` and `ja-JP` respectively, but *not*
|
25
|
+
for `pt-BR` because `pt` is already in the list later.
|
26
|
+
|
27
|
+
Now to match a user's preferred locales:
|
28
|
+
|
29
|
+
1. Start with preferred locales:
|
30
|
+
- `['en-US', 'fr', 'ja-JP', 'en']`
|
31
|
+
2. Normalize them to lowercase:
|
32
|
+
- `['en-us', 'fr', 'ja-jp', 'en']`
|
33
|
+
3. Add "implicit" locales as fallbacks:
|
34
|
+
- `['en-us', 'fr', 'ja-jp', 'ja', 'en']`
|
35
|
+
- As above, note that `en` is *not* added as a fallback for `en-us` because it is already in the
|
36
|
+
list.
|
37
|
+
4. Filter out locales that are not available:
|
38
|
+
- `['en-us', 'ja-jp', 'ja', 'en']`
|
39
|
+
5. Convert to the canonical form
|
40
|
+
- `['en-US', 'ja-JP', 'ja-JP', 'en-US']`
|
41
|
+
6. Remove duplicates
|
42
|
+
- `['en-US', 'ja-JP']`
|
43
|
+
|
8
44
|
## Installation
|
9
45
|
|
10
46
|
Install the gem and add to the application's Gemfile by executing:
|
@@ -30,13 +66,13 @@ preferred_locale = PreferredLocale.new(available: ['en', 'fr', 'es'])
|
|
30
66
|
Then, you can find the available locales from a given list of locales from the user:
|
31
67
|
|
32
68
|
```ruby
|
33
|
-
preferred_locale.acceptable_for(['en-US', 'fr', 'ja-JP']) # => ['en', 'fr']
|
69
|
+
preferred_locale.acceptable_for(locales: ['en-US', 'fr', 'ja-JP']) # => ['en', 'fr']
|
34
70
|
```
|
35
71
|
|
36
72
|
Or you can just get the best one:
|
37
73
|
|
38
74
|
```ruby
|
39
|
-
preferred_locale.preferred_for(['en-US', 'fr', 'ja-JP']) # => 'en'
|
75
|
+
preferred_locale.preferred_for(locales: ['en-US', 'fr', 'ja-JP']) # => 'en'
|
40
76
|
```
|
41
77
|
|
42
78
|
### With Rails
|
data/lib/preferred_locale.rb
CHANGED
@@ -15,14 +15,20 @@ class PreferredLocale
|
|
15
15
|
obj[locale_str.downcase] = locale
|
16
16
|
# Add the language without a country if it's not already in the list
|
17
17
|
language = locale_str.downcase.split('-')[0]
|
18
|
-
obj[language] = locale unless available_lower.include?(language)
|
18
|
+
obj[language] = locale unless available_lower.include?(language) || obj.key?(language)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def acceptable_for(locales: [])
|
23
|
+
locales_lower = locales.map { |locale| locale.to_s.downcase }
|
23
24
|
# Build a candidate list including our implicit candidate locales
|
24
|
-
candidates =
|
25
|
-
|
25
|
+
candidates = locales_lower.flat_map do |locale|
|
26
|
+
language = locale.split('-')[0]
|
27
|
+
[
|
28
|
+
locale,
|
29
|
+
# Add the language without a country if it's not already in the list
|
30
|
+
(language unless locales_lower.include?(language))
|
31
|
+
].compact
|
26
32
|
end
|
27
33
|
|
28
34
|
# Figure out which candidates are available
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: preferred_locale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emma Lejeck
|
@@ -37,6 +37,7 @@ metadata:
|
|
37
37
|
homepage_uri: https://github.com/hummingbird-me/preferred_locale
|
38
38
|
source_code_uri: https://github.com/hummingbird-me/preferred_locale
|
39
39
|
changelog_uri: https://github.com/hummingbird-me/preferred_locale/blob/main/CHANGELOG.md
|
40
|
+
rubygems_mfa_required: 'true'
|
40
41
|
post_install_message:
|
41
42
|
rdoc_options: []
|
42
43
|
require_paths:
|