Bug(バグ) #1842
完了Text-translation method, opI18N::__(), always parse text in disregard of parsed text cache (翻訳に用いられる opI18N::__() がパース済みテキストのキャッシュを無視して常にテキストのパースをおこなっている)
100%
説明
Overview (現象)¶
Text-translation method, opI18N::__(), always parse text in disregard of parsed text cache.
翻訳に用いられる opI18N::__() がパース済みテキストのキャッシュを無視して常にテキストのパースをおこなっている。
Causes (原因)¶
opI18N stores cached texts in opI18N::$parsed. A new entry of opI18N::$parsed is added by end of opI18N::__() to skip parsing from the next time. But checking available caches in opI18N::__() is wrong.
opI18N はキャッシュされたテキストを opI18N::$parsed に格納する。 opI18N::$parsed のエントリは次回以降のパースをスキップするために opI18N::__() の末尾で追加される。しかし、 opI18N::__() における有効なキャッシュの確認処理に誤りがある。
public function __($string, $args = array(), $catalogue = 'messages') { if (empty($parsed[$string])) { $this->parsed[$string] = array();
The above is the main point in this issue. Calling empty() looks like a checking available caches, but this empty() calls to check the undefined local variable $parsed, not $this->parsed. In this code, $parsed is always an empty value. So you get non-cached result from opI18N::__().
これがこのチケットのポイントとなる部分である。 empty() のコール部分は有効なキャッシュの確認をおこなっているように見えるが、 $this->parsed ではなく未定義のローカル変数である $parsed に対して empty() がコールされている。このコードでは $parsed は常に空の値となるため、 opI18N::__() の結果は常にキャッシュされていない値ということになる。
Way to fix (修正内容)¶
Replace $parsed to $this->parsed.
$parsed を $this->parsed に置き換える。