如何在 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) %>