Rails I18n路由中间件

时间:2016-07-28 20:51:30

标签: ruby-on-rails ruby rails-i18n rack-middleware

我需要翻译我的网站,并且我为此目的使用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?

1 个答案:

答案 0 :(得分:0)

您使用区域设置作为路线的一部分是否有特殊原因?如果不是,我建议你按照Rails I18n guide建议在before_action钩子中设置区域设置,然后根据你的情况从cookie中获取它(代码是从Rails中引用的)指南):

before_action :set_locale

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