2011-12-21 3 views
1

私は自分のウェブサイトにローカリゼーションを実装しようとしています。現在、基本(英語)ウェブサイトはhttp://domain.com/controller/actionで、各ローカライゼーションはhttp://domain.com/locale/controller/actionにします。基本的に、ユーザーが後者のURLを訪問する場合、Kohanaは英語版と同じコントローラーとアクションを使用します。コードでは、単に文字列を交換します。コナナでdomain.com/locale/controllerをdomain.com/controllerにルーティングするにはどうすればよいですか?

現在、私は次のルートを追加してみましたが、それはうまくいきませんでした:

// This is my default route: 
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?')) 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

// This the route for the localizations: 
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?')) 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

をこの設定で、私はhttp://domain.com/es/controller/actionを訪問した場合、私は404エラーになります。どのように私はこの仕事をするために私のルートを設定する必要がありますか?

編集:

私は単に示唆したように、それが動作するルールを交換する場合だけで、マティーノとジョン・ヒメルマンの答えを完了させます。しかし、「ロケール」ルートはキャッチオールルートとなり、は常にに必要なものがすべてデフォルトのもの(私の場合は "en" /英語)でもロケールを指定する必要があります。これを修正するには、 "ロケール"パラメータをサポートするロケールに制限することができます。例:

Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('locale' => '(fr|zh|en)', 'overflow' => '.*?')) 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?')) 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

この場合、「fr」、「zh」または「en」で始まるURLのみがサポートされます。さらに、サポートされていないロケールは404エラーを返し、 "domain.com/controller/action"はデフォルトの英語ロケールを正しく表示します。

+2

スワッピングルールを試してください(最も一般的なルールは最後のルールになるはずです) – matino

答えて

2

Kohanaは、ブートストラップに表示されている順序でルートを適用します。このため、デフォルト/キャッチオールルートは常に最後に定義する必要があります。

KO 3.0 routingドキュメントから:

ルートがそれらが追加されているため に一致していることを理解することが重要である、とすぐURLがルートと一致するよう、ルーティングは 、本質的に「停止」され、残りのルートは一度も試みられません。 デフォルトルートは空の URLを含むほとんどのものと一致するため、その前に新しいルートを配置する必要があります。

推奨されているように、経路を交換すると問題が解決されます。

// This the route for the localizations: 
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?')) 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 


// This is my default route: 
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?')) 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 
+0

ありがとうございました。 –

関連する問題