Translate admin panel to all 6 languages

This commit is contained in:
openhands committed 2026-07-04 21:21:15 +02:00
1 parent f381aa987f
commit befa4ec282
63 files changed
+9353 -1443

No files matched your search

+19 -17
View File
@@ -4,6 +4,7 @@ import { updateUser } from "@/actions/admin-user-edit";
import { requireStaff } from "@/lib/admin/guard";
import { User } from "lucide-react";
import { prisma } from "@/lib/prisma";
import { getTranslations } from "next-intl/server";
export const dynamic = "force-dynamic";
@@ -20,6 +21,7 @@ export default async function AdminUserEdit({
await requireStaff();
const { id } = await params;
const t = await getTranslations("pages.admin.users.editForm");
const userId = Number(id);
if (!Number.isInteger(userId) || userId <= 0) notFound();
@@ -66,10 +68,10 @@ export default async function AdminUserEdit({
return (
<main>
<p className="text-sm text-gray-500 dark:text-gray-400">
<Link href="/admin/users">← Users</Link>
<Link href="/admin/users">← {t("title")}</Link>
</p>
<h1>Edit user</h1>
<p className="text-xs text-gray-500 dark:text-gray-400">Could not load this user right now. Try again shortly.</p>
<h1>{t("title")}</h1>
<p className="text-xs text-gray-500 dark:text-gray-400">{t("loadError")}</p>
</main>
);
}
@@ -86,8 +88,8 @@ export default async function AdminUserEdit({
<User size={20} className="text-[var(--color-primary)]" />
</div>
<div>
<h1 className="m-0 text-xl font-extrabold text-[var(--color-text)]">Edit {user.username}</h1>
<p className="m-0 text-xs text-[var(--color-text-muted)] mt-0.5">ID {user.id}</p>
<h1 className="m-0 text-xl font-extrabold text-[var(--color-text)]">{t("title", { username: user.username })}</h1>
<p className="m-0 text-xs text-[var(--color-text-muted)] mt-0.5">{t("idLabel", { id: user.id })}</p>
</div>
</div>
@@ -96,56 +98,56 @@ export default async function AdminUserEdit({
<div className="grid cols-2">
<label>
Email
{t("email")}
<input name="mail" type="email" defaultValue={user.mail ?? ""} maxLength={500} />
</label>
<label>
Rank
{t("rank")}
<input name="rank" type="number" min={1} defaultValue={user.rank} />
</label>
<label>
Motto
{t("motto")}
<input name="motto" defaultValue={user.motto} maxLength={127} />
</label>
<label>
Look
{t("look")}
<input name="look" defaultValue={user.look} maxLength={256} />
</label>
<label>
Credits
{t("credits")}
<input name="credits" type="number" min={0} defaultValue={user.credits} />
</label>
<label>
Pixels
{t("pixels")}
<input name="pixels" type="number" min={0} defaultValue={user.pixels} />
</label>
<label>
Points
{t("points")}
<input name="points" type="number" min={0} defaultValue={user.points} />
</label>
<label>
Duckets
{t("duckets")}
<input name="duckets" type="number" min={0} defaultValue={duckets} />
</label>
<label>
Diamonds
{t("diamonds")}
<input name="diamonds" type="number" min={0} defaultValue={diamonds} />
</label>
</div>
<p className="text-xs text-gray-500 dark:text-gray-400">Currency fields set the exact balance, not a delta. Passwords are not editable here.</p>
<p className="text-xs text-gray-500 dark:text-gray-400">{t("hint")}</p>
<div className="flex gap-2 mt-2">
<button type="submit" className="btn btn-primary">Save changes</button>
<Link href={`/admin/users/${user.id}`} className="btn">Cancel</Link>
<button type="submit" className="btn btn-primary">{t("save")}</button>
<Link href={`/admin/users/${user.id}`} className="btn">{t("cancel")}</Link>
</div>
</form>
</main>