2017-10-24 7 views
1

php 소프트웨어에 Laravel Framwork을 사용하고 있으며 JaveScript 개 파일 내의 텍스트를 localizaing하는 문제가 발생했습니다.Laravael의 JavaScript 지역

각 사용자의 locale을 설정하는 데이터베이스 값이 있습니다.

App::setLocale(Auth::user()->lang)Middleware 폴더에 있습니다. @lang('file.name') 또는 trans('file.name')을 사용하여 다른 blades에서 예상대로 작동합니다.

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