3

言語アプリケーションを動的に変更する必要があります。次のルート構成があります。

'route'    => '/[:lang[/:controller[/:action[/:id]]]][[/page/:page]]',

'defaults' => array(
'lang'     => 'en',
        ),

コントローラーまたは Module.php (関数 onBootstrap) からパラメーター「lang」を変更することは可能ですか。グローバル変数などを使用できるかどうかわかりません。

'defaults' => array(
'lang'     => $my_variable,
        ),

可能であれば、どうすれば変更できますか?

助けてくれてありがとう!

4

2 に答える 2

6

私は同様の問題を抱えていて、それを理解しました。

$e->getRouter()->setDefaultParam('lang', 'de_DE');

リスナーを使用して MvcEvent::EVENT_DISPATCH (以下の更新メモを参照) でこれをトリガーしていますが、onBootstrap も機能するModule.phpはずです。

アップデート:

OK、ルーターにデフォルトのパラメーターを適用するにMvcEvent::EVENT_DISPATCH遅すぎることがわかりました。特に、ルートを介して言語を渡すだけでなく、翻訳可能なルートを (と組み合わせて'router_class'=>'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack') 使用することにも関心がある場合。

したがって、MvcEvent::EVENT_ROUTE にある必要があります。

// applying a default language param to route
$e->getRouter()->setDefaultParam('lang', 'de_DE');

// Now detect the requested language or retrieve 
// from matched route
// $detectedLocale =...
// ...

// Retrieve the translator
$sm->get('translator');

// Apply detected locale to the translator
$translator->setLocale($detectedLocale);

// and now this apply the translator to the router
// for translatable routes
$e->getRouter()->setTranslator($translator);

// but don't forget about
// 'router_class'=>'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack'
// for translatable routes

でこれを行うべきだと言っている人がいますonBootstrap()が、IMVHOは、ルート/URL パラメーターでクライアントから渡されたロケール/言語を検出するために必要な をonBootstrap取得するのが早すぎます。matched route

「ロケールを検出する」と言うことで、URL/クエリ文字列でのダーティな文字列操作についてはまったく考えていませんgetParam()。一致したルートのクリーンについて考えています。

関連: http://framework.zend.com/manual/2.2/en/modules/zend.mvc.mvc-event.html

于 2013-12-17T22:58:18.140 に答える