mariuzzo/laravel-js-localization
Export Laravel translation files to JavaScript. Generate a JS bundle (with Lang.js) via artisan to use familiar Laravel-style trans() and pluralization on the frontend. Supports Laravel 4.2 through 8.x, with options to choose files and output path.
Installation
composer require mariuzzo/laravel-js-localization
Publish the config file:
php artisan vendor:publish --provider="Mariuzzo\LaravelJsLocalization\LaravelJsLocalizationServiceProvider" --tag="config"
Basic Configuration
Edit config/js-localization.php to define your locales and paths:
'locales' => [
'en' => 'en',
'es' => 'es',
],
'paths' => [
'en' => resource_path('lang/en.json'),
'es' => resource_path('lang/es.json'),
],
First Use Case: Localized Strings in Blade
@jsLocalization(['greeting' => 'Hello'])
Access in JavaScript:
const greeting = @json($jsLocalization['greeting']);
First Use Case: Full Locale Integration
@jsLocalization(['locale' => 'es'])
Access in JavaScript:
const translations = @json($jsLocalization);
console.log(translations.greeting); // 'Hola' (if defined in es.json)
@jsLocalization directive in Blade to pass locale-specific translations to JavaScript.
@jsLocalization(['locale' => app()->getLocale()])
const { greeting, error } = @json($jsLocalization);
async function switchLocale(locale) {
const response = await fetch(`/api/locale?locale=${locale}`);
const data = await response.json();
window.jsLocalization = data; // Update global object
}
public function switchLocale(Request $request) {
$request->session()->put('locale', $request->locale);
return response()->json([
'locale' => $request->locale,
'translations' => $this->getTranslations($request->locale),
]);
}
export default {
data() {
return {
translations: @json($jsLocalization),
};
},
methods: {
getTranslation(key) {
return this.translations[key] || key;
},
},
};
const translations = @json($jsLocalization);
const App = () => <div>{translations.greeting}</div>;
config/js-localization.php:
'fallbackLocales' => [
'es' => 'en',
'fr' => 'en',
],
es.json, it falls back to en.json.$paths = [
'en' => storage_path('app/lang/custom/en.json'),
'es' => storage_path('app/lang/custom/es.json'),
];
config(['js-localization.paths' => $paths]);
Caching Issues
php artisan view:clear
cache.jsLocalization is set to false in config/js-localization.php during development.Locale Mismatch
app()->getLocale() matches the expected JSON file (e.g., es vs. es_ES).JSON Syntax Errors
Missing Translations
{{ __('missing_key') }} outputs missing_key). Use fallback locales or default values:
const message = translations.someKey || 'Default Message';
Blade Directive Scope
@jsLocalization directive must be placed before any JavaScript that uses the translations. Avoid nesting it inside conditional Blade directives if the JS runs unconditionally.Inspect Output Dump the generated JSON to verify content:
@php
dd($jsLocalization);
@endphp
Check Config
Verify config/js-localization.php paths and locales:
dd(config('js-localization'));
Network Tab Inspect the HTTP response in Chrome DevTools to ensure translations are being passed correctly.
Custom Translation Loader Extend the package by binding a custom loader:
use Mariuzzo\LaravelJsLocalization\Loaders\TranslationLoaderInterface;
class CustomLoader implements TranslationLoaderInterface {
public function load($locale) {
return json_decode(file_get_contents("custom/path/{$locale}.json"), true);
}
}
// Register in a service provider:
app()->bind(TranslationLoaderInterface::class, function () {
return new CustomLoader();
});
Middleware for Locale Force a locale for specific routes:
public function handle($request, Closure $next) {
app()->setLocale('es');
return $next($request);
}
Pluralization Support Use Laravel’s built-in pluralization helpers in JSON files:
{
"messages": {
"one": "One item",
"many": ":count items"
}
}
Access in JavaScript:
const count = 5;
const message = @json($jsLocalization.messages).replace(':count', count);
Interpolation
Use placeholders in JSON (e.g., "welcome": "Welcome, :name!") and replace them in JavaScript:
const name = 'John';
const welcome = translations.welcome.replace(':name', name);
How can I help you explore Laravel packages today?