我对我的网站进行了国际化。我用了 https://github.com/enriclluelles/route_translator
每个链接都在工作,具体取决于当前区域设置
我有 2 个这样的按钮:EN |法国
您可以单击它来更改区域设置。它的工作原理是这样的:
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
这样的大链接,我确信这是一个糟糕的设计
给你的建议将是最好的方法,不,你不会像你想象的那样使用查询参数。
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
.在应用程序控制器中,您可以执行一个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
感谢上帝给我带来解决方案!我刚刚遇到了你们同样的问题,所以这是我使用的。
<%= link_to(options = {controller: controller_name, action: action_name, locale: :en} , class: "navbar-item") do %>
<%= image_tag "gb.svg", size: "24x24" %>
<% end %>
用于显示指向同一页面的链接,但是更改区域设置并使用图像作为链接。
经过一番研究,我找到了一种基本的方法。我最初以为这个东西已经在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
我使用了类似的设置,并遇到了这个(旧)问题。马修斯的回答帮助我整理了我的想法,对我来说,解决方案很简单
<%= link_to "fr", controller: controller_name, action: action_name, locale: "fr" %>
<小时 />请注意,这是有效的,因为我在routes.rb中使用了"scope":
scope "(:locale)", locale: /en|fr/ do
...
end
这样,每个请求都会传递语言环境,并且获取它很容易
I18n.locale = params[:locale]
我想分享给其他可能来的人。再一次,内置导轨具有用几条线路做惊人事情的能力。
快乐的鳕鱼 .
怎么样?
<%= link_to "English", current_page_params.merge(locale: :en) %>
查看更多相关信息 : https://gorails.com/episodes/rails-link-to-current-page-with-params