更改区域设置但保留在当前页面上

时间:2016-07-07 22:56:21

标签: ruby-on-rails rails-i18n

我对我的网站进行了国际化。 我使用了https://github.com/enriclluelles/route_translator

每个链接都在运行,具体取决于当前的区域设置

我有两个这样的按钮:EN | FR

您可以单击它以更改区域设置。它的工作原理如下:

  if I18n.locale == :fr
    link_to('en', root_en_path)
  else
    link_to('fr', root_fr_path)
  end

唯一的问题是,如果我在我网站的某个页面上并且我更改了语言环境,它将返回到root_path

我想要的是保持同一页面。

例如:我有一个how_it_works页面

如果我在/fr/how_it_works,我希望EN按钮链接到/en/how_it_works

我被告知要将区域设置作为参数传递,但我不希望这样,因为我不想拥有像/fr/how_it_works?locale=en这样的大链接,而且我确信这是一个糟糕的设计

5 个答案:

答案 0 :(得分:1)

您给出的建议是最好的方法,不会,您不会按照自己的想法使用查询参数。

Rails.application.routes.draw do
  scope ':locale', constraints: { locale: /(en|fr)/ } do
   #define all your scopeable routes within here
  end
end

这样,您可以访问/en/how-it-works/fr/how-it-works。在ApplicationController中,您可以执行before action :set_locale,将区域设置设置为params[:locale]

希望更清楚并解决您的问题。

<强>更新

无法找到实现这一目标的更好方法,但这是我可以立即解决的方法:

url_params = params.to_h
if I18n.locale == :fr
  link_to('en', url_params.merge(locale: :en))
else
  link_to('fr', url_params.merge(locale: :fr)
end

答案 1 :(得分:1)

感谢good主为我带来解决方案!我刚刚遇到你们有同样的问题,所以这就是我用过的。

<%= link_to(options = {controller: controller_name, action: action_name, locale: :en} , class: "navbar-item") do %>
    <%= image_tag "gb.svg", size: "24x24" %>
<% end %>

用于显示指向同一页面的链接,但是更改区域设置并将图像用作链接。

答案 2 :(得分:0)

经过一番研究,我发现了一种基本的方法。我首先想到这个东西已经在route_translator中实现了,但显然没有。

解决方案:

  if I18n.locale == :fr
    en_uri = request.fullpath.gsub('/fr', '/en')
    good_link = en_uri[0, 3] == '/en' ? en_uri : root_en_path
    link_to('en', good_link)
  else
    fr_uri = request.fullpath.gsub('/en', '/fr')
    good_link = fr_uri[0, 3] == '/fr' ? fr_uri : root_fr_path
    link_to('fr', good_link)
  end

答案 3 :(得分:0)

我使用类似的设置,并且遇到了这个(旧)问题。 Matheus的回答帮助我整理了思路,对我来说解决方案很简单

['277', '40.52', '-36.59', '0.11', '-0.50', '-1.62', '30.17']
['277', '40.52', '-36.49', '0.18', '-0.04', '-1.66', '30.14']
['277', '40.51', '-36.39', '0.14', '-0.07', '-1.64', '30.15']

请注意,这是有效的,因为我在route.rb中使用了“范围”:

<%= link_to "fr", controller: controller_name, action: action_name, locale: "fr"  %>

这样,每个请求都会传递区域设置,并且获取它很容易

scope "(:locale)", locale: /en|fr/ do
  ...
end

我想与其他可能分享的人分享。再次,内置的滑轨可以用几行就可以完成令人惊奇的事情。

快乐鳕鱼。

答案 4 :(得分:-1)

那又如何呢? :

<%= link_to "English", current_page_params.merge(locale: :en) %>

详细了解:https://gorails.com/episodes/rails-link-to-current-page-with-params