在不传递参数的情况下在ActiveAdmin中切换语言(语言环境)

时间:2015-05-13 13:29:49

标签: ruby-on-rails-4 locale activeadmin rails-i18n

我希望能够在我的ActiveAdmin应用中切换我的语言环境。 到目前为止,我一直关注this guide on switching-locale,它实际上提到了我遇到的问题:

  

但是,您会注意到所有链接都保留了应用的默认语言区域。

所以在我的情况下,一旦我切换了语言环境,网址就会停留

  • localhost:3000/en/admin/users代替
  • localhost:3000/de/admin/users

该指南还提出了一个解决方案:

  

您可以通过将语言环境传递给所有_path方法来覆盖此默认语言环境。

但这似乎容易出错并且工作量很大。

因此看起来ActiveAdmin使用I18n.locale一次创建所有网址,并且在此之后不考虑对I18n.locale的更改。

如果您在 ApplicationController 中有意义:

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end

我试过覆盖

ActiveAdmin::Helpers::Routes.default_url_options

在我的ApplicationController中,没有帮助。

有谁知道如何解决这个问题?

修改

我也设置了这些并尝试了scope方法的不同变体。

路线

scope '(/:locale)', locale: /en|de/, defaults: { locale: I18n.locale }
  ActiveAdmin.routes(self)
end

的ApplicationController

def default_url_options(options={})
  { locale: I18n.locale }.merge options
end

2 个答案:

答案 0 :(得分:2)

好的,所以我终于弄清楚发生了什么。

我最初跟随rails guide并设置了routes.rb:

# config/routes.rb
scope "/:locale" do
  resources :books
end

导致了如下错误:

  

没有路由匹配{:action =>“index”,:controller =>“admin / users”}缺少必需的密钥:[:locale]

通过设置

来“修复”
scope ':locale', defaults: { locale: I18n.locale } do
  ActiveAdmin.routes(self)
end

正如当前版本Switching locale guide中所建议的那样。 但是这会产生所有后续url_helpers的副作用,使用此区域设置生成url。 BTW at least one other person ran into this

我目前的解决方法可能是found here

 lib/active_admin/helpers/routes/url_helpers.rb
 def self.default_url_options         
    (Rails.application.config.action_mailer.default_url_options.merge({locale: ::I18n.locale})) || {}
 end

现在按预期生成网址。

答案 1 :(得分:0)

首先,您需要定义:locale scope as optional,可以使用以下代码完成:

scope '(:locale)' do
    #your routes
end

在ApplicationController之后,将该代码放入启用默认范围:

def default_url_options(options={})
    options.merge({locale: I18n.locale})
  end