从URL中删除“?locale = en”

时间:2014-07-09 18:24:05

标签: ruby-on-rails ruby-on-rails-4

目标

点击链接时删除浏览器网址栏的?locale=en

注意:进程后面没有任何异步机制。我的意思是,当我点击某些内容时,没有window.history.pushState动态修改网址。

问题

我所做的一切都没有解决我的问题。

我尝试了什么

我仍然在寻找更多解决方案。

方案

我不想拥有本地化的管理面板,然后,我的路由如下:

scope '/(:locale)', locale: /#{I18n.available_locales.join("|")}/ do
  root to: 'welcome#index'
end

namespace :admin do
  get '/' => 'home#index'

  resources :products
end

但是当我点击管理员面板中的链接时,我仍然总是?locale=en。这就是我设置语言环境的方法:

# /app/controllers/application_controller.rb
def set_locale
  extracted_locale = params[:locale] || extract_locale_from_accept_language_header

  I18n.locale = (I18n::available_locales.include? extracted_locale.to_sym) ? 
                extracted_locale : I18n.default_locale
end

这是我的私有 extract_locale_from_accept_language_header方法:

# /app/controllers/application_controller.rb
private
def extract_locale_from_accept_language_header
  request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
end

诊断反应

如果我改变了这个:

I18n.locale = (I18n::available_locales.include? extracted_locale.to_sym) ? 
              extracted_locale : I18n.default_locale

为此:

I18n.locale = params[:locale] || I18n.default_locale

问题是部分已解决。不幸的是,这不是我真正想要的。如果没有其他方法可以解析用户的语言环境(例如,明确设置了网址的语言环境参数),我就会使用浏览器的语言处理。

1 个答案:

答案 0 :(得分:1)

您想要查看应用程序控制器中的default_url_options方法。这就决定了link_to如何创建网址,I18n.locale只是控制服务器端设置。如果您对不应获取locale参数的所有页面都有一个简单的定义,请在那里使用它。例如,

def default_url_options(options={})
  if params[:controller].include? "admin"
    locale: nil
  end
end