2017-10-24 2 views
1

Ich benutze Laravel Framwork für meine php Software und ich lief auf ein Problem mit der Lokalisierung des Textes innerhalb der JaveScript Dateien.JavaScript Lokalisierung in Laravael

Ich habe einen Datenbankwert, der die locale jedes Benutzers setzt.

App::setLocale(Auth::user()->lang) in der Middleware Ordner. Es funktioniert wie erwartet auf den verschiedenen blades mit @lang('file.name') oder trans('file.name').

Für meine JavaScript Dateien verwende ich this method. Es funktioniert gut, aber es scheint, dass es die locale basierend auf dem Wert in der Middleware nicht aktualisiert, aber basierend auf dem Gebietsschema-Wert in config/app.php. Die php Seiten arbeiten alle und aktualisieren entsprechend dem Datenbankwert.

Irgendeine Idee, was ich vielleicht fehlen würde?

Antwort

2

Problem in der link that you provided ist, dass es alle Übersetzungen für die aktuelle Sprache erhält und es für immer zwischenspeichern wird. Auch wenn Sie die Sprache wechseln, gibt /js/lang.js immer dieselbe zwischengespeicherte Antwort zurück.

Während es gute Idee ist es, die Reaktion des Lesens aller Übersetzungsdateien für die Sprache cachen, wenn Sie den Cache erstellen müssen Sie tun, dass pro Sprache und pro Sprache einzigartigen Cache-Schlüssel zu verwenden (siehe den Code)

// Localization 
Route::get('/js/lang.js', function() { 

    $minutes = 10; 
    $lang = App::getLocale(); 

    // each language it will be cached with different key 
    // example: "en.lang.js", "fr.lang.js", ... 
    $strings = Cache::remember($lang.'.lang.js', $minutes, function() use ($lang) { 

     $files = glob(resource_path('lang/' . $lang . '/*.php')); 
     $strings = []; 

     foreach ($files as $file) { 
      $name   = basename($file, '.php'); 
      $strings[$name] = require $file; 
     } 

     return $strings; 
    }); 

    return response('window.i18n = ' . json_encode($strings) . ';') 
       ->header('Content-Type', 'text/javascript'); 
})->name('assets.lang'); 
+0

Funktioniert perfekt. Vielen Dank! – Nik

+0

@Nik Wenn Sie Übersetzungsdateien eine neue Zeile hinzufügen oder vorhandene Übersetzungen aktualisieren, müssen Sie daran denken, dass Änderungen nicht sofort angezeigt werden. In meinem Beispiel habe ich 10 (Minuten) gesetzt, aber Sie können das optimieren, Sie können den Wert in der Konfigurationsdatei oder sogar .env verschieben – ljubadr

+0

@Nik Ich würde auch empfehlen, die Sprache in der 'Route :: get (' /js/{language}/lang.js ', function ($ language) {'als nächstes Problem wird die Browser-Caching-Datei ** lang.js ** sein. Und dann wirst du das gleiche Problem haben - diese Sprache nicht ändern ... also vielleicht in Betracht ziehen, die Logik zu aktualisieren – ljubadr