2016-11-04 15 views
0

すべてのルートに$ locale-variableのプレフィックスを付けることにしました。これは、Google検索で見つかったコードです:laravelの言語変更URLの生成

$locale = Request::segment(1); 

if (in_array($locale, Config::get('app.available_locales'))) { 
    App::setLocale($locale); 
} else { 
    $locale = null; 
} 

Route::group(array('prefix' => $locale), function() { 

    //All my routes 

}); 

ここで、ロケール間をジャンプするために動的にURLを生成したいと思います。現在のURLまたはルートを生成する方法が必要ですが、$ locale-parameterを置き換えてください。あなたは、この擬似コードに似た何かを書くことができる必要があります:

route(Route::Current(), [$locale => 'foo']) 

質問:

私は私の現在のURLを取得し、その中で一つの引数を交換したいです。それ、どうやったら出来るの?

アップデート1:私のルートの名前を与える

、私はこれを行うことができるよ:

route('index', 'foo') //Gives mywebsite.com?foo 

このしかし、指名手配結果、mywebsite.com/fooを生成しません。 。代わりにmywebsite.com?fooを生成します。私の推測では、ルートはこのルートがネストされ、フラグメントのプレフィックスが付いていることを理解していないので、代わりに引数として扱います。それは私が変更したいロケールが助けにはならないであることを指定:

route('index', ['locale' => 'foo']) //Gives mywebsite.com?locale=foo 

アップデート2:代わりに言うために接頭辞を変更する

Route::group(array('prefix' => '{locale?}'), function() { 

はルート()の作業を行います:

route('index', ['locale' => 'foo']) //Gives mywebsite.com/foo 

ただし、いくつかのURLが破損しています。そのうちのいくつかは変数で始まるため、 routes.phpのは「fooは」今、言語としてのURL mywebsite.com/fooを解釈したよう

Route::get('/{id}', '[email protected]'); 

:ルートグループ内の次のルートは、作業を停止します。 routes.phpにlocaleのデフォルト値を設定して{route?}の代わりに{route}と書くことができるようにする方法があれば、それがデフォルトロケールにリダイレクトされるようにすれば問題は解決します。

アップデート3:

「プレフィックス」=>「{?ロケールを}」を有するの方向に移動するには、代わりに追求する価値があるとあまりにも多くのサブ問題につながります。問題は、現在のURLからURLを生成することに戻りますが、URLに言語を挿入することになります。私は現在、これは最も単純な解決策であるため、正規表現の置き換えだけでこれを行うことを検討しています。

+0

あなたは 'すべての[my] routes'にプレフィックスを付けたいと思いますが、それをオプションにしたいと思っていますか?あなたは本当に何をしたいですか?私はあなたのルートのすべてまたは無しにプレフィックスを付ける方が良いと思います。 – Yannici

+0

私は、ロケールがURLにあるロケールシステムを使いたいと思っています。ロケールがurl/requestから欠落している場合は、デフォルトのロケールを使用する必要があります。 – Rkey

+0

Laravelは最初のパラメータをいつロケールとして解釈するのか、そうでないのかをわからないので、これは簡単ではないと思います。 – Yannici

答えて

0

私はこれをテストしませんでしたが、このようにしてみることもできます。 パラメータを指定しないと、デフォルトのロケールルートに簡単にリダイレクトできます。最初のパラメータが指定されている場合は、正しいロケールであるかどうかを確認する必要があります。

use Illuminate\Support\Facades\Request; 

$defaultLocale = 'en'; 

Route::get('/', function() use ($defaultLocale) { 
    return redirect('/' . $defaultLocale); 
}); 

Route::group(array('prefix' => '{locale}'), function($locale) use ($defaultLocale) { 

    if(!in_array($locale, Config::get('app.available_locales'))) { 
      return redirect('/' . $defaultLocale . '/' . Request::path()); 
    } 

    // All your routes 

}); 
+0

これはインデックスでは機能しますが、すべてのサイトでは機能しません。誰かがmywebsite.com/aboutにまっすぐ行くと、mywebsite.com/en/aboutの代わりにmywebsite.com/enにリダイレクトされます。それは近いです! – Rkey

+0

(プレフィックスグループ内の)次のコンポーネント(ベースURL /ロケール/現在の要求)でURLにリダイレクトする必要があります。 –

+0

「現在のリクエスト」にはどのようにアクセスしますか? – Rkey

0

私はこれをlaravelの魔法で解決しなかったので、自分のコードを書きました。

ルート::グループは同じまま、私はURLを作成するために使用するコード:異なる言語へのsが次のようになります。

<a href="{{ change_locale_url('en') }}"</a> 

change_locale_url機能は、URLを使用するだけで正規表現関数です:: Currentを使用して現在のURLを取得し、入力文字列をURLの言語パラメータとして挿入または置換します。

  • 私はmywebsite.com/about上だと、関数の出力は、私がwww.mywebsite.com/de/aboutにいる時、関数はWWWを出力
  • をmywebsite.com/en/about。リマインダー、このルートグループを使用しているときに、アクション(「インデックス@にHomeController」)を使用してリンクを作成する必要があるとしてmywebsite.com/en/about
  • 私はhttp://mywebsite.com上だし、機能出力http://mywebsite.com/en

ロケールを次のリンクに連れていかなければなりません。/aboutにリンクすると、現在選択されている言語が削除されます。