如果您遵循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
)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'
答案 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
对我而言,这是最好的方式,但你需要购买所有域名。