Bug(バグ) #4668
完了SNS内名称設定で設定されている項目が翻訳されない場合がある
100%
説明
Overview (現象)¶
SNS内名称設定で設定されている項目が翻訳されない場合がある。
確認済みなのは以下- opCommunityTopicPlugin をインストールしている場合、OpenPNE 3.10.0 以降のバージョンでは管理画面のトピックコメントリスト、イベントコメントリストで「%nickname%」が翻訳されずに表示される。
Causes (原因)¶
pc_backend(管理画面)や api(API)では pc_frontend 用のSNS内名称設定を表示する仕様となっており、
SNS内名称設定の項目を取得する SnsTermTable に言語とアプリケーションを指定する configure() メソッドを呼ぶ際には、
現在のアプリケーションが pc_backend や api の場合 "pc_frontend" を引数として渡す実装が opApplicationConfiguration と opI18N に存在する。
ただ、この実装以外の箇所からも SnsTermTable::configure() メソッドが呼ばれる箇所があり、その際に "pc_backend" や "api" が渡されることによりSNS内名称設定が存在しないような判定をされてしまう場合がある。
また、複数回 SnsTermTable::configure() メソッドが呼ばれ言語やアプリケーションが切り替えられた際に、
SnsTermTable 内部で持っているレコードのキャッシュを初期化する処理がないため、一度でも翻訳が実行されキャッシュが保持された後では切り替えが正常に動作しない。
実際には SnsTermTable::configure() が複数回呼ばれても最後に意図した "pc_frontend" を渡した後のみ翻訳が実行されるケースが多く翻訳されない例は少ないが、
opCommunityTopicPlugin の例では、通常翻訳を実行するテンプレートファイル以外の PluginCommunityTopicSearchForm クラスで I18N の機能を利用しているため実行タイミングの違いで問題が発生している。
OpenPNE 3.10 以降でのみ発生するのは以下のチケット、
#4366 SNS内名称設定で設定されている項目が翻訳されない
こちらの修正差分により opI18N::initialize() で、 $this->terms['member'] という箇所を削除したためにこのタイミングで翻訳実行されなくなったことが原因であるが、
SnsTermTable 側の実装で configure() を引数を変えて複数回呼ばれることが考慮されていないこと、あるいは複数回呼び出しを行っていること自体が根本の原因である。
Way to fix (修正内容)¶
- SnsTermTable::configure() で pc_backend, api が指定される可能性をなくす
- application が pc_backend, api だった場合に pc_frontend に変換する処理を SnsTermTable::configure() 内に追加
- 同様の処理が書かれていた opApplicationConfiguration と opI18N からは削除
- SnsTermTable::configure() で言語アプリケーション切替時は取得済みの terms を空にする