在不传递参数的情况下在 ActiveAdmin 中切换语言(语言环境)
Switching language (locale) in ActiveAdmin without passing a parameter
我希望能够在我的 ActiveAdmin 应用程序中切换语言环境。
到目前为止,我已经关注 this guide on switching-locale,它实际上提到了我遇到的问题:
You will notice, however, that all links keep the default locale of your app.
所以在我的例子中,一旦我切换语言环境,url 就会保持不变
localhost:3000/en/admin/users
而不是
localhost:3000/de/admin/users
指南也提出了解决方案:
You can override this default locale by passing the locale to all _path
methods.
但这似乎很容易出错,而且工作量很大。
所以看起来 ActiveAdmin 使用 I18n.locale
一次来创建所有的 url,之后不考虑对 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
首先您需要将 :locale 范围定义为可选,这可以使用以下代码完成:
scope '(:locale)' do
#your routes
end
在 ApplicationController 中放置用于启用默认范围的代码之后:
def default_url_options(options={})
options.merge({locale: I18n.locale})
end
好的,所以我终于弄明白发生了什么事了。
我最初是按照 rails guide 设置我的 routes.rb:
# config/routes.rb
scope "/:locale" do
resources :books
end
导致如下错误:
No route matches {:action=>"index", :controller=>"admin/users"} missing required keys: [:locale]
这是 "fixed" 通过设置
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
现在 url 已按预期生成。
我希望能够在我的 ActiveAdmin 应用程序中切换语言环境。 到目前为止,我已经关注 this guide on switching-locale,它实际上提到了我遇到的问题:
You will notice, however, that all links keep the default locale of your app.
所以在我的例子中,一旦我切换语言环境,url 就会保持不变
localhost:3000/en/admin/users
而不是localhost:3000/de/admin/users
指南也提出了解决方案:
You can override this default locale by passing the locale to all
_path
methods.
但这似乎很容易出错,而且工作量很大。
所以看起来 ActiveAdmin 使用 I18n.locale
一次来创建所有的 url,之后不考虑对 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
首先您需要将 :locale 范围定义为可选,这可以使用以下代码完成:
scope '(:locale)' do
#your routes
end
在 ApplicationController 中放置用于启用默认范围的代码之后:
def default_url_options(options={})
options.merge({locale: I18n.locale})
end
好的,所以我终于弄明白发生了什么事了。
我最初是按照 rails guide 设置我的 routes.rb:
# config/routes.rb
scope "/:locale" do
resources :books
end
导致如下错误:
No route matches {:action=>"index", :controller=>"admin/users"} missing required keys: [:locale]
这是 "fixed" 通过设置
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
现在 url 已按预期生成。