WebアプリのローカリゼーションにLaravelLangクラスを使用しています。のlanguages配列に2つの言語を追加しましたapplication/config/application.php
。これにより、ローカリゼーションに使用するデフォルトの言語が、URIの最初の部分が示すものに変更されます(例:bla.com/en/blaおよびbla.com/co/bla)。次に、現在のデフォルト言語が自分のビューにあるかどうかを確認できるようにする必要があります。Lang::$language
ただし、Langクラスは、変数が保護されているため、私が理解できる限り、これをチェックする方法を提供しません。URIを手動で解析する以外に、これをチェックする方法はありますか?
11 に答える
Laravel でウェブサイトの現在の言語を知る最もクリーンな方法は次のようです。
Lang::locale();
https://laravel.com/api/5.8/Illuminate/Translation/Translator.html#method_locale
ウェブサイトのデフォルト言語を返す次のコマンドとは異なります。
Config::get('app.locale');
BenjaminRH の回答は非常に優れており、彼が提案したアプローチは完全に機能します。スニペットを少し改善しました。ブラウザの言語を検出し、アプリケーションの構成ファイルに従ってその言語がサポートされているかどうかを確認します。
簡単なハックですが、私のアプリでは機能します。アプリケーション言語も設定されていることに注意してください。鉱石改良などご自由にお使いください。
Route::filter('before', function()
{
// current uri language ($lang_uri)
$lang_uri = URI::segment(1);
// Set default session language if none is set
if(!Session::has('language'))
{
// use lang in uri, if provided
if(in_array($lang_uri, Config::get('application.languages')))
{
$lang = $lang_uri;
}
// detect browser language
elseif(isset(Request::server('http_accept_language')))
{
$headerlang = substr(Request::server('http_accept_language'), 0, 2);
if(in_array($headerlang, Config::get('application.languages')))
{
// browser lang is supported, use it
$lang = $headerlang;
}
// use default application lang
else
{
$lang = Config::get('application.language');
}
}
// no lang in uri nor in browser. use default
else
{
// use default application lang
$lang = Config::get('application.language');
}
// set application language for that user
Session::put('language', $lang);
Config::set('application.language', $lang);
}
// session is available
else
{
// set application to session lang
Config::set('application.language', Session::get('language'));
}
// prefix is missing? add it
if(!in_array($lang_uri, Config::get('application.languages')))
{
return Redirect::to(URI::current());
}
// a valid prefix is there, but not the correct lang? change app lang
elseif(in_array($lang_uri, Config::get('application.languages')) AND $lang_uri != Config::get('application.language'))
{
Session::put('language', $lang_uri);
Config::set('application.language', $lang_uri);
}
});
新しい Laravel バージョンでは、次の方法で現在の言語を取得できます。
Config::get('app.locale');
言語の問題の解決策を見つけました (IRC の nickstr と、この質問に対する受け入れられた回答に感謝します)。現在の言語をセッション変数として保存する必要があり、言語 uri セグメントが変更されたときに更新されます。
Route::filter('before', function()
{
// Do stuff before every request to your application...
// Default language ($lang) & current uri language ($lang_uri)
$lang = 'he';
$lang_uri = URI::segment(1);
// Set default session language if none is set
if(!Session::has('language'))
{
Session::put('language', $lang);
}
// Route language path if needed
if($lang_uri !== 'en' && $lang_uri !== 'he')
{
Return Redirect::to($lang.'/'.URI::current());
}
// Set session language to uri
elseif($lang_uri !== Session::get('language'))
{
Session::put('language', $lang_uri);
}
});
これは役立つかもしれません。Config::get('アプリケーション.言語')
使用できます
https://github.com/mcamara/laravel-localization
Laravel ローカライズは、リクエストに指定された URL を使用します。この目的を達成するには、routes.php ファイルにグループを追加する必要があります。ローカライズが必要なすべてのページをフィルタリングします。
// app/routes.php
Route::group(array('prefix' => LaravelLocalization::setLanguage()), function()
{
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route::get('/', function()
{
return View::make('hello');
});
Route::get('test',function(){
return View::make('test');
});
});
/** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/
このグループがルート ファイルに追加されると、ユーザーは「languagesAllowed」に追加されたすべての言語にアクセスできるようになります (デフォルトでは「en」と「es」。そのオプションを変更するには、構成セクションを参照してください)。たとえば、ユーザーは次のアドレスを使用して 2 つの異なる言語にアクセスできるようになりました。
メソッドがドキュメントで使用されてApp::getLocale()
いるため、おそらく最もサポートされているApp::setLocale('EN')
方法を使用します。
この方法はどこでも使用できます。どこかでエラーが発生した場合は、 を使用\App::...
して機能させることができます。
Laravel5.0を使用しています。
このLang
クラスは特に正しい言語を出力するためのものであり、あなたが言うように言語を内部で管理します。
APIを調べると、これを直接支援する方法はなく、URIを解析して言語を取得することは、適切な行動のように思われます。
これを行うだけで、URI内の言語文字列を取得できます。
$language = URI::segment(1);