プロジェクト

全般

プロフィール

Backport(バックポート) #2194

完了

The translation is wrong when there are same string to files of the translation (複数の翻訳ファイルに同一の文言が存在した場合、間違った翻訳がされる)

isao sano さんが13年以上前に追加. 約13年前に更新.

ステータス:
Fixed(完了)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2011-06-10
期日:
進捗率:

100%

予定工数:

説明

Overview (現象)

再現手順

1. キャッシュをクリアする

symfony cc

2. トピック作成の項目「タイトル」と表示されている事を確認

http://exmaple.com/communityTopic/new/1

3. 再度トピック作成を表示すると「タイトル」が「名前」になっている

Causes (原因)

フォームの翻訳時に、他の箇所で読み込んだ翻訳ファイルのリストがクリアされていないことが原因。

現象例で示したトピック作成で「タイトル」が「名前」となる原因は、
アプリケーション登録ページで同一の文言「Name」を定義しているためである。

http://exmaple.com/connection/new

また、一度目に「タイトル」と正常に表示されたのは、
「symfony cc」した時点でキャッシュが作成されておらず、
この時「sfMessageSource_OpenPNECache」クラスではなく「sfMessageSource_OpenPNE」クラスが使用されたためである。

Way to fix (修正内容)

sfMessageSource_OpenPNECached::load() の呼び出し時に、
$this->messages に読み込んだ翻訳ファイルの内容をクリアしていないことが原因。

継承元の sfMessageSource::load() では以下のように初期化している。

lib/vendor/symfony/lib/i18n/sfMessageSource.class.php

157   function load($catalogue = 'messages')
158   {
159     $variants = $this->getCatalogueList($catalogue);
160 
161     $this->messages = array();
162

しかしこのままの実装でこの修正を行うと、
include() で毎回翻訳ファイルが読み込まれる問題があるため、
翻訳ファイルの内容をキャッシュする実装にするべきである。

sfMessageSource::load() では読み込んだ内容をキャッシュする機構がすでに備わっており、
そもそも sfMessageSource::load() をオーバーライドするのではなく、
sfMessageSource::load() 内で呼ばれるメソッドをオーバーライドして実装するべきではないか。

下記のような実装で修正したところ、正常な挙動となった。

   public function getCatalogueList($catalogue)
   {
     $variants = explode('_', $this->culture);
-    $base = $this->source.DIRECTORY_SEPARATOR.$catalogue.$this->dataSeparator;
+    $base = $catalogue.$this->dataSeparator;

     return array(
       $base.$variants[0].$this->dataExt, $base.$this->culture.$this->dataExt,
     );
   }

-  public function load($catalogue = 'messages')
-  {
-    $variants = $this->getCatalogueList($catalogue);
-
-    foreach ($variants as $variant)
-    {
-      if (isset($this->messages[$variant]))
-      {
-        return true;
-      }
-
-      if (is_file($variant))
-      {
-        $this->messages[$variant] = include($variant);
-
-        return true;
-      }
-    }
-
-    return true;
-  }
-
   public function save($catalogue = 'messages')
   {
     return true;
@@ -65,4 +44,9 @@ class sfMessageSource_OpenPNECached extends sfMessageSource_File
   {
     return true;
   }
+
+  public function &loadData($variant)
+  {
+    return include($variant);
+  }
 }

この修正によって、今まで翻訳されていた箇所が翻訳されなくなる部分があります。
これは今までの挙動が間違っていただけであり、適切な翻訳を追加して対応する必要があります。

今回の修正よって、独自のカテゴリを指定している箇所で影響が出ます。
確認した限り以下の箇所が翻訳されていませんでした。

* communityTopic/new/[id]
* communityEvent/new/[id]

Photo 1 → 写真 1
Photo 2 → 写真 2
Photo 3 → 写真 3


関連するチケット 1 (0件未完了1件完了)

関連している OpenPNE 3 - Bug(バグ) #1894: The translation is wrong when there are same string to files of the translation (複数の翻訳ファイルに同一の文言が存在した場合、間違った翻訳がされる)Fixed(完了)Masato Nagasawa2011-01-26

操作

Kousuke Ebihara さんが13年以上前に更新

  • 対象バージョンOpenPNE3.6beta11 から OpenPNE3.6beta12 に変更

親チケットが「テスト待ち」「完了」でないものをすべて beta12 以降での対応とします。

Shingo Yamada さんが13年以上前に更新

  • 対象バージョンOpenPNE3.6beta12 から OpenPNE3.6beta13 に変更

Kousuke Ebihara さんが13年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Shingo Yamada から Kousuke Ebihara に変更

Masato Nagasawa さんが約13年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 3c0b7104435ea89fd854d9fd620f8017fb27cc73 で適用されました。

Maki Takahashi さんが約13年前に更新

  • 担当者Kousuke Ebihara から Maki Takahashi に変更
関連コミット(コミットメッセージのミスのためチケットに関連づけられなかったもの)

Maki Takahashi さんが約13年前に更新

リリースブランチに取り込み済みです

Shingo Yamada さんが約13年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更
下記の差分が一致していることを確認しました。
master stable-3.6.x
1b9899e3693567e25c41c8a628165dac2a982313 3c0b7104435ea89fd854d9fd620f8017fb27cc73
ff5089916d44e3055e284be0656664fb4a08a7d8 5297fe4f978624167902f03a5f6264742a237b12

Yuma Sakata さんが約13年前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テストOKです。

他の形式にエクスポート: Atom PDF