Files
BetiX/app/Http/Controllers/LocaleController.php
Dolo 0280278978
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (8.4) (push) Has been cancelled
tests / ci (8.5) (push) Has been cancelled
Initialer Laravel Commit für BetiX
2026-04-04 18:01:50 +02:00

49 lines
1.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cookie;
class LocaleController extends Controller
{
/** @var array<string> */
private array $available = [
'en','de','es','pt_BR','tr','pl',
'fr','it','ru','uk','vi','id','zh_CN','ja','ko','sv','no','fi','nl',
];
public function set(Request $request)
{
$data = $request->validate([
'locale' => ['required','string','max:8'],
]);
$code = $this->normalize($data['locale']);
if (!in_array($code, $this->available, true)) {
return response()->json(['message' => 'Unsupported locale.'], 422);
}
// Persist to session and cookie (1 year)
$request->session()->put('locale', $code);
Cookie::queue(cookie('locale', $code, 60 * 24 * 365));
// Update user preference if logged in (no local DB writes in gateway)
if ($user = $request->user()) {
if (($user->preferred_locale ?? null) !== $code) {
// Defer persistence to external API if needed; here we only keep session/cookie.
// Optionally enqueue an event to sync upstream.
}
}
return response()->noContent();
}
private function normalize(string $code): string
{
$code = str_replace([' ', '-'], ['','_'], trim($code));
if (strtolower($code) === 'pt_br') return 'pt_BR';
if (strtolower($code) === 'zh_cn') return 'zh_CN';
return strtolower($code);
}
}