This Rails gem makes use of the HTTP_ACCEPT_LANGUAGE http header sent by web browsers with every request, to set the
When this fails (for example if there is no such http header - as is the case for Google bot), it will try to determine the locale based on the toplevel domain suffix (so it will set
'de' for the
When both fail, it will fall back to
I18n.default_locale, which should be set in application’s
config/application.rb file (
'en' by default).
The HTTP_ACCEPT_LANGUAGE header parser is based on: https://github.com/iain/http_accept_language/blob/master/lib/http_accept_language.rb
The best way to use this gem is to combine it either with the exvo_globalize gem or any other I18n gem/configuration, which supports falling back to
I18n.translate() calls when the translation is not found in the desired language. This enables you to have the
I18n.locale set to
:jp but still display everything in English (for example) if you don’t have the Japanese translation of your web application.
When this gem is installed and someone visits your application using a Polish version of Firefox the following http header will be sent:
I18n.locale will be set to
Install the gem
$ gem install locale_detector
add it to the Gemfile
Locale autodetection is done via a
set_locale, which is run before every controller action when you bundle this gem. Beware, that the
set_locale filter will most likely be run first, before your other application defined filters, so if you’d like to update the
session[:language] in your
before_filter (to reflect the change of display language by the user) you have to place a call to
set_locale just after setting the
sessinon[:language] (also see the notes below on "Turning off the language detection").
In certain cases we might want to turn off the locale/language autodetection. For example, we might want to give the user the ability to set his preferred language in his profile and respect this setting.
In order to do that, you need to set a
:language session key in your app:
session[:language] = 'pl'
In consequence, regardless of the user browser’s language, the
I18n.locale will be set to
Exemplary controller code for letting the user set his desired display language follows (note, that we have an empty language with the display value "Autodetect (browser language)", which the user can choose).
class UsersController < ApplicationController def update if @user.update_attributes(params[:user]) if @user.language.present? # set I18n.locale based on user’s preference I18n.locale = session[:language] = @user.language else # clear session language and autodetect the locale session.delete(:language) set_locale end ... end end end
Copyright © 2011 Exvo.com Development BV, released under the MIT license