Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
698 views
in Technique[技术] by (71.8m points)

ruby on rails - How to avoid adding the default Locale in generated URLs?

If you follow the I18N Rails Guide, all generated links contain the locale parameter (localhost/en/about, localhost/fr/about). This is because we use the method default_url_options to always add the Locale parameter :

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

Is it possible to remove the locale parameter from the generated url when the locale is unknown or the default one ?

What I need :

  • Locale unknown : mysite/about
  • Locale en : mysite/about (and not localhost/en/about)
  • Locale fr : mysite/fr/about

I tried to only set the locale if it was not the default one, but the result is that the generated links never contain the locale parameter...

I tried many things like this one

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

Whole code :

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'
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The selected answer is totally right on and provides everything you need to redirect URLs without a locale to your default locale, but I wanted to do something a bit more and figured I'd share it with you.

I wanted to avoid having to use the default locale at all, that is to say

  • mysite.com/en/page should be the same as
  • mysite.com/page

AND all links when viewing from the default locale should NOT include the locale, meaning mysite.com should have links that do not include the default locale (en) in them. Instead of mysite.com linking to

  • mysite.com/en/page it should link to
  • mysite.com/page

I achieved this via the following edits to default_url_options:

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

You must define config.i18n.default_locale in config/application.rb for this to work. You can also assign fallbacks for unsupported locales via config.i18n.fallbacks = [ :en ] where that array is a priority-ordered list of languages to fallback to.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...