19

WebアプリのローカリゼーションにLaravelLangクラスを使用しています。のlanguages配列に2つの言語を追加しましたapplication/config/application.php。これにより、ローカリゼーションに使用するデフォルトの言語が、URIの最初の部分が示すものに変更されます(例:bla.com/en/blaおよびbla.com/co/bla)。次に、現在のデフォルト言語が自分のビューにあるかどうかを確認できるようにする必要があります。Lang::$languageただし、Langクラスは、変数が保護されているため、私が理解できる限り、これをチェックする方法を提供しません。URIを手動で解析する以外に、これをチェックする方法はありますか?

4

11 に答える 11

35

Laravel でウェブサイトの現在の言語を知る最もクリーンな方法は次のようです。

Lang::locale();

https://laravel.com/api/5.8/Illuminate/Translation/Translator.html#method_locale

ウェブサイトのデフォルト言語を返す次のコマンドとは異なります。

Config::get('app.locale');
于 2015-07-08T16:40:07.803 に答える
8

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);    
    }
});
于 2012-11-21T14:28:58.853 に答える
7

新しい Laravel バージョンでは、次の方法で現在の言語を取得できます。

Config::get('app.locale');
于 2014-09-02T18:35:12.407 に答える
4

言語の問題の解決策を見つけました (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);
    }
});
于 2012-10-03T12:02:53.550 に答える
3

これは役立つかもしれません。Config::get('アプリケーション.言語')

于 2013-02-07T04:43:21.720 に答える
2

使用できます

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 つの異なる言語にアクセスできるようになりました。

http://laravel.com/en

http://laravel.com/es

http://laravel.com

于 2013-10-04T10:03:12.067 に答える
2

メソッドがドキュメントで使用されてApp::getLocale()いるため、おそらく最もサポートされているApp::setLocale('EN')方法を使用します

この方法はどこでも使用できます。どこかでエラーが発生した場合は、 を使用\App::...して機能させることができます。

Laravel5.0を使用しています。

于 2016-11-22T10:43:35.743 に答える
0

このLangクラスは特に正しい言語を出力するためのものであり、あなたが言うように言語を内部で管理します。

APIを調べると、これを直接支援する方法はなく、URIを解析して言語を取得することは、適切な行動のように思われます。

これを行うだけで、URI内の言語文字列を取得できます。

$language = URI::segment(1);

Laravelリクエストの調査

于 2012-10-03T10:48:44.630 に答える