更改语言环境但停留在当前页面
Changing locale but staying on the current page
我对我的网站进行了国际化。
我用了 https://github.com/enriclluelles/route_translator
每个 link 都在工作,具体取决于当前的语言环境
我有 2 个这样的按钮 : 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
按钮到 link 到 /en/how_it_works
我被告知要将语言环境作为参数传递,但我不想那样做,因为我不想像 /fr/how_it_works?locale=en
这样的大 link,而且我确定这是一个糟糕的设计
你得到的建议是最好的方法,不,你不会像你想的那样使用查询参数。
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
经过一些研究,我找到了一个基本的方法。我一开始以为这个东西已经在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(options = {controller: controller_name, action: action_name, locale: :en} , class: "navbar-item") do %>
<%= image_tag "gb.svg", size: "24x24" %>
<% end %>
用于在同一页面上显示 link,但更改语言环境并使用图像作为 link。
那呢? :
<%= link_to "English", current_page_params.merge(locale: :en) %>
查看更多信息:https://gorails.com/episodes/rails-link-to-current-page-with-params
我使用类似的设置,遇到了这个(旧)问题。 Matheus 的回答帮助我梳理了思路,对我来说解决方案非常简单
<%= 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]
我想与可能来访的其他人分享这个。再一次,内置 rails 具有用几行代码就可以完成令人惊奇的事情的能力。
快乐密码。
我对我的网站进行了国际化。 我用了 https://github.com/enriclluelles/route_translator
每个 link 都在工作,具体取决于当前的语言环境
我有 2 个这样的按钮 : 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
按钮到 link 到 /en/how_it_works
我被告知要将语言环境作为参数传递,但我不想那样做,因为我不想像 /fr/how_it_works?locale=en
这样的大 link,而且我确定这是一个糟糕的设计
你得到的建议是最好的方法,不,你不会像你想的那样使用查询参数。
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
经过一些研究,我找到了一个基本的方法。我一开始以为这个东西已经在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(options = {controller: controller_name, action: action_name, locale: :en} , class: "navbar-item") do %>
<%= image_tag "gb.svg", size: "24x24" %>
<% end %>
用于在同一页面上显示 link,但更改语言环境并使用图像作为 link。
那呢? :
<%= link_to "English", current_page_params.merge(locale: :en) %>
查看更多信息:https://gorails.com/episodes/rails-link-to-current-page-with-params
我使用类似的设置,遇到了这个(旧)问题。 Matheus 的回答帮助我梳理了思路,对我来说解决方案非常简单
<%= 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]
我想与可能来访的其他人分享这个。再一次,内置 rails 具有用几行代码就可以完成令人惊奇的事情的能力。
快乐密码。