数据库中的语言环境信息

locale information in database

我是 rails 上 ruby 的新手,我试图找出一种根据每个用户选择的国家/地区设置区域设置的方法。

我将语言环境标签(如 :en)存储在数据库中,但当我尝试将其设置为 I18n.locale 时,它被识别为字符串并给出“:en”不是有效的语言环境错误。如何将字符串转换为 R18n.locale 对象?

你看过the docs了吗?

引自那里:

2.2.1 从域名设置语言环境

您可以选择从运行应用程序的域名设置语言环境。例如,我们希望 www.example.com 加载英语(或默认)语言环境,www.example.es 加载西班牙语语言环境。因此顶级域名用于区域设置。这有几个优点:

语言环境是 URL 的明显部分。 人们直观地掌握内容将以何种语言显示。 在 Rails 中实现起来非常简单。 搜索引擎似乎喜欢不同语言的内容存在于不同的、相互关联的域中。

您可以在您的 ApplicationController 中像这样实现它:

before_action :set_locale

def set_locale
  I18n.locale = extract_locale_from_tld || I18n.default_locale
end

# Get locale from top-level domain or return +nil+ if such locale is not available
# You have to put something like:
#   127.0.0.1 application.com
#   127.0.0.1 application.it
#   127.0.0.1 application.pl
# in your /etc/hosts file to try this out locally

def extract_locale_from_tld
  parsed_locale = request.host.split('.').last
  I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
end

您没有说明您的语言来源。如果您尝试使用 URL,那么文档已经回答了您的问题。如果您使用其他方法而不是此行可能仍然有用:

I18n.available_locales.map(&:to_s).include?(my_locale) ? my_locale : nil

其中 my_locale 是您尝试使用的语言环境。

如果有帮助请告诉我!

编辑:

似乎语言环境存储为 "en" 或 "uk",因此请确保您的字符串匹配。我测试了以下代码,它对我有用

def set_locale
  I18n.locale = current_user.try(get_locale(<current_user.locale>) || I18n.default_locale
end

def get_locale(my_loc)
    I18n.available_locales.each do |loc|
        if loc.to_s == my_loc
            return loc
        end
    end
    nil
end