🌐 Add full i18n system frontend + API (Story 1.3)

Nuxt i18n with lazy-loaded JSON files, localized routes, hreflang SEO tags,
LanguageSwitcher component. Laravel SetLocale middleware, HasTranslations trait,
API Resources and Controllers for projects/skills with Accept-Language support.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-05 18:17:44 +01:00
parent bba6128236
commit 262242c7df
20 changed files with 472 additions and 77 deletions

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\ProjectResource;
use App\Models\Project;
class ProjectController extends Controller
{
public function index()
{
$projects = Project::with('skills')->ordered()->get();
return ProjectResource::collection($projects)
->additional(['meta' => ['lang' => app()->getLocale()]]);
}
public function show(string $slug)
{
$project = Project::with('skills')->where('slug', $slug)->firstOrFail();
return (new ProjectResource($project))
->additional(['meta' => ['lang' => app()->getLocale()]]);
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\SkillResource;
use App\Models\Skill;
class SkillController extends Controller
{
public function index()
{
$skills = Skill::ordered()->get()->groupBy('category');
$grouped = $skills->map(fn ($group) => SkillResource::collection($group));
return response()->json([
'data' => $grouped,
'meta' => ['lang' => app()->getLocale()],
]);
}
}