A gem to help you find the best locales between what you support and what a user prefers. In
practice, this usually means finding the best locale between I18n.available_locales and the
Accept-Language header from the request, but it could also be used to find the best locale between
something in your database and a user's preferences.
This is similar to the http_accept_language gem and
the preferred-locale JS library in that it attempts to
resolve mismatches in specificity (ie, en-US vs en), but differs slightly in algorithm and in
API design.
For available locales from the application:
- Start with available locales:
['en-US', 'pt-BR', 'ja-JP', 'pt']
- Normalize them to lowercase mapped to the original values:
{'en-us' => 'en-US', 'pt-br' => 'pt-BR', 'ja-jp' => 'ja-JP', 'pt' => 'pt'}
- Add "implicit" locales as fallbacks:
{'en-us' => 'en-US', 'en' => 'en-US', 'pt-br' => 'pt-BR', 'ja-jp' => 'ja-JP', 'ja' => 'ja-JP', 'pt' => 'pt'}- Note that
enandjaare added as fallbacks foren-USandja-JPrespectively, but not forpt-BRbecauseptis already in the list later.
Now to match a user's preferred locales:
- Start with preferred locales:
['en-US', 'fr', 'ja-JP', 'en']
- Normalize them to lowercase:
['en-us', 'fr', 'ja-jp', 'en']
- Add "implicit" locales as fallbacks:
['en-us', 'fr', 'ja-jp', 'ja', 'en']- As above, note that
enis not added as a fallback foren-usbecause it is already in the list.
- Filter out locales that are not available:
['en-us', 'ja-jp', 'ja', 'en']
- Convert to the canonical form
['en-US', 'ja-JP', 'ja-JP', 'en-US']
- Remove duplicates
['en-US', 'ja-JP']
Install the gem and add to the application's Gemfile by executing:
$ bundle add preferred_localeIf bundler is not being used to manage dependencies, install the gem by executing:
$ gem install preferred_localeTo use PreferredLocale directly, you can create a new instance with your available locales:
preferred_locale = PreferredLocale.new(available: ['en', 'fr', 'es'])Then, you can find the available locales from a given list of locales from the user:
preferred_locale.acceptable_for(locales: ['en-US', 'fr', 'ja-JP']) # => ['en', 'fr']Or you can just get the best one:
preferred_locale.preferred_for(locales: ['en-US', 'fr', 'ja-JP']) # => 'en'PreferredLocale can be used with Rails by including the PreferredLocale::AutoLocale module in your
controller, which will automatically set the locale based on the Accept-Language header from the
request.
After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run
the tests. You can also run bin/console for an interactive prompt that will allow you to
experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new
version, update the version number in version.rb, and then run bundle exec rake release, which
will create a git tag for the version, push git commits and the created tag, and push the .gem
file to rubygems.org.
Bug reports and pull requests are welcome on GitHub at https://github.com/hummingbird-me/preferred_locale.
The gem is available as open source under the terms of the MIT License.