如何在 Rails 的多语言应用程序中处理 i18n 和 cookie?



我正在开发一个具有以下场景的应用程序:

1-整个应用程序的基本语言是en-us。 2-该应用程序有一些将使用en-ca和fr的页面 3-我在应用程序上使用i18n。

问题就在这里。我有一个语言选择器,以防页面有多种语言。

此语言选择器应将用户的选择存储在 Cookie 上。如果存在此cookie,则我不再在任何其他页面中显示选择器。

问题。如果用户是新用户,并且尝试呈现多语言页面,则应选择语言。

如果用户已经选择了一种语言,但在另一个页面中只有英文页面,则应呈现英语页面,并且不显示选择器。

如果用户已选择一种语言,并且页面具有多种语言,则呈现的页面应该是具有所选语言的页面。

在这种情况下,有什么更好的方法?饼干就够了吗?有人知道要处理的宝石吗?

任何帮助,不胜感激。谢谢

正如@max评论中所说,最好使用 locale 参数,并且有非常有用的 gem 可以轻松做到这一点。

使用路由筛选器 (https://github.com/svenfuchs/routing-filter(,您可以在路由前面加上区域设置。 要做到这一点,你只需在路线的顶部添加filter :locale

然后,使用 http_accept_language (https://github.com/iain/http_accept_language( 可以快速管理区域设置。在文档中,您可以看到您只能包含HttpAcceptLanguage::AutoLocale但我个人就是这样做的:

# config/application.rb
config.i18n.available_locales = %w[fr en]
config.i18n.fallbacks = true
config.i18n.default_locale = :fr
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
# ApplicationControler
before_action :set_locale
def default_url_options(options = {})
  { locale: I18n.locale }
end
def set_locale
  I18n.locale = params[:locale] || http_accept_language.compatible_language_from(I18n.available_locales)
end

此代码将使用 locale 参数作为 I18n.locale,如果您只转到根目录,则区域设置将是浏览器的区域设置。

要在语言环境之间切换,你只需要做这样的事情:

- I18n.available_locales.each do |key|
  - next if key == I18n.locale
  = link_to locale: key do
    = key.to_s.capitalize

上面的代码循环访问可用的区域设置,并生成指向当前路径的链接,但使用不同的区域设置。application_controller中的代码会将此区域设置保留为"默认"。

最新更新