So, I'm sure there are a couple of ways to do this but this is how I did it in a project about 6 months ago.
I added a script tag that loads a "dynamic" JavaScript file. It doesn't point to a real file. It's just there to make a GET request. So first add this line to your master template file.
<script src="/lang-{{ app()->getLocale() }}.js"></script>
Depending on the current locale set, the above script will make a GET request to lang-<your-locale>.js. Then you have to setup a route that responds to this request. Here is how I did it.
routes/web.php
Route::get('/lang-{lang}.js', 'LanguageController@show');
LanguageController.php
public function show($locale)
{
$locale = in_array($locale, config('app.locales')) ? $locale : config('app.fallback_locale');
$files = glob(resource_path('lang/' . $locale . '/*.php'));
$strings = [];
foreach ($files as $file) {
$name = basename($file, '.php');
$strings[$name] = require $file;
}
$contents = 'window.i18n = ' . json_encode($strings, config('app.debug', false) ? JSON_PRETTY_PRINT : 0) . ';';
$response = \Response::make($contents, 200);
$response->header('Content-Type', 'application/javascript');
return $response;
}
The controller does a simple thing. It looks inside your Laravel Locale folder and get all the files that match the query passed in (the $locale). Then it reads the contents of those files and basically builds a JS file and returns that. All that file does is store all the language key & value pairs in an i18 variable. Since this variable is stored globally you can access it from any of your Vue files. You can even make a simple helper function to use what you would use in PHP.
import _ from 'lodash'
Vue.prototype.__ = str => _.get(window.i18n, str)
All this does is it gives you a helper function you can use in your Vue files easily. For example you can use it as __('auth.failed')
I hope I explained enough (I'm kinda tired and couldn't explain more, maybe tomorrow :) )