9

Zend_Navigation、Zend_Translate、および必要なルーティングの組み合わせに問題があります。

私のサイト ナビゲーションは、XML ファイルに基づく Zend_Navigation を介して行われます。Zend_Translate に基づいてサイトに翻訳を追加し、ブートストラップへの次のルーティングの変更を追加しました。

protected function _initRoutes()

    $config = new Zend_Config($this->getOptions());
    $languages = array_keys($config->languages->toArray());
    $zl = new Zend_Locale();
    $lang = in_array($zl->getLanguage(), $languages)
                  ? $zl->getLanguage() : 'en';

    $zfc = Zend_Controller_Front::getInstance();


    // add language to default route
    $route = new Zend_Controller_Router_Route(
            ':lang/:module/:controller/:action/*',
      array('controller'=>'index',
                'action' => 'index',
                'module'=>'default',
                'lang'=>$lang));

    $router = $zfc->getRouter();
    $router->addRoute('default', $route);
    $zfc->setRouter($router);

次に、preDispatc メソッドを使用して View_Helper を作成しました。

    $language = $request->getParam('lang','');

 if ($language !== 'en' && $language !== 'da')
     $request->setParam('lang','en');

 $language = $request->getParam('lang');
 if ($language == 'en')
     $locale = 'en_EN';
 else
     $locale = 'da_DK';

 $zl = new Zend_Locale();
 $zl->setLocale($locale);
 Zend_Registry::set('Zend_Locale', $zl);

 $translate = new Zend_Translate('csv', APPLICATION_PATH . '/configs/language/'. $language . '.csv' , $language);
 Zend_Registry::set('Zend_Translate', $translate);

「site/ en /module/controller/action」に移動すると、正常に動作します。

「site/ da /module/controller/action」に移動すると、翻訳は正常に機能しますが、Zend_Navigation からのリンクはデフォルトの「en」言語リンク「site/ en /module2/controller2/」を指しています。

あなたが /da/ 言語を使っているかどうかはわかりません。どんな助けでも感謝します。

敬具、

モルテン

4

2 に答える 2

1

これはあなたの質問に直接答えるものではありません。ただし、ナビゲーションのビューヘルパーであるZend_View_Helper_Navigationには、Zend_Navigationコンテナに追加したナビゲーションの「ページ」の暗黙的な変換を提供するsetTranslator()メソッドがあります。

class MyModule_Bootstrap extends Zend_Application_Module_Bootstrap
{
   protected function _initMyModuleNavigation()
   {
    $langSess = new Zend_Session_Namespace('language');
    $translate = $langSess->translate;

    $this->getApplication()->bootstrap('navigation');

    $view = $this->getApplication()->getResource('view');

    $navigationHelper = $view->getHelper('navigation');

    $navigation = $navigationHelper->getContainer();

    $navigationHelper->setTranslator($translate);

    //...
}

これにより、アイテムごとに手動で翻訳を呼び出す必要がなくなります。

$navigation->addPages(array(
        new Zend_Navigation_Page_Mvc(array(
            'label' => $translate->_('Wiki'), //<-- This can be eliminated
            'action' => 'index',
            'controller' => 'article',
            'module' => 'wiki',
            'pages' => //...

setTranslator()が実行されたため、自動的に実行されます。

于 2011-05-20T19:18:52.463 に答える
1

Zend_Navigation_Page_Mvc は Module、Controller、および Action のみをチェックするため、追加のルーティング要素には決して行かないように見えます。

解決策の 1 つは、言語を処理する Zend_Navigation_Page_Mvcl などの新しいクラスを使用することです。

しかし、少し複雑に思えるので、すべての言語のすべてのページを含む大きなナビゲーションを使用して、1 つの解決策を見つけました。

これは、フランス語と英語の「ホーム」、「テスト」の 2 ページのナビゲーション用の私の xml 構成です。

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <nav>
        <fr>
            <label>menu.home</label>
            <params>
                <lang>fr</lang>
            </params>
            <action>index</action>
            <controller>homepage</controller>
            <route>langcontrolleraction</route>
            <pages>
                <home>
                    <label>menu.home</label>
                    <params>
                        <lang>fr</lang>
                    </params>
                    <action>index</action>
                    <controller>homepage</controller>
                    <route>langcontrolleraction</route>
                </home>
                <test>
                    <label>menu.wallet</label>
                    <params>
                        <lang>fr</lang>
                    </params>
                    <action>index</action>
                    <controller>wallet</controller>
                    <route>langcontrolleraction</route>
                </test>
            </pages>
        </fr>
        <en>
            <label>menu.home</label>
            <params>
                <lang>en</lang>
            </params>
            <action>index</action>
            <controller>homepage</controller>
            <route>langcontrolleraction</route>
            <pages>
                <home>
                    <label>menu.home</label>
                    <params>
                        <lang>en</lang>
                    </params>
                    <action>index</action>
                    <controller>homepage</controller>
                    <route>langcontrolleraction</route>
                </home>
                <test>
                    <label>menu.wallet</label>
                    <params>
                        <lang>en</lang>
                    </params>
                    <action>index</action>
                    <controller>wallet</controller>
                    <route>langcontrolleraction</route>
                </test>
            </pages>
        </en>
    </nav>
</config>

ご覧のとおり、2ページだけでもかなり長いです。実際には、ナビゲーションに (ページ + 1) x 言語のアイテムが表示されます

私は「トリック」を使用しました: ホームページは 2 回存在します。

  • メインメニュー項目として1回
  • 最初のサブメニュー項目として 1 回

アイデアは、選択した lang に基づいて表示するサブメニューを定義することであり、これはルーターを介して自動的に行われるため、メニューの代わりにサブメニューを描画するようにアプリケーションに指示するだけです。したがって、レイアウトファイルでそのために使用する行は次のとおりです。

<?php 
echo $this->navigation()->menu()->renderSubMenu() 
?>

Zend_Navigationどのように追加したのかわかりませんでした。

<?php
protected function _initNavigation() {
    $config = new Zend_Config_Xml(Zend_Registry::get ( 'config' )
            ->resources->navigation->file, 'nav');
    $navigationContainer = new Zend_Navigation($config);
    // Store the container in the proxy helper:
    $view = $this->getResource ( 'view' );
    $view->getHelper('navigation')->setContainer($navigationContainer);
}
?>

ちなみに、同じBootstrap.phpで、デフォルトの言語を「en」のままにしておくことができます。これが私の_initRoutes()です。

<?php
protected function _initRoutes() {
    $router = Zend_Controller_Front::getInstance ()->getRouter ();
    $router->removeDefaultRoutes ();
    $myRoute = new Zend_Controller_Router_Route (
        ':lang/:controller/:action',
        array (
            'lang' => 'en',
            'controller' => 'index',
            'action' => 'index',
        )
    );
    $router->addRoute ( 'langcontrolleraction', $myRoute );
}
?>

Zend_Translate を登録していれば、翻訳は自動的に行われます。私の例では: menu.home は次のようになります:

  • は英語で
  • アキュイユフランス語に

これが役立つことを願っています。

別のより微妙な解決策を希望しますが、まだ見つかりませんでした。

于 2011-09-15T23:44:13.810 に答える