私は現在、多言語ウェブサイトを開発しています。多言語部分については、translator / poedit を使用します。選択した言語をセッションに保存します。それは正常に動作します。
Module.php:
public function onBootstrap(MvcEvent $e)
{
// ...
$session = new Container('base');
if ($session->language !== NULL) {
$e->getApplication()->getServiceManager()->get('translator')->setLocale($session->language);
}
}
コントローラーで言語を設定するためのアクション:
public function setLanguageAction()
{
$language = $this->params()->fromRoute('language');
if (isset($this->languages[$language])) {
$session = new Container('base');
if ($language == 'en') {
$session->language = NULL;
} else {
$session->language = $language;
}
}
return $this->redirect()->toRoute('home');
}
module.config.php では、デフォルトのロケールは en に設定されています。
私が言ったように、1つのことを除いて、すべてが正常に機能します。
言語に依存するデータをDBにも保存しているため、モデルでは現在の言語が何であるかを知る必要があります。現在の言語は、モデルの他の目的にも必要です。
したがって、すべてのモデルの構築関数に次のコードを含めます。
$session = new Container('base');
if ($session->language !== NULL) {
$this->language = $session->language;
} else {
$this->language = 'default';
}
最善の解決策ではないと思います。モデルが多すぎて、常にこのコードを含めることができません。
たとえば Module.php / getServiceConfig 関数から、すべてのモデルに $language 変数を自動的に渡すソリューションがあるかどうかを知りたいです。
public function getServiceConfig()
{
$session = new Container('base');
return array(
'factories' => array(
'Application\Model\SomeThing' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$c = new SomeThing($dbAdapter);
$c->language = $session->language;
return $c;
}
)
);
}
もちろん、これは機能していませんが、このような類似のこと、またはファクトリ配列内のすべてのモデルの言語変数に現在の言語の値を割り当てる必要がない、より一般的な解決策を実行できれば素晴らしいことです。 (たとえば、この割り当てをすべてのモデルに対して 1 か所で実行できる、モデルの一般的なブートストラップ)。
私の問題の解決策はありますか?
ご協力ありがとうございました!
M