Skip to content

【システム】多言語対応用の __d() 関数の使い方が間違っているところが多々ある #4383

@kaburk

Description

@kaburk

概要

__d() 関数(CakePHP の翻訳関数)の使い方が誤っている箇所がコード全体に多数存在する。

問題1:動的部分を翻訳キーに文字列結合している(バグ)

__d('baser_core', 'データベース処理中にエラーが発生しました。' . $e->getMessage());

問題点

__d() の第2引数が翻訳キーとなる。. で動的な文字列を結合すると、翻訳キーが実行時のエラー内容によって変化するため、.po ファイルへの翻訳登録が不可能になる。

修正方針

固定部分だけを翻訳キーとし、動的部分は後続で結合するか、__d() のプレースホルダー機能({0}, {1} など)を使う。

// 案A: 固定部分のみ翻訳し後続で結合
__d('baser_core', 'データベース処理中にエラーが発生しました。') . $e->getMessage();

// 案B: プレースホルダー機能を使う(動的部分も翻訳テンプレートに含めたい場合)
__d('baser_core', 'データベース処理中にエラーが発生しました。詳細:{0}', $e->getMessage());

問題2:sprintf(__d()) を使っている(改善)

sprintf(__d('baser_core', 'プラグイン「%s」をインストールしました。'), $name);

問題点

動作はするが、__d() 自体にプレースホルダー機能({0}, {1} など)が備わっているため、sprintf() を二重に使う必要がない。また %s ではなく ICU 形式のプレースホルダーを使うべき。

修正方針

sprintf() を除去し、__d() のプレースホルダー機能を使う。プレースホルダーの形式も %s → {0} へ変更する。

__d('baser_core', 'プラグイン「{0}」をインストールしました。', $name);

影響範囲

問題1・問題2 ともにコード全体(baser-core、bc-blog、bc-mail、bc-custom-content、bc-widget-area、bc-theme-file、bc-uploader、bc-editor-template、bc-favorite、bc-search-index、bc-content-link 等)に広がっており、多言語対応サイト作成時に問題になるので早めに改善する必要がある。

Image Image

baserCMS version : 5.2.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugバグVer5バージョン5.x

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions