7

我正在为 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

路线.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

4 回答 4

8

经过一番来回之后,我最终得到了这个工作。问题是所有路线的捕获量是 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 }

现在一切似乎都在工作!

于 2012-12-21T10:47:57.160 回答
7

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

gem 'routing-filter'

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

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

希望能帮助到你...

于 2012-12-20T15:30:59.047 回答
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 重定向到默认 lang 并执行许多其他操作。

于 2013-11-20T15:17:22.753 回答
0

看起来你可以使用我在 Railscasts 上写的评论来帮助你的 I18n 路由。凉爽的!

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

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

于 2012-12-21T05:03:06.407 回答