プロジェクト

全般

プロフィール

Bug(バグ) #2800

Kousuke Ebihara約12年前に更新

h3. 概要

i18n 翻訳用のメッセージファイルは複数ファイルで同じ語に対する翻訳を記述した場合、「モジュール → アプリケーション → 全体」の優先順に読み込まれる仕様であるが、読み込むべき翻訳ファイルリストの順序に誤りがあり、誤った翻訳ファイルが選択されてしまう問題がある。 全体」の優先順に読み込まれる仕様であるが、翻訳ファイルのキャッシュを生成する過程の処理に誤りがあり、この優先順位が逆になってしまう問題がある。

これにより、たとえば、 これにより mobile_frontend 用の i18n ファイルに半角カタカナのエントリーを追加しているにもかかわらず、全角カタカナが表示されてしまうような現象が発生する(例:「Login」が「ログイン」ではなく「ログイン」と表示される)。 ファイルに半角カタカナのエントリーを追加しているにもかかわらず、全角カタカナが表示されてしまうような現象が発生する。

この問題は #2490 (翻訳ファイルの優先順位がキャッシュ時に逆になっている) 対応中に発覚したものである。 (https://redmine.openpne.jp/issues/2490#note-4) なお、キャッシュファイルがない状態でアクセスした場合にはこの現象は発生しない。

#2490 はキャッシュ前とキャッシュ後の翻訳の優先順位がそれぞれ異なるという問題で、キャッシュ後の翻訳結果(実装上の誤りが存在していた)がキャッシュ前のものと一致するように修正がおこなわれた。しかし、このチケットで扱う予定の問題により、そもそもキャッシュ前の翻訳結果が適切ではなかったことが明らかになり、 #2490 にて対処がおこなわれた。このとき採用された修正方針を以下に引用する。 h3. 詳細

<pre>
opApplicationConfiguration::getI18NDirs() により生成される配列要素の順序は以下のようになります(太字は sfApplicationConfiguration::getI18NDirs() の生成した配列要素)。
opI18N::generateApplicationMessages() でキャッシュファイルを生成するが、この中で複数の i18n のメッセージファイルの内容をマージする処理で優先度の低いファイルの内容を優先してマージをしてしまっている。

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
opI18N::generateApplicationMessages() の引数 $dirs には優先度の高い順にディレクトリパスが格納された配列が渡されるが、foreach のループ内では後の値を前の値よりも優先させる形で array_merge() を使っているために本来の優先順位と逆の内容のキャッシュファイルが生成されていた。

しかし、これは期待通りの結果ではありません。上述の結果を、期待通りの順番に並び替えたものが以下です。

(略)

ということで、これでよさそうに思いますが、「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 <pre>
public function generateApplicationMessages($dirs)
{
$catalogues = array();

3. apps/[app_name]/modules/[module_name]/i18n ...
foreach ($files as $file)
{

4. apps/[app_name]/i18n ...
$data = $messageSource->loadData($file);

$catalogues[$name] = array_merge($catalogues[$name], $data);
}

5. plugins/*/modules/[module_name]/i18n
6. plugins/*/i18n
0. [sf_root_dir]/i18n
</pre>

3.4 には #2490 で扱われているキャッシュの問題は存在しないが、翻訳ファイルリストの順序が誤っている問題は存在するため、 https://redmine.openpne.jp/issues/2490#note-4 以降のやりとりを参考にした上で、修正を取り込む必要がある。

h3. 詳細

h3.
確認バージョン

OpenPNE 3.4.21-dev (stable-3.4.x) 3.7.0-dev (master)
OpenPNE 3.6.1 (stable-3.6.x)

戻る