2011-03-10 75 views
14

如果你按照I18N Rails Guide,所有生成的链接都包含locale参数(localhost/en/about,localhost/fr/about)。这是因为我们使用的方法default_url_options总是添加的语言环境参数:如何避免在生成的URL中添加默认的语言环境?

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

是否有可能从生成的URL删除区域设置参数时的语言环境是未知或默认的?

我需要什么:

  • 地点未知:mysite/about
  • 区域en:mysite/about(而不是localhost/en/about
  • 区域fr:mysite/fr/about

我试图只设置如果它不是默认的locale,但结果是生成的链接永远不会包含区域设置参数...

我想这样的一个

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

如果你不想通过URL来传递它,你应该考虑将其存储在会话或饼干。 – apneadiving 2011-03-10 20:30:45

+0

当前的语言环境是默认设置时,我不想在URL中传递它。如果这不是默认设置,则可以在url中使用它。 – Tom 2011-03-11 07:31:18

回答

7

好吧,我明白好多了。事实上,你几乎做到了。

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

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

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

它的工作原理!我认为如果不支持区域设置,那么将nil或其他设置设置为I18n.locale将被忽略,否则nil将被重置为默认区域设置。显然,情况并非如此。非常感谢您的回答! – Tom 2011-03-11 14:43:34

-2

我知道这确实不是你的问题,但...

我更喜欢另一种方式为internationalisations:从域名

设置语言环境例如:mysite.com/about,mysite.fr/about

对我来说这是最好的方法,但是你需要购买所有的d omains。

+4

是的,我们希望避免购买所有域名。 – Tom 2011-03-11 14:43:02

+2

不要将语言和区域设置与国家混淆。 – molf 2013-04-24 08:46:29

21

选择的答案是完全正确的,并提供您需要重定向的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.i18n.default_locale/application.rb这个工作。您还可以通过config.i18n.fallbacks = [ :en ]为不受支持的语言环境指定回退,其中该数组是备用语言的优先级排序列表。

+0

您不认为您会从Google的角度重复内容(相同的内容存在于两个不同的位置)吗? – Tom 2012-03-26 11:33:58

1

轨道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 
相关问题