我目前有需要语言环境的路由(即/ en,/ fr等)。在某些时候,我使用了routes.rb中的所有语句:
scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do
scope "/:locale", defaults: { :locale => "en" } do
scope "/:locale" do
我知道如果我执行以下操作,如果路由不包含它将指向网站英文版的区域设置。但是,一旦页面显示,它不会像我想要的那样设置区域设置。如果我通过单击我的语言环境逻辑转到法语版本,则第一个链接将在链接中显示带有/ fr的页面的法语版本。但是,如果我单击法语页面上的其他链接,则语言环境将返回到英语,并且链接中不包含区域设置。
scope "(/:locale)", defaults: { :locale => "en" } do
以下是我的应用程序中我的区域设置链接的代码,用户可以单击标记图像或文本来更改区域设置:
<%= link_to_unless_current image_tag("english.jpg", alt: "#{t :english}"), locale: "en" %> <%= link_to_unless_current "#{t :english}", locale: "en" %>
<%= link_to_unless_current image_tag("french.jpg", alt: "#{t :french}"), locale: "fr" %> <%= link_to_unless_current "#{t :french}", locale: "fr" %>
我想做的是防止500系统错误,如果有人在网站本地化之前保存了链接。例如,如果他们有http://mywebsite.com/video,则会显示网站的英文版本并将区域设置设置为“en”。
这是我在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?) || cookies[:locale] || 'en'
cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale.to_s
end
除了使用routing-filter gem之外,我在这个特定问题上找不到任何东西。我正在使用gem,但是直到有Rails 4的gem的生产版本,我别无选择,只能想出这个路由问题。
任何帮助将不胜感激。
答案 0 :(得分:1)
我发现你的问题相当令人困惑......所以我的答案会引用你代码的某些部分。也许这会给你足够的背景来解决你的问题。
一条路线就够了,请阅读the guides for internationlization。
我认为您必须使用可选方法,因为您希望支持旧网址:
scope "(/:locale)" {}
config.default_locale
选项在配置中,您可以配置后备以进行本地化。
default_url_options
和cookies
如果您使用Cookie来跟踪您的语言环境,则可以跳过default_url_options
,无论如何都必须保留未定位的版本以便向后兼容。
如果你必须有像domain.com/en/something
这样的网址,那就相反了。避免使用cookie,在任何地方使用URL并重定向来自遗留URL的人。