1

我目前有需要语言环境的路由(即/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

除了使用路由过滤器 gem 之外,我在这个特定问题上没有找到任何东西。我正在使用 gem,但在 Rails 4 的 gem 生产版本出现之前,我别无选择,只能解决这个路由问题。

任何帮助,将不胜感激。

4

1 回答 1

1

我发现你的问题相当混乱......所以我的回答将参考你代码的某些部分。也许这为您提供了足够的上下文来解决您的问题。

  1. 不要为语言环境使用 3 条路线

一条路线就够了,请阅读国际化指南

我认为您必须采用可选方法,因为您想支持旧版网址:

scope "(/:locale)" {}

  1. 使用config.default_locale选项

在配置中,您可以为本地化配置后备。

  1. 不要混合default_url_optionscookies

如果您使用 cookie 来跟踪您的语言环境,您可以跳过default_url_options,您必须保留未本地化的版本以实现向后兼容性。

如果你必须有类似domain.com/en/something的网址,请反过来做。避免使用 cookie,在任何地方使用 URL 并重定向从旧 url 进来的人。

于 2013-10-21T12:57:43.133 回答