alecscodes / inertia-i18n
Minimal i18n for Laravel Inertia — share PHP and JSON translations with t() and tc() on the frontend
Requires
- php: ^8.2
- illuminate/support: ^10.0 || ^11.0 || ^12.0 || ^13.0
- illuminate/view: ^10.0 || ^11.0 || ^12.0 || ^13.0
- inertiajs/inertia-laravel: ^2.0 || ^3.0
Requires (Dev)
- orchestra/testbench: ^8.0 || ^9.0 || ^10.0 || ^11.0
- pestphp/pest: ^2.0 || ^3.0 || ^4.0
README
Minimal i18n bridge for Laravel + Inertia.js — share your PHP and JSON translation files with the frontend.
Requirements
- PHP
^8.2 - Laravel
^10.0 || ^11.0 || ^12.0 || ^13.0 - Inertia Laravel
^2.0 || ^3.0
Install
composer require alecscodes/inertia-i18n
Publish
php artisan vendor:publish --tag=inertia-i18n-js php artisan vendor:publish --tag=inertia-i18n-config
Configure
In config/inertia-i18n.php, set shared to only the groups used on every page (e.g. common, nav) and load everything else per-page with ->withTranslations().
'shared' => ['common', 'nav'];
You can also use ['*'] in config/inertia-i18n.php to load all translation files on every page. This is a convenient quickstart for small apps (no need to touch each controller), but it can become heavy if you have a lot of translations.
'shared' => ['*'],
Frontend
import { useTranslation } from '@/vendor/inertia-i18n/useTranslation'; const page = /* get the Inertia page object from your adapter */ const { t, tc, locale } = useTranslation(page.props); t('settings.two_factor.title') // Two-factor authentication
Backend
When using ['*'] in the config to load all translations globally, the ->withTranslations() calls are not required.
return Inertia::render('Dashboard') ->withTranslations('dashboard', 'widgets');
Localization
Translation files are loaded from:
lang/{locale}/**/*.phplang/{locale}/**/*.json
(subdirectories are supported)
Language switching can be implemented using any method you prefer (e.g., route parameters, session, cookies, etc.).
Set the locale before rendering the Inertia response:
app()->setLocale($locale);
📄 License
The MIT License (MIT). Please see LICENSE.md for more information.
Made with ♥ for the Laravel community