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

Tom*_*Tom 16 ruby-on-rails internationalization

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

def default_url_options(options={})
  { :locale => I18n.locale }
end
Run Code Online (Sandbox Code Playgroud)

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

我需要的 :

  • 地区未知: 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
Run Code Online (Sandbox Code Playgroud)

整码:

ApplicationController.rb:

before_filter :set_locale
def set_locale
  I18n.locale = params[:locale]
end

def default_url_options(options={})
  { :locale => I18n.locale }
end
Run Code Online (Sandbox Code Playgroud)

的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'
Run Code Online (Sandbox Code Playgroud)

fre*_*lon 24

所选答案完全正确,并提供了将没有语言环境的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
Run Code Online (Sandbox Code Playgroud)

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

  • 您不认为从 Google 的角度来看您会有重复的内容(相同的内容存在于两个不同的位置)? (2认同)

apn*_*ing 8

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

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

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

def set_locale
  I18n.locale = params[:locale] || :en
end
Run Code Online (Sandbox Code Playgroud)