preferred_locale 1.0.0 → 1.1.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 +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:
|