rails2.2のi18nでAccept-Languageを見て振り分けをする

ruby-gettextだとAccept-Language見て、それに応じた表示をしてくれるようになっていたんだけど、今のとこi18nだとそこまでやってくれないっぽい。どうしようかなと思って調べていたら、http_accept_languageというプラグインがありました。

iain's http_accept_language at master ― GitHub
http://github.com/iain/http_accept_language/tree/master

vendor/plugins以下にhttp_accept_languageのファイルを置いて、app/controllers/application.rbを修正。

  before_filter :set_locale

  private
  def set_locale
    available = %w{ja en}

    if params[:locale]
      cookies[:locale] = {
        :value => params[:locale],
        :expires => 1.year.from_now
      }
    end

    I18n.locale = params[:locale] || cookies[:locale] || request.compatible_language_from(available)
  end

availableは用意してあるlocale用のファイルから取ってこれるといいけど、とりあえベタ書き。compatible_language_fromがavailableとAccept-Languageを見て、良さそうなのを返してくれる。en-USとかen-UKとか、言語だけじゃなくて国まで厳密に区別したい場合は、preferred_language_from。

あと、パラメータでlocaleが来たときは、それを優先して、Cookieも設定しておくようにしてみた。

ソースは30行くらいなので、本気で使うひとは一応ソースも確認しておくといいと思います。