干净的方式避免I18n :: InvalidLocale?

时间:2015-09-25 08:41:16

标签: ruby-on-rails ruby-on-rails-4 rails-i18n

我得到了一个我想避免的I18n::InvalidLocale: "zh-CN" is not a valid locale例外。

要解决这个问题,我听说过两个黑客:

# 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

frI18n.available_locales没有zh-CN时,zh-TW无法自动输入fr

然而,让config.i18n.available_locales输入而不我设置I18n::InvalidLocale告诉我,触摸此配置变量不是干净的方式

您是否有提示避免正确级别的boolean isChecked = driver.findElement((By.xpath(xpath1))).isSelected(); 例外?

2 个答案:

答案 0 :(得分:5)

i18n库对语言环境键采用实用的方法,包括语言环境(“语言”)部分,如:en,:pl,而不是区域部分,如:en-US或:en-GB,如果你想要这种类型的定义检查很少有诸如Globalize3之类的宝石可以帮到你。

同时检查此descussion也会使用this

并删除config.i18n.default_locale = :fr 因为使用默认的本地化,它将通过您在删除defaullt后提到的相同错误 使用此config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

答案 1 :(得分:0)

不要将语言环境设置为无效值。

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

在设置之前测试以确保区域设置存在。