如何配置Rails路由以适应i18n

时间:2012-12-20 15:09:04

标签: ruby-on-rails internationalization

我正在向Rails应用添加国际化,并且或多或少地关注了相关的Rails GuideRailscast

我遇到了两个问题:

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

    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 %>
    

4 个答案:

答案 0 :(得分:9)

我最终在一些来回之后得到了这个工作。问题是,所有路线的捕获量都是a)超出我的预期,b)显然在开发与部署方面表现不同(为什么这应该是我不确定)。

无论如何,首先我改变范围使其成为可选(注意括号):

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

即使没有设置区域设置,这也确保了作用域路由有效(这主要是为了处理我遇到的回调等问题)。

这允许我删除两个root to行,只保留

root to "home#index"

我删除了&#34; handle / valid-locale / fake-path&#34;这一点,这导致了&#39; /&#39;路径。

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

# 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来处理新的本地化网址。

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

现在一切似乎都在发挥作用!

答案 1 :(得分:6)

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

gem 'routing-filter'

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

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

希望它有所帮助...

答案 2 :(得分:6)

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

正是我正在寻找什么似乎无法正常工作

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

从root重定向到默认语言并执行很多其他操作。

答案 3 :(得分:0)

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

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

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