2016-05-02 15 views
2

Ich möchte meine Clientsprache erkennen, indem ich die vom Browser empfohlene Sprache erhalte.So erkennen Sie die Spracheinstellungen in Laravel 5

Zum Beispiel, wenn Sie den Browser in Japan öffnen, gibt es mir Ländercode oder Ländername aktuellen Benutzer geöffnet wie "en-jp" oder "Japan".

Ich versuche diesen Code, aber es scheint die Sprache anzuzeigen, die ich zuvor ausgewählt habe und standardmäßig ist es Englisch.

Ich setze eine Middleware und ich muss den API-Teil ausschließen, weil ich einige Router habe, die diese Adresse anpingen und Router-Browser keine Sprachinformation hat, die das System brick.

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

Vielen Dank für Ihre Hilfe.

Antwort

9

Um einfach das Gebietsschema aus der Kopfzeile zu erhalten, können Sie den Wert http-accept-language aus der Anfrage holen. Dies ist über eine Fassade oder Sie können die Anfrage Variable in der Middleware verwenden:

Request::server('HTTP_ACCEPT_LANGUAGE') 

// OR 

$request->server('HTTP_ACCEPT_LANGUAGE'); 

Dies gibt eine Zeichenfolge, die wie folgt aussieht: en-GB,en;q=0.8. Sie können es dann analysieren (vielleicht mit explode()?) Und greifen Sie die Sprache von dort.

Allerdings kann diese Art von Sache manchmal kompliziert werden. Wenn Sie etwas weiter fortgeschritten tun müssen, gibt es ein Paket, das alles für Sie tun können:

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

1

ich nur eine Middleware für diese gemacht, kann es nützlich sein.

Zuerst setzen Sie $availableLangs das Array der verfügbaren Sprachen in Ihrer App, Sie können config\app.php verwenden, anstatt das Array in der Middleware zu initialisieren, wie ich es getan habe.

Wenn die erste Sprache in den Daten der Anforderungssprache verfügbar ist, wird das Gebietsschema festgelegt, andernfalls wird das nächste gesucht.

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

Oder Sie können Illuminate\Http\Request::getPreferredLanguage

Wie diese in Middleware verwenden:

<?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); 
    } 
}