web-dev-qa-db-ja.com

Laravelビューで現在の言語を見つけるにはどうすればよいですか?

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

14
BenjaminRH

ベンジャミンRHの答えはとても良く、彼の提案されたアプローチは完璧に機能します。スニペットを少し改善しました。これでブラウザの言語が検出され、その言語がアプリケーションの設定ファイルに従ってサポートされているかどうかが確認されます。

それは簡単なハックですが、私のアプリで動作します。アプリケーション言語も設定されていることに注意してください。それを改善する鉱石を使用してお気軽に。

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);    
    }
});
9
aebersold

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

Lang::locale();

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

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

Config::get('app.locale');
24
Erwan

新しいLaravelバージョンでは、次のコマンドで現在の言語を取得できます:

Config::get('app.locale');
6
Pedro Moreira

これはうまくいくでしょう

lang="{{ app()->getLocale() }}"
4
NIRAJ KUMAR

別の方法としては、少し短い方法として、次のようなものを使用できます。

app()->getLocale()

これの利点は、PHPStormなどのIDEがこの機能を認識し、開発時間を大幅に短縮できることです。

4
ThatMSG

私は言語の問題の解決策を見つけました(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);
    }
});
4
BenjaminRH

これは役立つかもしれません。 Config :: get( 'application.language')

3
Johny Salas

使用できます

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 **/

このグループがroutesファイルに追加されると、ユーザーは「languagesAllowed」に追加されたすべての言語にアクセスできます(デフォルトは「en」と「es」、そのオプションを変更するにはconfigセクションをご覧ください)。たとえば、ユーザーは次のアドレスを使用して2つの異なる言語にアクセスできるようになりました。

http://laravel.com/en

http://laravel.com/es

http://laravel.com

2
Sangar82

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

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

Laravel 5.0を使用しています。

1

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

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

URIで言語文字列を取得するには、いつでもこれを行うことができます。

$language = URI::segment(1);

検査Laravelリクエスト

0
David Barker