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

更新

[[公開メモ]]

#contents

* Rails で言語ネゴシエーション(Language Negotiation) [#h05f99dd]

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

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

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

** やりたいこと [#w57d45b9]

+ views/*/*.html.ja.erb とか views/*/*.html.en.erb とか、言語ごとに
テンプレートファイルを作っておき、閲覧者の環境設定、手動選択に合わせて
自動的に言語別テンプレートを切り替えて使う
+ キャッシュされたページも 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~

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

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

** ブラウザ側の言語の優先順位 [#w3484f9d]

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

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

** キャッシュに対する apache2 の言語ネゴシエーション [#w6b05fcf]

2. について。

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

** その他の多言語化情報 [#f2bd1cf6]

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

- ネゴシエーションっぽいもの
-- [[ロケールによるテンプレート切り替え>http://www.yotabanana.com/lab/?date=20060224#p01]]
- ネゴシエーションではなく Ruby-GetText を使った方法やネゴシエーションとの比較
-- [[Railsで日本語を使う時に必須のパッケージ Ruby-GetText>http://blog.masuidrive.jp/articles/2006/07/03/gettext]]
-- [[Ruby on RailsでRuby-GetText-Packageを使う>http://www.yotabanana.com/hiki/ja/ruby-gettext-howto-ror.html]]
-- [[ruby-gettext>http://tech.feedforce.jp/ruby-gettext.html]]
-- [[Rails で行こう! - Ruby on Rails を学ぶ>http://d.hatena.ne.jp/elm200/20070719/1184856941]]
-- [[Rails のためのものぐさな Web アプリケーションの国際化手法>http://d.hatena.ne.jp/secondlife/20070207/1170835130]]
- rails エラーメッセージの日本語化
-- [[RubyOnRails を使ってみる 【第 5 回】 ActiveHeart>http://jp.rubyist.net/magazine/?0012-RubyOnRails]]
-- /usr/share/rails/actionpack/lib/action_view/locale/xx.yml とか

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

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

* 試行錯誤の経過 [#e232eb64]

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

* プラグインのダウンロード [#l2dd967e]

github からどうぞ。

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

* プラグインの使い方 [#sb57c7b2]



* TODO [#ye7b917c]

** ページキャッシュ上での言語切換(Cookie 書き換え) [#o28ad6fc]

http://rails.server/controller.ja~
などの、言語指定の付いたアドレスで参照してページキャッシュが返される場合、
Cookie の書き換えが起きないので、表示言語の切換ができない。

ページに JavaScript を埋め込んで、location.href に言語指定が含まれている時に
Cookie を書き換える事で対応できるはず。

* コメント [#kfcbe2ab]

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

#article_kcaptcha

Counter: 9533 (from 2010/06/03), today: 2, yesterday: 0