2017-03-02 3 views
0

私はZend Framework 3アプリケーションを使用しています。zf3ユーザーの選択に応じてロケールが変更されます

私は私の\のconfig \のglobal.phpファイルでこのようにそれを設定している:

'translator' => [ 
    'locale' => 'en_US', 
    'translation_file_patterns' => [ 
     [ 
      'type'  => 'gettext', 
      'base_dir' => getcwd() . '/data/language/', 
      'pattern' => '/%s/general.mo', 
     ], 
    ], 
], 

私は「ロケール」それがうまく動作し、適切に.poファイルを見つけるの値を変更する場合。 データベースに保存されているユーザープロファイルの値に応じてロケールを設定できる必要があります。

ここではhttp://zendframework.github.io/zend-i18n/translation/のドキュメントとhttps://docs.zendframework.com/tutorials/i18n/のチュートリアルをチェックしましたが、説明や例をつけずにsetLocale()メソッドを記述するだけです。ここには同様のスレッドZend framework 2 : How to set locale globaly?がありますが、それはZF2のためであり、実際の解決策を提示するものではありません。

私の質問を要約すると、アプリケーション全体で有効になるように、どのようにしてsetLocale()メソッドを使うべきですか?$this->translate($message)はすべてのビューファイルで、設定ファイルで使用されるデフォルトのロケールではなく新しいロケールを使用しますか?

答えて

0

PHPのロケールを設定するだけで済みます。これを行うには、\Locale::setDefault('en-GB');を使用してください。

は、それが行うのところ、この特定のファイルは、SlmLocaleを見てください。


それは、あなたも、私は推測するMvcTranslatorにsetLocale機能を使用することができ、最も簡単な方法でしたが。そのためには、既存のファクトリを独自のファクトリでオーバーライドして元のファクトリを飾る必要があります。

あなたはConfigProvider file in zend-mvc-i18nを見れば、あなたはエイリアスや工場がMVCトランスレータを作成するために、ここで使用されていることがわかります。次に、問題の工場がどのように機能しているかを見ることができます。これは基本的にstated in the docのような装飾トランスレータを作成します。

デフォルトでは、サービスマネージャは、シングルトンと同じように、常に同じインスタンス(共有サービス)を提供します。

この設定を無効にする(つまり、Zend\Mvc\I18nmodules.config.phpの後にモジュールがあることを確認してください)。次に、モジュール構成では、独自のトランスレータを提供することができます。

当社の翻訳者は、基本的には、setLocaleが呼び出された文書から、翻訳者で構成されています。これを行うには、delegatorを使用することができます。

return [ 
    'factories' => [ 
     TranslatorInterface::class => TranslatorServiceFactory::class, 
    ], 
    'delegators' => [ 
     TranslatorInterface::class => [ 
      \Application\Factory\TranslatorFactory::class, 
     ], 
    ], 
]; 

そしてTranslatorFactory

それを行うための一つの方法だろう
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\DelegatorFactoryInterface; 

class TranslatorFactory implements DelegatorFactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null) 
    { 
     $translator = call_user_func($callback); 
     $translator->setLocale('en-GB'); 
     return $translator; 
    } 
} 

(おそらく一部のユーザーデータを得ることができるので、あなたは、その工場でコンテナを取得します)。


もう1つの解決策は、イベントシステムを使用し、ユーザーの詳細を取得するイベントリスナーでのみロケールを宣言することです。

+0

ありがとうトーマス、これは本当に動作します、私も工場で試してみますが、私はそれにいくつかの助けを感謝します。私はフレームワークのツールがあれば、それを使うのがより一貫していると思います。私は他の誰かが何かを提案するチャンスを与え、誰もホップしない場合、あなたの答えを「受け入れられる」とマークします。もう一度ありがとうございました – Ivomasterche

+0

私はちょっと答えを更新しました...それはちょっと長いIMOですが、多少混乱するかもしれません。 –

+0

もう一度ありがとうございます。私は考えていると思います - 私たちは '$ this-> translate($ msg)'が呼び出されるたびに、この委譲者と呼ばれる(そしてロケールを設定する)翻訳者サービスを "ラッピング"していますか?残念ながら、私はそれを動作させることはできません、私はアプリケーションモジュールのmodule.config.phpに設定を追加して、私は/Application/src/Factory/TranslatorFactory.phpファイルでTranslatorFactoryクラスを作成しましたこれはすべてですか? – Ivomasterche

関連する問題