78 lines
2.4 KiB
PHP
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);
|
|
}
|
|
}
|