0

ZF での作業: ユーザーのブラウザーの (ブラウザー) ロケールに応じて、www.example.com のベースまたはルート URL を www.example.com/$language/home に変更することは可能ですか?

例; ゲストが手動で www.example.com と入力した場合、URL をロケールのある URL に自動的に変更したいと思います: en_GB 地域のゲストの場合は www.example.com/en/home、fr_FR のゲストの場合は www.example.fr/home領域。

ルート URL から、すべてのメニュー URL とコンテンツ ロケールを認識しています。URL のメニュー項目へのリンクをクリックすると、ルートの後に lang が自動的に追加されます。ルート URL のコンテンツも翻訳を使用してロケールを認識しているため、en_GB は英語、fr_FR はフランス語などです。

ルートのみが入力されている場合、アプリケーションへのアクセスの開始からすぐにルート URL をロケール対応に変更したいのですが、まだ行方不明です。

このフォーラムのこの Q&Aから私が理解していることから、Rails 3 の root :to => redirect("/prepayments") のようなものを推測します

このフォーラムで見つけることができる限り、コントローラーアクションヘルパー、リダイレクトなどを試して実装しましたが、それらはすべて解決策を提供しません。
最初にブラウザーからロケールを取得する必要があるため、htaccess でのリダイレクトは不可能だと思います。これがわからないので、リダイレクトは動的で、htaccess でリダイレクトを設定できません。

何か提案をいただければ幸いです。

4

2 に答える 2

0

Zend Frameworkの Florent の助けを借りて、私の質問に対する次の解決策を最終的に見つけました: Redirect from action helper :

言語プラグインに追加しました

public function routeShutdown(Zend_Controller_Request_Abstract $request)
{...some code handling translate...

$url = $request->getRequestUri();

if ($url === '/') {
    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
    $redirector->gotoUrl($lang.'/home');
}

私がroutes.iniに持っているルート$lang.'/home'は、デフォルトモジュールのindexControllerとindexActionにルーティングされます。

于 2013-09-16T19:59:21.863 に答える
0

使用している Zend のバージョンがわからないため、Zend 1.1x用に投稿しています。あなたができることの1つは、リクエストがディスパッチされる前に「キャッチ」し、Accept-Language ヘッダーを取得し、ユーザーの設定に基づいてロケールを設定するか、ユーザーを好きなURLにリダイレクトすることです。これを行う 1 つの方法は、FrontController'spreDispatch() メソッドを使用することです。それを念頭に置いて:

  1. すべてのブラウザがこれを送信するかどうかを確認する必要があります
  2. このヘッダー文字列は慎重に解析する必要があります

それが定義されている方法のため: Accept-Language en,bg;q=0.7,en-us;q=0.3

また、ユーザーは言語設定を外国語に設定する場合があり、多くの場合、このヘッダーだけでは不十分な場合があります。

OOP の方法でこれを行う最善の方法は、この機能を ZendPlugin でラップすることです。ブートストラップにアタッチします:

    protected function _initLocaleHandlerControllerPlugin() {
        $frontController = Zend_Controller_Front::getInstance();
        $plugin = new App_Controller_Plugin_LocaleHandler();
        $frontController->registerPlugin($plugin);
    }

このプラグインで、preDispatch()コールバックを再定義します。

public function preDispatch(Zend_Controller_Request_Http $request) {
    $acceptLang = $request->getHeader('Accept-Language');
     //Parse string and get language
    //After parsing set the appropriate locale in `Zend_Locale`
    //redirect the user/dispatch the request?
    //THIS IS JUST AN EXAMPLE:
     $request->setModuleName('home')
             ->setControllerName('registration')
             ->setDispatched(true);
}

Zend 1.x にはこのためのクラスが組み込まれていないようです。Zend 2 には"Zend\Http\Header\AcceptLanguage" クラスがあります。

于 2013-09-16T08:24:04.890 に答える