vxm/laravel-view-localization
Installation:
composer require vxm/laravel-view-localization
Publish the config (if needed):
php artisan vendor:publish --provider="Vxm\ViewLocalization\ViewLocalizationServiceProvider"
Basic Usage:
Define locale-specific views in resources/views/{locale}/ (e.g., resources/views/en/, resources/views/vi/).
Example structure:
resources/
├── views/
│ ├── en/
│ │ └── welcome.blade.php
│ └── vi/
│ └── welcome.blade.php
First Use Case: Render a view dynamically based on the user's locale:
// In a controller or route closure
return view('welcome'); // Automatically resolves to `en/welcome.blade.php` or `vi/welcome.blade.php`
Locale Detection:
Ensure your app detects the user's locale (e.g., via middleware or AppServiceProvider):
// app/Providers/AppServiceProvider.php
public function boot()
{
$locale = session('locale') ?? app()->getLocale();
app()->setLocale($locale);
}
Locale-Aware View Resolution:
view('home') will look for:
resources/views/{locale}/home.blade.php → resources/views/home.blade.php.Fallback Logic:
config/view-localization.php:
'fallback_locale' => 'en',
'fallback_to_default' => true,
Dynamic Locale Switching:
app()->setLocale('vi');
return view('welcome'); // Now renders `vi/welcome.blade.php`
Partial Localization:
@localize directives:
@localize('vi')
{{ __('vi.some.key') }}
@endlocalize
Integration with Middleware:
public function handle($request, Closure $next)
{
$locale = $request->header('Accept-Language') ?? 'en';
app()->setLocale($locale);
return $next($request);
}
Testing:
$this->app->setLocale('vi');
$this->get('/')->assertViewIs('welcome');
Locale-Specific Assets:
laravel-mix or vite to load locale-specific JS/CSS:
// resources/js/app.js
const locale = document.querySelector('html').getAttribute('lang');
import(`./locales/${locale}.js`);
Fluent API for Chaining:
return view('dashboard')
->with('user', $user)
->locale('vi'); // Override locale for this view only
Caching:
View::addNamespace('locale', resource_path('views'));
View::addLocation(public_path('views_cache'));
API Responses:
return response()->json(['error' => __('errors.something')], 400);
View File Naming:
.blade.php extension in the view name.
Fix: Always use view('path.to.view') with extensions omitted (Laravel handles it).resources/views/ directory.
Fix: Keep default views separate and use fallback_locale in config.Locale Detection Race Conditions:
HandleIncomingRequest middleware.Caching Issues:
php artisan view:clear
Namespace Conflicts:
en/home and vi/home).
Fix: Ensure unique filenames or use subdirectories (e.g., en/dashboard/home).Translation Overrides:
@localize directives not working as expected.
Fix: Ensure the directive is placed outside of @include blocks and that the locale is set before rendering.Check Resolved Locale:
dd(app()->getLocale()); // Debug current locale
View Resolution Logs: Enable debug mode to see which view files are being resolved:
View::addNamespace('debug', function ($view) {
\Log::debug("Resolving view: $view");
return $view;
});
Fallback Behavior:
config(['view-localization.fallback_to_default' => false]);
File Permissions:
storage/framework/views is writable for caching:
chmod -R 775 storage/
Custom View Locations:
config/view-localization.php:
'paths' => [
resource_path('views/{locale}'),
resource_path('views/custom/{locale}'),
],
Locale Providers:
Vxm\ViewLocalization\Contracts\LocaleProvider:
use Vxm\ViewLocalization\Contracts\LocaleProvider;
class SessionLocaleProvider implements LocaleProvider
{
public function getLocale()
{
return session('locale', app()->getLocale());
}
}
Register in AppServiceProvider:
ViewLocalization::extend('session', function () {
return new SessionLocaleProvider();
});
Event Listeners:
view.localized events to log or modify locale-specific views:
View::listen('localized', function ($view, $locale) {
\Log::info("View $view localized to $locale");
});
Blade Directives:
@localize with custom logic:
Blade::directive('localize', function ($locale) {
return "<?php echo app()->setLocale($locale); ?>";
});
How can I help you explore Laravel packages today?