feat: revue de code, doc CODE_REVIEW, forfaits 2026, traduction LLM, providers avec modèle

Made-with: Cursor
This commit is contained in:
Sepehr Ramezani
2026-03-07 11:42:58 +01:00
parent 3d37ce4582
commit 473b3e26c7
181 changed files with 30617 additions and 7170 deletions

View File

@@ -0,0 +1,71 @@
"use client";
import { Globe } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { useI18n, type Locale } from "@/lib/i18n";
const languages: { value: Locale; label: string; flag: string }[] = [
{ value: "en", label: "English", flag: "🇬🇧" },
{ value: "fr", label: "Français", flag: "🇫🇷" },
];
interface LanguageSwitcherProps {
variant?: "select" | "button";
}
export function LanguageSwitcher({ variant = "select" }: LanguageSwitcherProps) {
const { locale, setLocale } = useI18n();
if (variant === "button") {
const currentIndex = languages.findIndex((l) => l.value === locale);
const nextIndex = (currentIndex + 1) % languages.length;
const nextLang = languages[nextIndex];
return (
<Button
variant="ghost"
size="sm"
onClick={() => setLocale(nextLang.value)}
className="gap-1.5 text-muted-foreground hover:text-foreground"
>
<Globe className="h-4 w-4" />
<span className="text-sm">{nextLang.flag}</span>
</Button>
);
}
return (
<Select value={locale} onValueChange={(v) => setLocale(v as Locale)}>
<SelectTrigger className="w-[130px] h-9 bg-transparent border-border-dark hover:bg-surface-dark">
<SelectValue>
<span className="flex items-center gap-2">
<Globe className="h-4 w-4" />
{languages.find((l) => l.value === locale)?.flag}{" "}
{languages.find((l) => l.value === locale)?.label}
</span>
</SelectValue>
</SelectTrigger>
<SelectContent className="bg-surface-dark border-border-dark">
{languages.map((lang) => (
<SelectItem
key={lang.value}
value={lang.value}
className="hover:bg-primary/10 focus:bg-primary/10"
>
<span className="flex items-center gap-2">
<span>{lang.flag}</span>
<span>{lang.label}</span>
</span>
</SelectItem>
))}
</SelectContent>
</Select>
);
}