言語ネゴシエーション のバックアップ(No.13)

更新


公開メモ

Rails で言語ネゴシエーション(Language Negotiation)

http://blog.omdb-beta.org/

を見ながら、ブラウザの Language Negotiation の機能を使って rails アプリケーションの多言語化する方法を調べてみた。

rails のバージョンが上がっているせいと、それ以外の問題とで、 結局かなりの部分を1から書いたので、ここにメモしておく。

やりたいこと

  1. views/*/*.html.ja.erb とか views/*/*.html.en.erb とか、言語ごとに テンプレートファイルを作っておき、閲覧者の環境設定、手動選択に合わせて 自動的に言語別テンプレートを切り替えて使う
  2. キャッシュされたページも apache のネゴシエーション機能を使って 自動で言語を切り替えて送信できるようにする

の2点。

rails アプリケーションには、通常通り

http://rails.server/controller
http://rails.server/controller/action
http://rails.server/controller/action/id
http://rails.server/controller/action/id.html

などの他、

http://rails.server/controller.ja
http://rails.server/controller/action.ja
http://rails.server/controller/action/id.ja
http://rails.server/controller/action/id.html.ja

のように言語を指定した形でもアクセス可能とする。

言語指定の無いアドレスでアクセスされたときには ブラウザとのネゴシエーションによって使うテンプレートを決める。

ブラウザ側の言語の優先順位

1. は、ブラウザの言語設定で日本語と英語のどちらを優先しているかを判別して、 優先順位の高い方で表示するという話。

ブラウザはこの言語設定を元に、Accept-Language: というヘッダ情報をサーバーに 送るので、rails 側でこのヘッダ情報から表示言語を選べばよい。

キャッシュに対する apache2 の言語ネゴシエーション

2. について。

rails のページキャッシュ機能は、表示内容を .html ファイルとして保存する事で、 次回からは rails を通さず、apache で直接処理させるというものなので、
適切な名前でキャッシュファイルを作成する事と、
apache2 にキャッシュファイルを正しく認識させる事と、
が必要になる。

その他の多言語化情報

rails アプリの多言語化については他にも、

などがあるようだけれど、よく調べていない。

ActiveHeart と GetText については、今後調べてみる必要がありそうだ。

試行錯誤の経過

  1. 開発&テスト用環境の構築
    • negotiation という名前のアプリケーションの作成
    • 開発用サーバーの起動と環境の確認
    • test コントローラとビューの作成
  2. routesの設定と言語選択の優先順位
    • 多言語化したビューの作成
    • config/routes.rb の設定
    • 言語が指定されていない時を含めた言語選択の優先順位]]
  3. 言語別テンプレートの選択
    • 言語の優先順位を元に利用するテンプレートを選択する]]
      • memoize について
    • テンプレートファイルの拡張子を正しく認識させる
  4. キャッシュの多言語対応
    • ページキャッシュの多言語対応
    • ページキャッシュの多言語化に対応させるための apache の設定
    • アクションキャッシュの多言語対応
    • フラグメントキャッシュの多言語対応
  5. プラグイン化と公開準備
    • プラグイン化
    • テストケース
    • fcgi 化
  6. github を使った公開
    • git リポジトリ(ローカル)の作成
    • プロジェクトを github に登録
    • git を使った編集作業例

プラグインのダウンロード

github からどうぞ。

http://github.com/osamutake/RailsLanguageNegotiationPlugin/tree/master

コメント

気づいた点など、ぜひ突っ込みを入れて下さい。





Counter: 9532 (from 2010/06/03), today: 1, yesterday: 0