Ruby on rails 如何避免在生成的URL中添加默认区域设置?

Ruby on rails 如何避免在生成的URL中添加默认区域设置?,ruby-on-rails,internationalization,Ruby On Rails,Internationalization,如果遵循,则所有生成的链接都包含locale参数(localhost/en/about、localhost/fr/about)。这是因为我们使用方法default\u url\u options始终添加区域设置参数: def default_url_options(options={}) { :locale => I18n.locale } end 当区域设置未知或默认时,是否可以从生成的url中删除区域设置参数? 我需要的是: 区域设置未知:mysite/about 地区en:m

如果遵循,则所有生成的链接都包含locale参数(localhost/en/about、localhost/fr/about)。这是因为我们使用方法
default\u url\u options
始终添加区域设置参数:

def default_url_options(options={})
  { :locale => I18n.locale }
end
当区域设置未知或默认时,是否可以从生成的url中删除区域设置参数?

我需要的是:

  • 区域设置未知:
    mysite/about
  • 地区en:
    mysite/about
    (而不是
    localhost/en/about
  • 语言环境fr:
    mysite/fr/about
我试图仅在不是默认设置的情况下设置区域设置,但结果是生成的链接从不包含区域设置参数

我试过很多像这样的东西


整个代码:

ApplicationController.rb:

routes.rb


我知道这不完全是你的问题但是

我更喜欢国际化的另一种方式:从域名设置语言环境

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


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

好的,我更了解。事实上,你几乎做到了

您只需要在Ruby中使用一个非常有用的运算符:
|

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

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

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

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

  • mysite.com/en/page
    应与
  • mysite.com/page
从默认区域设置查看时,所有链接都不应包含该区域设置,这意味着mysite.com中的链接不应包含默认区域设置(en)。而不是
mysite.com
链接到

  • mysite.com/en/page
    它应该链接到
  • mysite.com/page
我通过以下对
默认url\u选项的编辑实现了这一点:

def default_url_options(options={})
  { :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end
您必须在config/application.rb中定义
config.i18n.default\u locale
,才能使其工作。您还可以通过
config.i18n.fallbacks=[:en]
为不受支持的语言环境分配回退,其中该数组是要回退到的语言的优先级顺序列表。

Rails 4+


如果您不想通过URL传递它,您应该考虑将其存储在会话或Cookie中。当当前区域设置为默认时,我不想在URL中传递它。当这不是默认值时,将其放在url中是可以的。是的,我们希望避免购买所有域名。不要将语言和地区与国家混淆。这很有效!我认为如果不支持语言环境,那么将nil或其他设置设置为I18n.locale将被忽略,或者nil将被重置为默认语言环境。显然,情况并非如此。非常感谢你的回答!你不认为从谷歌的角度来看,你会有重复的内容吗(相同的内容存在于两个不同的位置)?
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'
def set_locale
  I18n.locale = params[:locale] || :en
end
def default_url_options(options={})
  { :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end
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