在当前页面上切换区域设置

时间:2015-05-29 07:26:32

标签: ruby-on-rails ruby friendly-id globalize

我目前正在开展一个有2个不同地方(nl / fr)的项目。

我们正面临这个问题:当我显示fr / nl按钮时,如何获取当前页面的已翻译网址

我目前正在使用friendly_id和globalize

我们已经尝试过:

= link_to "nl", params.merge(locale: "nl")
= link_to "nl", url_for(:locale => :nl)

当用英语加载页面时(localhost:3000 / c / animaux),我们都会改变当前的语言,但正如我们所说的那样friendly_url

我们应该

localhost:3000/nl/c/dieren

而不是

localhost:3000/nl/c/animaux 

我有很多链接要翻译,所以我希望有一条铁路可以做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以将资源传递给url_for:

= link_to "nl", params.merge(locale: "nl", id: @resource.id)

如果代码重复太多,你可以创建一个帮助器:

# Try to guess the resource from controller name
# @param [String] locale
# @param [Hash] options - passed on to url_for
#   @option options [String] :text the text for the link
#   @option options [Object] :resource the model to link to.
def page_in_other_locale(locale, options = {})
  opts = params.dup.merge(options).merge(locale: locale)
  text = opts[:text] || locale     
  resource = nil

  if opts[:resource] 
    resource = opts[:resource]
  else
    resource = controller.instance_variable_get?(":@#{controller_name.singularize}")
  end

  opts.merge!(id: resource.try(:id)) if resource
  link_to(text, opts.except(:text, :resource))
end

另一种选择是使用I18n.with_locale,它允许您在另一个区域设置中运行块:

I18n.with_locale(:nl) do
  link_to('nl', params.merge(id: category.name))
end