如何避免在生成的URL中添加默认语言环境?

如果您按照I18N Rails指南进行操作 ,则所有生成的链接都包含locale参数(localhost / en / about,localhost / fr / about)。 这是因为我们使用方法default_url_options来始终添加Locale参数:

 def default_url_options(options={}) { :locale => I18n.locale } end 

当语言环境未知或默认语言环境时,是否可以从生成的URL中删除语言环境参数?

我需要的 :

  • Locale unknown: mysite/about
  • Locale en: mysite/about (而不是localhost/en/about
  • 区域设置fr: mysite/fr/about

我试图只设置语言环境,如果它不是默认语言环境,但结果是生成的链接永远不会包含语言环境参数…

我尝试了很多像这样的东西

 def default_url_options(options={}) if I18n.locale == :fr { :locale => I18n.locale } else { :locale => nil } end end 

整码:

ApplicationController.rb:

 before_filter :set_locale def set_locale I18n.locale = params[:locale] end def default_url_options(options={}) { :locale => I18n.locale } end 

的routes.rb

 scope "(:locale)", :locale => /en|fr/ do match 'about' => 'static_pages#about', :via => :get match 'contact' => 'static_pages#contact', :via => :get match '/' => 'search#index', :as => :search end root :to => 'search#index' 

好的我明白了。 的确,你几乎做到了。

你只需要一个非常有用的Ruby操作符: ||

如果存在第一个值,则使用它,否则考虑第二个参数。

 def set_locale I18n.locale = params[:locale] || :en end 

所选答案完全正确,并提供了将没有语言环境的URL重定向到默认语言环境所需的一切,但我想做更多的事情,并想到我会与您分享。

我想避免必须使用默认语言环境,也就是说

  • mysite.com/en/page应该是一样的
  • mysite.com/page

从默认语言环境查看时,所有链接都不应包含语言环境,这意味着mysite.com应该包含不包含默认语言环境(en)的链接。 而不是mysite.com链接到

  • 它应链接到的mysite.com/en/page
  • mysite.com/page

我通过对default_url_options的以下编辑实现了这一点:

 def default_url_options(options={}) { :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) } end 

您必须在config / application.rb中定义config.i18n.default_locale才能config.i18n.default_locale 。 您还可以通过config.i18n.fallbacks = [ :en ]为不支持的语言环境指定回退,其中该数组是要回退的优先级排序的语言列表。

Rails 4 + https://github.com/svenfuchs/routing-filter

 def set_locale I18n.locale = params[:locale] || I18n.default_locale end def default_url_options(options = {}) (I18n.locale.to_sym.eql?(I18n.default_locale.to_sym) ? {} : {locale: I18n.locale}).merge options end 

我知道这不是你的问题,而是……

我更喜欢国际化的另一种方式: 从域名设置区域设置

例如:mysite.com/about,mysite.fr/about

对我来说这是最好的方式,但你需要购买所有域名。