我目前有需要语言环境的路由(即/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 生产版本出现之前,我别无选择,只能解决这个路由问题。
任何帮助,将不胜感激。