2

バックエンドとしてglobalize3を使用してデフォルトのレールI18nを使用してアプリをローカライズしています。

デフォルトのフォールバックに自動的に移行する前に、国コード(つまり:fr-CA)でロケールを特定の言語()にフォールバックするように設定することは可能ですか?:fr各ロケール/国を手動で設定できることを知っています

config.i18n.fallbacks = {'fr-CA' => 'fr'}

ただし、各フォールバックを手動で追加する必要がなく、この動作を自動化すると便利です。

4

1 に答える 1

3

これを正確に達成するために、私はイニシャライザを持っています

I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)

詳細については、ソースコードを参照してください。

編集:

これは、ActionView LookupContextに厄介なバグがあり、ローカライズされたビューでは機能しないことを思い出させます(ただし、ロケールファイルでは正しく機能します)。まだ修正されていないようです。基本的に、ローカライズされたビュー(たとえば、長さのためにロケールファイルに格納するのに適さないヘルプページ)がある場合、fr-CAロケールはhelp.fr.html.erbというビューにフォールバックしません。ファイルにhelp.fr-CA.html.erbという名前を付ける、これを実行して、LookupContextに別の初期化子をモンキーパッチします。

module ActionView
  class LookupContext
    # Override locale= to also set the I18n.locale. If the current I18n.config object responds
    # to original_config, it means that it's has a copy of the original I18n configuration and it's
    # acting as proxy, which we need to skip.
    def locale=(value)
      if value
        config = I18n.config.respond_to?(:original_config) ? I18n.config.original_config : I18n.config
        config.locale = value[0,2] # only use first part of the locale in lookups
      end
      super(@skip_default_locale ? I18n.locale : default_locale)
    end
  end
end

別の編集:パッチはかなり粗雑であり、完全なロケールルックアップを壊し、言語だけを対象としていることに注意してください。完全に一致するビュー(言語-地域)も必要な場合は、私のコードを改善する必要があります!

于 2012-11-14T00:42:10.960 に答える