我正在向Rails应用添加国际化,并且或多或少地关注了相关的Rails Guide和Railscast。
我遇到了两个问题:
我的设置如下
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 %>
答案 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有可能不是问题。