如何避免在生成的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
对我来说这是最好的方式,但你需要购买所有域名。