ログインしているユーザーのタイプに応じて、複数の言語だけでなく、言語ごとに複数のフレーズへの翻訳が必要な CakePHP を使用して Web サイトを作成しています。これにより、同じ機能を使用できますが、重複することなく、より正式で親しみやすい言語を使用できます。
非常に簡単な例として:
- タイプ 1: 「顧客」、「購入」、「ショッピング カート」
- タイプ 2: 「クライアント」、「購入」、「バスケット」
- タイプ 3: 「ユーザー」、「注文」、「請求書」
これらの各タイプは、複数の言語で利用できます。
私は CakePHP で動作する標準のローカリゼーションを取得しており (これを選択した理由の 1 つです!)、適切な default.po ファイルが /Locale/[lang]/LC_MESSAGES/ ディレクトリにあり、そこですべて正常に動作しています (ありがとうございますこのサイトで ger が機能するには deu である必要があると指摘したユーザー ;) )。
アプリに深く入り込む前に、フレーズを追加して、たとえば、言語をフランス語に、フレーズを type2 に設定できるようにします。フレームワークの外でこれを行っていた場合、言語とフレーズ キーに基づいて正しい文字列を見つけるためにマトリックス ルックアップが必要ですが、CakePHP のローカライズ内でこれを行う方法がわかりません。
現在、標準の __([string]) 規則を使用していますが、これは開発サイクルの初期段階であるため、必要に応じて変更するのは簡単です。
__d([phrase],[string]) の使用を検討していましたが、アプリをプラグインとして作成せずにこれを設定する方法がわかりません。その後、 /Locale/ で同じ問題に戻ります
SO や CakePHP コミュニティ サイトでの検索では、この例を見つけることができなかったので、提案をいただければ幸いです。
CakePHP 内でこれを行う標準的な方法はありますか? そうでない場合、これを実装するための良い「ベストプラクティス」の方法は何ですか?
編集- 以下の回答に従って、実装方法を次に示します。
/app/Locale/[lang]/LC_MESSAGES/ に、phrasing1.po、phrase2.po などの新しいフレーズを含む新しい .po ファイルを作成しました。
言語を設定した場所で、フレーズ ファイルが po ファイルの名前と一致するフレージングも設定しました。
Configure::write('Config.language', 'deu');
Configure::write('App.langDomain', 'phrase1');
すべての文字列は次のようにラップされました。
__d(Configure::read('App.langDomain', 'string')
そして、それはうまくいきます。