vernova/app/Http/Middleware/SetLocale.php
2026-07-26 19:58:27 +03:30

78 lines
2.4 KiB
PHP

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Symfony\Component\HttpFoundation\Response;
class SetLocale
{
/**
* Handle an incoming request.
* Set the application locale based on priority:
* user preference > tenant preference > session > browser > config default.
*/
public function handle(Request $request, Closure $next): Response
{
$locale = null;
$calendar = null;
// 1. Session preference (highest priority - user just changed it)
$locale = session('locale');
$calendar = session('calendar');
// 2. Authenticated user preference (database stored preference)
if (!$locale && $request->user()) {
$locale = $request->user()->getLocale();
$calendar = $request->user()->getCalendar();
}
// 3. Tenant preference
if (!$locale && session('tenant_id')) {
$tenant = \App\Models\Tenant::find(session('tenant_id'));
if ($tenant) {
$locale = $locale ?? $tenant->default_locale;
$calendar = $calendar ?? $tenant->default_calendar;
}
}
// 4. Browser preference
if (!$locale) {
$browserLang = substr($request->getPreferredLanguage(), 0, 2);
$supportedLocales = config('projectra.supported_locales', ['fa', 'en']);
if (in_array($browserLang, $supportedLocales)) {
$locale = $browserLang;
}
}
// 5. Config default (lowest priority)
if (!$locale) {
$locale = config('projectra.default_locale', 'fa');
}
if (!$calendar) {
$calendar = config('projectra.default_calendar', 'jalali');
}
// Set the application locale
App::setLocale($locale);
// Store in session for subsequent requests
session(['locale' => $locale, 'calendar' => $calendar]);
// Share locale, direction, and calendar with all views
$rtlLocales = config('projectra.rtl_locales', ['fa', 'ar', 'he']);
$direction = in_array($locale, $rtlLocales) ? 'rtl' : 'ltr';
view()->share([
'currentLocale' => $locale,
'currentDirection' => $direction,
'currentCalendar' => $calendar,
]);
return $next($request);
}
}