【问题标题】:Rails I18n routes with middleware带有中间件的 Rails I18n 路由
【发布时间】:2016-07-28 20:51:29
【问题描述】:

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

get "/<em>path", to: redirect("/#{I18n.locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})/).</em>/}, 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 吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • guides.rubyonrails.org/… 这是将语言环境设置为 url 一部分的主要原因 - 我想使用看起来相同的链接,而不是依赖于 cookie。但我也不想给我当前的客户带来麻烦,他们将我网站的链接设置为他们的书签等。
    • 我明白了。然后再向下滚动到 2.2.2,有一个解释如何在路由中使用区域设置范围
    • 我对 2.2.2 没有问题,如果用户设置不是默认语言环境,我在重定向到当前用户语言环境时遇到问题。
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 2018-03-15
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多