この修正により、たとえば携帯版ログイン画面において、「ログイン」と翻訳されていた文言が「ログイン」に置き換わってしまいます。
このチケットで修正された opI18N::generateApplicationMessages()
の第一引数の $dir
は、「優先度の高い順に i18n ディレクトリのパス文字列が格納された配列」ですので、修正内容自体は正しいように見えます。ですが、肝心の $dir
の順序が間違っているために、この修正を適用することで、前述の「ログイン」のように誤った翻訳がなされる箇所が出てきてしまいます。
opI18N::generateApplicationMessages()
に渡される引数は opApplicationConfiguration::getI18NDirs()
により生成されたものです。したがって、この修正を適用するためには、併せて opApplicationConfiguration::getI18NDirs()
も修正する必要があります。
opApplicationConfiguration::getI18NDirs()
により生成される配列要素の順序は以下のようになります(太字は sfApplicationConfiguration::getI18NDirs()
の生成した配列要素)。
0. [sf_root_dir]/i18n
1. plugins/op*Plugin/apps/[app_name]/i18n
2. plugins/op*Plugin/apps/[app_name]/modules/[module_name]/i18n
3. apps/[app_name]/modules/[module_name]/i18n
4. apps/[app_name]/i18n
5. plugins/*/modules/[module_name]/i18n
6. plugins/*/i18n
しかし、これは期待通りの結果ではありません。上述の結果を、期待通りの順番に並び替えたものが以下です。
2. plugins/op*Plugin/apps/[app_name]/modules/[module_name]/i18n
1. plugins/op*Plugin/apps/[app_name]/i18n
3. apps/[app_name]/modules/[module_name]/i18n
4. apps/[app_name]/i18n
0. [sf_root_dir]/i18n
5. plugins/*/modules/[module_name]/i18n
6. plugins/*/i18n
この並び順は以下のような考え方に基づいています。
- OpenPNE 3 プラグインのディレクトリ(
plugins/op*Plugin/
以下)は、 OpenPNE 3 本体よりも優先される
- OpenPNE 3 本体のディレクトリは、 symfony プラグインのディレクトリ(
plugins/*/modules
と plugins/*/i18n
)よりも優先される?
これは、『symfony 1.4 による Web アプリケーション開発』(拙著/共著)の p399 に記載されている考え方に沿っています。以下に引用します。
このような symfony プラグインと OpenPNE プラグインとの差異は、 symfony プラグインが「symfony を拡張する」という役割を担っており、拡張された symfony を利用して開発を進めていくことを想定しているのに対し、 OpenPNE プラグインの場合は、「既に完成された symfony アプリケーションを拡張する」という役割を担っているというところから生じています。
ということで、これでよさそうに思いますが、「0. [sf_root_dir]/i18n
」の順番が妥当かどうかは若干怪しいところです(このディレクトリの立ち位置はいまひとつ明確でない気がしています)。
なので、 [sf_root_dir]/i18n
に関してだけはとりあえずこの修正前の挙動を維持する形で、以下のような順序にすることもアリだと思います。ちなみに、この順序ならば sfApplicationConfiguration::getI18NDirs()
の結果が利用できます。
2. plugins/op*Plugin/apps/[app_name]/modules/[module_name]/i18n
1. plugins/op*Plugin/apps/[app_name]/i18n
3. apps/[app_name]/modules/[module_name]/i18n
4. apps/[app_name]/i18n
5. plugins/*/modules/[module_name]/i18n
6. plugins/*/i18n
0. [sf_root_dir]/i18n