Skip to content

Instantly share code, notes, and snippets.

@the-teacher
Created January 30, 2015 09:20
Show Gist options
  • Save the-teacher/74eff284555ca6a53841 to your computer and use it in GitHub Desktop.
Save the-teacher/74eff284555ca6a53841 to your computer and use it in GitHub Desktop.
HTTP_ACCEPT_LANGUAGE, set locale, locale
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