0

我需要翻译我的网站,为此我使用 I18n。使用语言环境作为 URL 参数,我想将用户重定向到他们的语言环境,该语言环境保存在他们的 cookie 中。
这是我用来重定向的 routes.rb 中的字符串:

get "/path", to: redirect("/#{I18n.locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})/)./}, format: false

我正在使用 Rack 中间件来获取 cookie 并在路由之前设置 I18n.locale:

require 'i18n'

module Rack
  class Locale
    def initialize(app)
      @app = app
    end

    def call(env)
      request = ActionDispatch::Request.new(env)
      I18n.locale = request.cookies['locale'].to_sym if request.cookies['locale'].present? && request.params[:locale].nil?
      @app.call(env)
    end
  end
end

问题出在 routes.rb 文件中:I18.locale 始终设置为默认语言环境,因此没有重定向到用户的语言环境,而是重定向到默认语言环境。

另外,我调试了中间件,正如我所见, I18n.locale 成功设置在那里。

任何想法如何在 routes.rb 中设置 I18n.locale?

4

1 回答 1

0

您将语言环境用作路线的一部分是否有特殊原因?如果不是,我建议您遵循Rails I18n 指南,该指南建议在before_action钩子中设置语言环境,然后可以从 cookie 中获取它(代码引用自 Rails 指南):

before_action :set_locale

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end
于 2016-07-28T21:44:35.787 回答