如何在 rails 中通过 cookie 设置语言环境?
How can I set locale by cookies in rails?
我目前正在制作我的国际网站,我想我不想更改 URL 来更改语言环境或将语言环境的参数添加到 URL 因为有很多页。
所以,我正在尝试使用 cookie 来更改语言环境。
我首先想知道这是否可能。
我想出的步骤是这样的。
1:在视图中,设置两个链接,一个是英文,一个是波兰文。
2:选择语言时,locale的数据保存在cookies中。
3:一旦用户选择了语言,用户访问的其他页面将以用户选择的语言编写。
如果可以,请告诉我怎么做。
是的,这没有问题。您可以 load cookie values on server-side 没有太多问题,您可以使用 lng/language 或您选择的任何名称。希望您生成 HTML 文件而不是静态渲染它们。如果是这样,那么您可以使用本质上是一个数组的数据结构,其中包含语言,每个语言项都包含一组键值对,其中键是消息的名称,值是消息值。
示例:
- 你有一个包含两个项目的数组,“en”和“pl”
- 项目是散列
- 两个项目有相同的键
- 每个项目在其散列中都有一个“问候语”键
- “pl”项的“问候语”是“Polak, Węgier, dwa bratanki, i do szabli, i do szklanki”(我知道的唯一波兰语),“en”是同一句话英文版
- 您将对所有文本进行类似操作
现在,无论您是在服务器端还是在客户端呈现页面,您都需要有一种方法来读取这个数组,并且当您从它读取时,知道选择的语言是什么。
关于在客户端更改cookie,你可以很容易地做到,比如
document.cookie = "lng=pl";
您需要为此包装一个事件,例如点击旗帜之类的,但这是基本思路。
作为解决方案之一,您可以通过带有参数的链接传递语言环境。但是您需要在 ApplicationController
中进行一些更改(请参阅代码注释):
before_action :set_locale
# Method for change URL helpers
def default_url_options
{ locale: I18n.locale }
end
def set_locale
if params[:locale].present?
cookies.permanent[:locale] = params[:locale] # save cookies
end
locale = cookies[:locale]&.to_sym # read cookies
if I18n.available_locales.include?(locale)
I18n.locale = locale # use cookies locale
end
end
例如,将您的 routes.rb
更改为:
scope '(:locale)', locale: /#{I18n.available_locales.join('|')}/ do
# your routes here
end
现在您可以使用指向当前页面的链接,并将语言环境作为参数传递,例如:
<%= link_to 'PL', url_for(locale: :pl) %>
<%= link_to 'EN', url_for(locale: :en) %>
我目前正在制作我的国际网站,我想我不想更改 URL 来更改语言环境或将语言环境的参数添加到 URL 因为有很多页。 所以,我正在尝试使用 cookie 来更改语言环境。 我首先想知道这是否可能。 我想出的步骤是这样的。
1:在视图中,设置两个链接,一个是英文,一个是波兰文。
2:选择语言时,locale的数据保存在cookies中。
3:一旦用户选择了语言,用户访问的其他页面将以用户选择的语言编写。
如果可以,请告诉我怎么做。
是的,这没有问题。您可以 load cookie values on server-side 没有太多问题,您可以使用 lng/language 或您选择的任何名称。希望您生成 HTML 文件而不是静态渲染它们。如果是这样,那么您可以使用本质上是一个数组的数据结构,其中包含语言,每个语言项都包含一组键值对,其中键是消息的名称,值是消息值。
示例:
- 你有一个包含两个项目的数组,“en”和“pl”
- 项目是散列
- 两个项目有相同的键
- 每个项目在其散列中都有一个“问候语”键
- “pl”项的“问候语”是“Polak, Węgier, dwa bratanki, i do szabli, i do szklanki”(我知道的唯一波兰语),“en”是同一句话英文版
- 您将对所有文本进行类似操作
现在,无论您是在服务器端还是在客户端呈现页面,您都需要有一种方法来读取这个数组,并且当您从它读取时,知道选择的语言是什么。
关于在客户端更改cookie,你可以很容易地做到,比如
document.cookie = "lng=pl";
您需要为此包装一个事件,例如点击旗帜之类的,但这是基本思路。
作为解决方案之一,您可以通过带有参数的链接传递语言环境。但是您需要在 ApplicationController
中进行一些更改(请参阅代码注释):
before_action :set_locale
# Method for change URL helpers
def default_url_options
{ locale: I18n.locale }
end
def set_locale
if params[:locale].present?
cookies.permanent[:locale] = params[:locale] # save cookies
end
locale = cookies[:locale]&.to_sym # read cookies
if I18n.available_locales.include?(locale)
I18n.locale = locale # use cookies locale
end
end
例如,将您的 routes.rb
更改为:
scope '(:locale)', locale: /#{I18n.available_locales.join('|')}/ do
# your routes here
end
现在您可以使用指向当前页面的链接,并将语言环境作为参数传递,例如:
<%= link_to 'PL', url_for(locale: :pl) %>
<%= link_to 'EN', url_for(locale: :en) %>