【问题标题】:How to configure Rails routes to accommodate i18n如何配置 Rails 路由以适应 i18n
【发布时间】:2012-12-08 03:26:59
【问题描述】:

我正在为 Rails 应用程序添加国际化,并且或多或少遵循了相关的 Rails GuideRailscast

我遇到了两个问题:

  1. 如何添加重定向到当前语言环境的“主页”链接。目前我有 root_path 链接,但由于 routes.rb 中的行旨在获取未作用域的根,这些链接都失败了。这意味着 root_path 始终指向默认语言环境,而不是当前语言环境。
  2. 我已在本地设置并运行所有内容(除了 上面的问题)但部署到 Heroku 的所有 url 似乎都在下降 通过我的路线文件并被其中一个抓住了。他们在 defulat 下重定向到 '/' 语言环境。

我的设置如下

application_controller.rb

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

private
def set_locale
  I18n.locale = params[:locale] if params[:locale].present?
end

routes.rb

scope ":locale", locale: /#{I18n.available_locales.join("|")}/  do
  all_my_routes

  # handles /valid-locale
  root to: 'home#index', as: "localized_root"
  # handles /valid-locale/fake-path
  match '*path', to: redirect { |params, request| "/#{params[:locale]}" }
end

# handles /
root to: redirect("/#{I18n.default_locale}")

# handles /bad-locale|anything/valid-path
match '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}")

# handles /anything|valid-path-but-no-locale
match '/*path', to: redirect("/#{I18n.default_locale}/%{path}")

我的主页链接:

<%= link_to "Home", root_path %>

【问题讨论】:

    标签: ruby-on-rails internationalization


    【解决方案1】:

    有一颗宝石可以出色地完成这项工作。 (https://github.com/svenfuchs/routing-filter) 您应该将以下代码添加到您的 Gemfile 中:

    gem 'routing-filter'
    

    并将以下内容添加到您的 routes.rb 文件中

    Rails.application.routes.draw do
      filter :locale
      ...
    end
    

    希望对你有帮助...

    【讨论】:

    • 感谢 Kzu,它看起来像一个有趣的宝石,而且我以前没有遇到过。但我认为在这种情况下它可能是矫枉过正。这一定是一个相当标准的用例?特别是第一个问题,我不禁认为我忽略了一些明显的事情(不确定现阶段 RE Heroku 发生了什么!!)。感谢您的任何想法。
    • Ksu,我正准备提交一个关于路由的问题,看到了你的回答。我看到了这颗宝石,但我想我有点累了,没有得到我需要做的事情。效果很好。
    【解决方案2】:

    看起来您可以在 Railscasts 上使用 the comment I wrote 来帮助您进行 I18n 路由。酷!

    至于您的第一个问题,您可以重新路由root to: redirect("/#{I18n.default_locale}") 以重定向到I18n.locale 吗?

    至于您的第二个问题,您是否也使用了 Railscast 评论中的测试或有自己的测试,如果是,它们是否通过了? Heroku 是否为您提供任何错误日志? ($ heroku logs)。我已经将这些路由部署到 Heroku 并按预期工作,所以我认为 Heroku 有可能不是问题。

    【讨论】:

    • 嗨@paul,是的,我“借用”了你的一些代码。谢谢!我设法通过一些调整来完成这项工作,我将发布我的步骤说明。
    【解决方案3】:

    经过一番反复,我最终得到了这个工作。问题是所有路线的捕获量 a) 捕获量超出了我的预期,并且 b) 在开发与部署中的表现明显不同(我不确定为什么会这样)。

    无论如何,首先我将范围更改为可选(注意括号):

    scope "(:locale)", .....
    

    这确保即使没有设置区域设置,范围内的路由也是有效的(这主要是为了处理我在回调等方面遇到的一些问题)。

    这让我可以删除两个root to 行,只保留

    root to "home#index"
    

    我删除了“handles /valid-locale/fake-path”行,这导致“/”路径出现问题。

    然后在范围之后保留以下全部内容(注意最后一个)。

    # handles /bad-locale|anything/valid-path
    match '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}")
    
    # handles /anything|valid-path-but-no-locale
    match '/*path', to: redirect("/#{I18n.default_locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }
    
    # handles /
    match '', to: redirect("/#{I18n.locale}")
    

    作为一个兴趣点,我还必须更新 action_mailer 以处理新的本地化 url。

    config.action_mailer.default_url_options = { :host => 'path.to.my.app.com', :locale => I18n.locale }
    

    现在看来一切正常!

    【讨论】:

    • 很高兴您能够以您想要的方式完成所有工作。如果我要改变任何东西,我想既然你选择了使用I18n.locale 作为你的包罗万象的方式,你可能可以在所有其他match 调用中使用它而不是I18n.default_locale,因为您正在重定向到“最后已知的语言环境”而不是“我不知道您想要什么语言环境,所以您获得了应用程序的默认语言环境”。另外,您是否编写了路由测试?如果是这样,并且您可以分享它们,请编辑您的答案并发布它们以供大家受益。
    【解决方案4】:

    这篇博文实际上非常详细地解释了它:

    当我似乎没有任何工作时,正是我正在寻找的东西

    http://dhampik.com/blog/rails-routes-tricks-with-locales

      scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do
        resources :posts    
        root to: "main#index"
      end
    
      root to: redirect("/#{I18n.default_locale}", status: 302), as: :redirected_root
    
      get "/*path", to: redirect("/#{I18n.default_locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})\/).*/}, format: false
    

    从根目录重定向到默认语言并执行许多其他操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 2016-08-18
      • 2011-02-21
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      相关资源
      最近更新 更多