2017-10-24 18 views
1

私のphpソフトウェアにLaravel Framworkを使用していて、JaveScriptファイル内のテキストをローカライズする際に問題が発生しました。LaravaelのJavaScriptローカライゼーション

各ユーザーのlocaleを設定するデータベース値があります。

App::setLocale(Auth::user()->lang)Middlewareフォルダです。異なるbladesで期待通りに動作し、@lang('file.name')またはtrans('file.name')のいずれかを使用します。

私のJavaScriptファイルの場合、私はthis methodを使用しています。正常に動作しますが、localeはミドルウェアの値に基づいて更新されませんが、ロケールの値はconfig/app.phpに基づいています。 phpページはすべて、データベース値に従って動作し、更新されます。

何が不足していると思いますか?

答えて

2

問題はlink that you providedで、現在の言語のすべての翻訳を取得し、それを永久にキャッシュするという点です。したがって、言語を変更しても、/js/lang.jsは常に同じキャッシュレスポンスを返します。

(コードを見て)あなたは言語ごとにそれをすると、言語ごとにユニークなキャッシュキーを使用する必要があるキャッシュを作成するときに、言語のすべての翻訳ファイルを読み込むの応答をキャッシュすることは良い考えですが
// 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

完全に動作します。ありがとう! – Nik

+0

@Nik翻訳ファイルに新しい行を追加するか、既存の翻訳を更新する場合は、すぐに変更が表示されないことを覚えておく必要があります。私の例では、10(分)を入れましたが、設定ファイルや.envの値を変更することができます。 – ljubadr

+0

@Nikまた、 'Route :: get( ' /js/{language}/lang.js '、function($ language){'あなたの次の問題が** lang.js **ファイルをキャッシュするブラウザになるので、あなたは同じ問題を抱えます。変更してください...おそらくロジックを更新することを検討してください – ljubadr

関連する問題