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

时间:2011-03-10 15:00:03

标签: ruby-on-rails internationalization

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

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

当区域设置未知或默认区域时,是否可以从生成的网址中删除区域设置参数?

我需要什么:

  • 区域设置未知:mysite/about
  • 区域设置: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'

4 个答案:

答案 0 :(得分:23)

所选答案完全正确,并提供了将没有区域设置的网址重定向到默认区域设置所需的一切,但我想做更多的事情,并想到我会与您分享。

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

  • 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.fallbacks = [ :en ]为不受支持的区域设置分配回退,其中该数组是要回退的优先级排序的语言列表。

答案 1 :(得分:8)

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

你需要一个非常有用的Ruby运算符:||

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:-2)

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

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

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

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