Created
January 30, 2015 09:20
-
-
Save the-teacher/74eff284555ca6a53841 to your computer and use it in GitHub Desktop.
HTTP_ACCEPT_LANGUAGE, set locale, locale
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def set_locale_variables locale | |
I18n.locale = @request.session[:locale] = @request.cookies[:locale] = locale.to_s | |
end | |
def acceptable?(locale) | |
I18n.available_locales.map(&:to_s).include?(locale.to_s) | |
end | |
def set_locale(route_request = nil) | |
@request = try(:request) || route_request | |
# Если пришел параметр и он входит в список наших локализаций | |
# то установим эту локаль в куку, сессию и установим как текущую локаль рельса | |
# ну и в принципе нам тут больше делать нечего - можно уйти | |
if (new_locale = @request.params[:locale]) && acceptable?(new_locale) | |
return set_locale_variables(new_locale) | |
end | |
# Предположим, что в куке или сессии есть значение локали | |
# если это значение входит в список наших локализаций, то установим его как текущую локаль | |
# ну и в принципе нам тут больше делать нечего - можно уйти | |
if (current_locale = @request.cookies[:locale] || @request.session[:locale]) && acceptable?(current_locale) | |
return set_locale_variables(current_locale) | |
end | |
# Предположим, у нас нет никаких данных о локали, но есть заголовок HTTP_ACCEPT_LANGUAGE | |
# Пройдемся по всем полученным из заголовка локалям, и первую, входящую в список доступных локалей | |
# установим как текущую локаль | |
locales_from_accept_language.each do |lang| | |
return set_locale_variables(lang) if acceptable?(lang) | |
end | |
# Вообще, это не обязательно, но для единообразия вернем из метода локаль | |
# которая фактически будет показывать дефолтную локаль приложения | |
I18n.locale | |
end | |
def locales_from_accept_language | |
@locales_from_accept_language ||= begin | |
@request.env['HTTP_ACCEPT_LANGUAGE'].to_s \ | |
.gsub('q=', '').split(',') | |
.map { |x| x.split(';') } | |
.each { |x| x.push('1.0') if x.size == 1 } | |
.map { |x| [ x.first, x.last.to_f ] } | |
.map { |x| x.first.split('-').first.downcase } | |
.uniq | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment