0

自分のサイトでURL書き換えを使用したい:

/:@controller/:@action/

そのため、ルート上で翻訳されたセグメントを使用し、これらの翻訳されたセグメントから要求された言語を検出したいと思います。たとえば、ユーザーが次のようなURLをリクエストした場合:

/user/profile/

そうすれば、要求された言語は英語であることが理解できました。そして、ユーザーが次のようなURLを要求した場合:

/kullanici/profil/

それから私は要求された言語がトルコ語であることを理解します。Zend_Controller_Routerでこれを行うにはどうすればよいですか?

4

2 に答える 2

0

それがそんなに良い考えかどうかはわかりません。そのためには、最初に少なくとも1つのルートセグメントの言語を決定する必要があるためです。これを行うには、事前にマッピングを知っている必要があります(つまり、これはプロファイルルートと一致するので、英語またはトルコ語ですか?)、またはトルコ語/英語のルートセグメントの辞書に対してルートセグメントをスキャンする必要があります。前者は、ルートごとに2つのルートを作成する必要があります。1つはトルコ語で、もう1つは英語で、後者は、実際に一致するのにすでにかかっている時間に加えて、リクエスト処理時間にペナルティを支払う必要があります。ルート。:lang/:controller/:actionIMOは、典型的なタイプのルート構成に固執する方がよいでしょう。

それはあなたがそれをするつもりなら私はURIを言語に一致させることを処理するために新しいルートタイプを作るだろうと言った。これにより、i18nの言語パラメータが設定されますが、URIを特定のベースライン言語にリセットする必要があります。これにより、実際に標準ルートに一致します。Zend_Controller_Router_Route_Chain次に、2つをチェーンするために使用します。

于 2010-02-08T20:16:50.433 に答える
0

Zend_Controller_Router_Routeを拡張した新しいルーターを作成することで、問題を解決しました。クラスの「match」メソッドをオーバーライドし、元の一致コードに数行のコードを追加しました。

.....
foreach( $translateMessages as $key => $val ) {
  if (($originalPathPart = array_search($pathPart, $val)) !== false) {
    $pathPart = $originalPathPart;


    if (!$this->_localeSet) {
       $locale = Zend_Registry::get('Zend_Locale');
       $locale->setLocale($key);  // Set Locale by translated key language
       $this->_localeSet = true;  // Added to class with default value false
       $this->_activeLocale = $key;  // Added to class with default value ''
    }else{
       // A second translated key but this is not same language.
       // Then rise 404 error
       if ($this->_activeLocale != $key) {
          //FIXME: Rise 404 error
          throw new Exception("URL Not Found");
       }    
    }    
  }    
}    
.....
于 2010-02-18T10:31:19.293 に答える