ruby-on-rails 如何避免I18n::InvalidLocale?

gojuced7  于 2023-04-22  发布在  Ruby
关注(0)|答案(2)|浏览(179)

我得到一个I18n::InvalidLocale: "zh-CN" is not a valid locale异常,我想避免。

要解决,我听说过两个hack:

# meh
config.i18n.enforce_available_locales = false

# Ever heard of convention over configuration?
config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

它们对我来说似乎都不干净,因为在不接触这些配置变量的情况下,我已经有了一堆自动预填充的可用区域设置:

我当前的available_locales是:

> I18n.available_locales
=> [:en, :fr]   (misses zh-CN and zh-TW)

在我的config/locales文件夹中,我有:

en.yml
fr.yml
zh-CH.yml (newly added, and unavailable)
zh-TW.yml (newly added, and unavailable)

在我的config/application.rb中,我有:

config.i18n.default_locale = :fr

我不明白fr是如何自动进入I18n.available_locales的,而zh-CNzh-TW却没有。
然而,让fr输入它 * 而不 * 我设置config.i18n.available_locales告诉我,触摸这个配置变量 * 并不是一个干净的方法 *。
你有没有在正确的级别上避免I18n::InvalidLocale异常的提示?

b1uwtaje

b1uwtaje1#

i18 n库对locale键采取了务实的方法,包括只使用locale语言部分,如:en,:pl,而不使用region部分,如:en-US或:en-GB。如果您想要这种类型的定义,请检查一些gem,如globalize
还请检查以下链接:

并删除config.i18n.default_locale = :fr
因为使用默认的语言环境,它将经历你提到的相同的错误,所以在删除默认的语言环境之后,用途:config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

4dc9hkyq

4dc9hkyq2#

不要将区域设置设置为无效值。

class ApplicationController < ActionController::Base
  before_action :set_locale

  def set_locale
    [params[:locale], cookies[:locale], extract_locale, I18n.default_locale].each do |l|
      if l && I18n.available_locales.index(l.to_sym)
        I18n.locale = l
        break
      end
    end
    cookies[:locale] = params[:locale] if params[:locale]
  end

  def extract_locale
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE']
  end

进行测试以确保区域设置存在,然后再进行设置。

相关问题