i18nとページキャッシュ

symfonyの国際化機能を使うと、セッションユーザーオブジェクト(sfUser)のculture属性を元に、UI用テキスト・リソースの切り替え*1や、国際化されたオブジェクトの振る舞いの変更*2を自動的に行うことができる。
これは大変ありがたい機能なんだけど、素のシステムではページ・キャッシュと同時ONできない。ページ・キャッシュが、言語(culture)を一切ケアせずにキャッシュを生成するので、例えば誰かがculture=英語の状態でページを閲覧してキャッシュが生成されると、次のユーザーのcultureが日本語でも、英語のページが表示されてしまうから。
解決策は、どうしようか。symfonyは、キャッシュの固有idをuri + request parameterで生成するので、フィルターなどで「lang=ja」のようなパラメータを常に付加するようにするのがいいかもしれない。

*1:UIテキストを全て echo __('') で出力するようにして、XLIFF形式の翻訳データを用意する必要がある。

*2:同じデータオブジェクトで、cultureによって異なるデータを入出力できる。モデル定義時に、国際化するカラム別テーブルで定義して、関連づけ設定する必要がある。