ZF1.12 アプリケーションの独自の定義済みルートに問題があります。言語パラメーターの切り替えは機能しますが、ルートの翻訳は逆になります。たとえば、次のようになります。
http://www.my-app.de/de/clients/login
http://www.my-app.de/en/kunden/anmelden
言語を管理するために、プラグインを登録します。
<?php
class FOO_Controller_Plugin_LangSelector extends Zend_Controller_Plugin_Abstract
{
public function routeShutdown(Zend_Controller_Request_Abstract $request) {
if (substr($request->getRequestUri(), 0, -1) == $request->getBaseUrl()) {
$locale = new Zend_Locale();
$lang = $locale->getLanguage();
$url = "http://my-app.de/" . $lang;
Zend_Controller_Front::getInstance()->getResponse()->setRedirect($url);
}
}
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$lang = $request->getParam('language','');
if ($lang !== 'en' && $lang !== 'fr' && $lang !== 'de') {
$request->setParam('language','de');
}
$lang = $request->getParam('language');
switch($lang)
{
case ("de"):
$locale = 'de_DE';
break;
case ("en"):
$locale = 'en_EN';
break;
case ("fr"):
$locale = 'fr_FR';
break;
}
$zl = new Zend_Locale();
$zl->setLocale($locale);
Zend_Registry::set('Zend_Locale', $zl);
$translate = new Zend_Translate('csv', APPLICATION_PATH . '/configs/lang/'. $lang . '.csv' , $lang);
Zend_Registry::set('Zend_Translate', $translate);
}
}
これはうまくいきます。私のapplication.iniで:
; Translator -------------------------------------------------------------------
resources.locale.registry_key = "locale"
resources.locale.default = "de_DE"
resources.translate.locale = "de"
resources.translate.registry_key = "Zend_Translate"
resources.translate.adapter = "csv"
resources.translate.content = APPLICATION_PATH "/configs/lang/de.csv"
resources.translate.options.scan = "directory"
; Routes -----------------------------------------------------------------------
resources.router.routes.defaultmodule.type = Zend_Controller_Router_Route_Module
resources.router.routes.defaultmodule.abstract = On
resources.router.routes.defaultmodule.defaults.module = "default"
resources.router.routes.language.type = Zend_Controller_Router_Route
resources.router.routes.language.route = ":language"
resources.router.routes.language.reqs.language = "^(de|en)$"
resources.router.routes.language.defaults.language = "de"
resources.router.routes.default.type = Zend_Controller_Router_Route_Chain
resources.router.routes.default.chain = "language, defaultmodule"
resources.router.routes.login.route = ":language/@clients/@login"
resources.router.routes.login.defaults.module = "clients"
resources.router.routes.login.defaults.controller = "index"
resources.router.routes.login.defaults.action = "login"
たとえば、ビュー スクリプトで次のコードを使用して言語を切り替えようとしました。
<?php
$requestUri = Zend_Controller_Front::getInstance()->getRequest()->getRequestUri();
$uri = explode("/", $requestUri);
$lang = $uri[1];
?>
<?php if ($lang != "de"):?><a href="<?php echo $this->url(array('language' => 'de'), null, false);?>"><?php echo $this->translate('lang_de'); ?></a> <?php endif?>
<?php if ($lang != "en"):?><a href="<?php echo $this->url(array('language' => 'en'), null, false);?>"><?php echo $this->translate('lang_en'); ?></a> <?php endif?>
リクエスト パラメータを読み取ると、言語は正しく切り替えられますが、ルートが逆になります。どうすればこれを修正できますか?
ありがとう、私の悪い英語でごめんなさい。