2016-05-02 18 views
2

ブラウザの推奨言語を取得してクライアント言語を検出したいと考えています。Laravel 5の言語設定を検出する方法

たとえば、日本でブラウザを開くと、現在のユーザーが「en-jp」または「japan」のように開いた国コードまたは国名が表示されます。

私はこのコードを試しますが、これまでに選択した言語が表示されているようですが、デフォルトでは英語です。

私はミドルウェアを設定しました。私は一部のルータにこのアドレスをpingしているため、ルータのブラウザにはシステムの言語情報がありません。

class BeforeMiddleware 
{ 

/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @return mixed 
*/ 

protected $except_urls = [ 
    'api/*' 
]; 

public function handle($request, Closure $next) 
{ 
    $langArr = array("en", "fr"); 
    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
     $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); 
    } else { 
     $languages[0] = "en"; 
    } 
    if (Session::has('locale')) { 
     App::setLocale(Session::get('locale')); 
    } else { 
     if (in_array($languages[0], $langArr)) 
      App::setLocale($languages[0]); 
    } 
    return $next($request); 
} 


} /* end class */ 

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

答えて

9

単純にヘッダーからロケールを取得するには、要求からhttp-accept-language値を取得できます。これは、ファサードを経由してアクセス可能であるか、あなたのミドルウェアでリクエスト変数を使用することができます:en-GB,en;q=0.8

Request::server('HTTP_ACCEPT_LANGUAGE') 

// OR 

$request->server('HTTP_ACCEPT_LANGUAGE'); 

これは、このようになります文字列を返します。あなたはそれを解析し(たぶんexplode()?を使用して)、そこから言語を取得することができます。

しかし、この種のことは時々複雑になることがあります。あなたは、より高度な何かをする必要がある場合は、あなたのためにこれのすべてを行うことができますパッケージがあります:

https://github.com/mcamara/laravel-localization

1

私はちょうどこのミドルウェアを作り、それが有用である可能性があります。

まず、$availableLangsのアプリで使用可能な言語の配列を設定します。私が行ったようにミドルウェアの配列を初期化する代わりに、config\app.phpを使用することができます。

第1言語がリクエスト言語のデータで利用可能な場合は、ロケールを設定し、そうでなければロケールを検索します。

class GetRequestLanguage 
{ 

    public function handle($request, Closure $next) 
    { 
     if (Session::has('locale')) { 
      App::setLocale(Session::get('locale')); 
     } else { 
      $availableLangs = ['pt', 'en']; 
      $userLangs = preg_split('/,|;/', $request->server('HTTP_ACCEPT_LANGUAGE')); 

      foreach ($availableLangs as $lang) { 
       if(in_array($lang, $userLangs)) { 
        App::setLocale($lang); 
        Session::push('locale', $lang); 
        break; 
       } 
      } 
     } 

     return $next($request); 
    } 
} 
0

それとも、ミドルウェアでは、このようIlluminate\Http\Request::getPreferredLanguage

を使用することができます。

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Contracts\Session\Session; 
use Illuminate\Http\Request; 

class Locale { 

    const SESSION_KEY = 'locale'; 
    const LOCALES = ['en', 'cs']; 

    public function handle(Request $request, Closure $next) { 
    /** @var Session $session */ 
    $session = $request->getSession(); 

    if (!$session->has(self::SESSION_KEY)) { 
     $session->put(self::SESSION_KEY, $request->getPreferredLanguage(self::LOCALES)); 
    } 

    if ($request->has('lang')) { 
     $lang = $request->get('lang'); 
     if (in_array($lang, self::LOCALES)) { 
     $session->put(self::SESSION_KEY, $lang); 
     } 
    } 

    app()->setLocale($session->get(self::SESSION_KEY)); 

    return $next($request); 
    } 
} 
関連する問題