2015-09-25 10 views
6

私が避けたいと思っている例外はI18n::InvalidLocale: "zh-CN" is not a valid localeです。それを解決するためにI18n :: InvalidLocaleを避けるためのきれいな方法?

、私は2つのハックの聞いたことがある:これらの設定変数を触れることなく、私はすでにその使用可能なロケールの束を持っているので、それらの

# 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フォルダに

は、私が持っている:私のconfig/application.rb

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

を、私が持っている:

​​

私はzh-CNzh-TWがいないときfrは、I18n.available_localesを自動的に入っているか得ることはありません。 frを持つ

しかし、私はconfig.i18n.available_localesは、この構成変数に触れることを行くためのクリーンな方法ではないことを私に伝え設定ずにを入力してください。

レベルの例外を回避するためのヒントをお持ちですか?

+0

サーバーを再起動しますか? –

+0

huanに感謝しますが、そのトリックはしません。 –

+0

ホセ、 'config.i18n.fallbacks = true'とは何ですか? –

答えて

5

i18nライブラリは、en-USや:en-GBのように、en、:pl、地域の部分ではなく、ロケール( "言語")部分だけを含む実用的なロケールキーを使用しますあなたはこのタイプのデフネスチェックを望んでいます.Globalize3のような宝石はあなたを助けるかもしれません。また

このdescussionもあるため、デフォルトの地元の人々とconfig.i18n.default_locale = :fr を削除またthis

で通過し、チェックし、それはあなたがこのconfig.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

+0

これは本当に問題ではありませんでしたが、感謝します。私は最終的に中国語の翻訳の問題に直面するとき、私はあなたのリンクを確認することを忘れないでください。 *問題は、available_localesをグローバルに設定せずにI18nに利用可能なロケールを与える方法ですか? –

+0

@GwendalRouéが答えを更新しました – Arvind

+0

すべての権利リンクありがとう! –

0

ドン」defaullt 使用を削除した後にそのように記載されている同じエラーによるロケールを無効な値に設定しないでください。

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 

設定する前にロケールが存在することを確認するテスト。

関連する問題