feat(hk): expand search and add operational user overview
This commit is contained in:
1 parent
27447ce029
commit
89526af344
44 files changed
+3578
-254
No files matched your search
@@ -81,3 +81,23 @@ Validation: 1,506 tests passed (six skipped), type checking, lint, translation
|
|||||||
contracts and a production build with fixture configuration. A browser fixture
|
contracts and a production build with fixture configuration. A browser fixture
|
||||||
verified the real dialog at 1280 and 390 pixels; server actions were simulated.
|
verified the real dialog at 1280 and 390 pixels; server actions were simulated.
|
||||||
The new database migration and package publication have not run in production.
|
The new database migration and package publication have not run in production.
|
||||||
|
|
||||||
|
## Housekeeping search and user overview
|
||||||
|
|
||||||
|
The existing global search now includes furniture, normal/Club catalog categories
|
||||||
|
and both ticket sources. Results respect module permissions, accept single-digit
|
||||||
|
IDs, and remain usable when one source fails. Keyboard navigation and cancellation
|
||||||
|
prevent stale search responses from replacing newer results.
|
||||||
|
|
||||||
|
User details open on an operational overview with up to five records from each
|
||||||
|
authorized source: bans, active mute, support tickets, help tickets, reports,
|
||||||
|
payments, catalog purchases and audit activity. Failed sources are distinguished
|
||||||
|
from empty results. User detail and edit pages also apply log permissions before
|
||||||
|
loading activity and exposing counters.
|
||||||
|
|
||||||
|
Italian and Dutch navigation, user management, news and support labels were
|
||||||
|
reviewed. The new search and overview copy has English, Italian and Dutch text;
|
||||||
|
other locales receive English fallback strings. This is a focused editorial pass,
|
||||||
|
not a full translation of every CMS page. No database migration or dependency
|
||||||
|
change is required. Browser checks use real components with simulated data at
|
||||||
|
1280 and 390 pixels; production database behavior still needs deployment validation.
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -6,6 +6,7 @@ import {
|
|||||||
MonitorSmartphone,
|
MonitorSmartphone,
|
||||||
Shield,
|
Shield,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
import { useTranslations } from "next-intl";
|
||||||
import Link from "@/components/link";
|
import Link from "@/components/link";
|
||||||
import { Badge } from "@/components/ui/badge";
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||||
@@ -25,40 +26,41 @@ interface UserAccountInfoProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function UserAccountInfo({ user }: UserAccountInfoProps) {
|
export function UserAccountInfo({ user }: UserAccountInfoProps) {
|
||||||
|
const t = useTranslations("pages.admin.users.presentation");
|
||||||
return (
|
return (
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle>Account Details</CardTitle>
|
<CardTitle>{t("accountDetails")}</CardTitle>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<div className="grid gap-4 sm:grid-cols-2">
|
<div className="grid gap-4 sm:grid-cols-2">
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="flex items-center gap-3 text-sm">
|
<div className="flex items-center gap-3 text-sm">
|
||||||
<Calendar className="h-4 w-4 text-muted-foreground shrink-0" />
|
<Calendar className="h-4 w-4 text-muted-foreground shrink-0" />
|
||||||
<span className="text-muted-foreground">Registered</span>
|
<span className="text-muted-foreground">{t("registered")}</span>
|
||||||
<span className="ml-auto font-medium">
|
<span className="ml-auto font-medium">
|
||||||
{formatDate(new Date(user.accountCreated * 1000), "date")}
|
{formatDate(new Date(user.accountCreated * 1000), "date")}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3 text-sm">
|
<div className="flex items-center gap-3 text-sm">
|
||||||
<Clock className="h-4 w-4 text-muted-foreground shrink-0" />
|
<Clock className="h-4 w-4 text-muted-foreground shrink-0" />
|
||||||
<span className="text-muted-foreground">Last Login</span>
|
<span className="text-muted-foreground">{t("lastLogin")}</span>
|
||||||
<span className="ml-auto font-medium">
|
<span className="ml-auto font-medium">
|
||||||
{user.lastLogin
|
{user.lastLogin
|
||||||
? formatDate(new Date(user.lastLogin * 1000))
|
? formatDate(new Date(user.lastLogin * 1000))
|
||||||
: "Never"}
|
: t("never")}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3 text-sm">
|
<div className="flex items-center gap-3 text-sm">
|
||||||
<Globe className="h-4 w-4 text-muted-foreground shrink-0" />
|
<Globe className="h-4 w-4 text-muted-foreground shrink-0" />
|
||||||
<span className="text-muted-foreground">IP Register</span>
|
<span className="text-muted-foreground">{t("ipRegister")}</span>
|
||||||
<span className="ml-auto flex items-center gap-1.5">
|
<span className="ml-auto flex items-center gap-1.5">
|
||||||
<code className="text-xs font-mono bg-muted px-2 py-0.5 rounded">
|
<code className="text-xs font-mono bg-muted px-2 py-0.5 rounded">
|
||||||
{user.ipRegister}
|
{user.ipRegister}
|
||||||
</code>
|
</code>
|
||||||
<Link
|
<Link
|
||||||
href={`/admin/users?search=${user.ipRegister}`}
|
href={`/admin/users?search=${user.ipRegister}`}
|
||||||
title="Find other users with this IP"
|
title={t("findIp")}
|
||||||
>
|
>
|
||||||
<ExternalLink className="h-3 w-3 text-primary" />
|
<ExternalLink className="h-3 w-3 text-primary" />
|
||||||
</Link>
|
</Link>
|
||||||
@@ -66,14 +68,14 @@ export function UserAccountInfo({ user }: UserAccountInfoProps) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3 text-sm">
|
<div className="flex items-center gap-3 text-sm">
|
||||||
<Globe className="h-4 w-4 text-muted-foreground shrink-0" />
|
<Globe className="h-4 w-4 text-muted-foreground shrink-0" />
|
||||||
<span className="text-muted-foreground">IP Current</span>
|
<span className="text-muted-foreground">{t("ipCurrent")}</span>
|
||||||
<span className="ml-auto flex items-center gap-1.5">
|
<span className="ml-auto flex items-center gap-1.5">
|
||||||
<code className="text-xs font-mono bg-muted px-2 py-0.5 rounded">
|
<code className="text-xs font-mono bg-muted px-2 py-0.5 rounded">
|
||||||
{user.ipCurrent}
|
{user.ipCurrent}
|
||||||
</code>
|
</code>
|
||||||
<Link
|
<Link
|
||||||
href={`/admin/users?search=${user.ipCurrent}`}
|
href={`/admin/users?search=${user.ipCurrent}`}
|
||||||
title="Find other users with this IP"
|
title={t("findIp")}
|
||||||
>
|
>
|
||||||
<ExternalLink className="h-3 w-3 text-primary" />
|
<ExternalLink className="h-3 w-3 text-primary" />
|
||||||
</Link>
|
</Link>
|
||||||
@@ -88,22 +90,22 @@ export function UserAccountInfo({ user }: UserAccountInfoProps) {
|
|||||||
variant={user.twoFactorConfirmed ? "default" : "outline"}
|
variant={user.twoFactorConfirmed ? "default" : "outline"}
|
||||||
className="ml-auto"
|
className="ml-auto"
|
||||||
>
|
>
|
||||||
{user.twoFactorConfirmed ? "Enabled" : "Disabled"}
|
{user.twoFactorConfirmed ? t("enabled") : t("disabled")}
|
||||||
</Badge>
|
</Badge>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3 text-sm">
|
<div className="flex items-center gap-3 text-sm">
|
||||||
<MonitorSmartphone className="h-4 w-4 text-muted-foreground shrink-0" />
|
<MonitorSmartphone className="h-4 w-4 text-muted-foreground shrink-0" />
|
||||||
<span className="text-muted-foreground">Machine ID</span>
|
<span className="text-muted-foreground">{t("machineId")}</span>
|
||||||
<code className="ml-auto text-xs font-mono bg-muted px-2 py-0.5 rounded truncate max-w-[180px]">
|
<code className="ml-auto text-xs font-mono bg-muted px-2 py-0.5 rounded truncate max-w-[180px]">
|
||||||
{user.machine_id || "N/A"}
|
{user.machine_id || t("unavailable")}
|
||||||
</code>
|
</code>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3 text-sm">
|
<div className="flex items-center gap-3 text-sm">
|
||||||
<span className="text-muted-foreground">Email</span>
|
<span className="text-muted-foreground">{t("email")}</span>
|
||||||
<span className="ml-auto font-medium">{user.mail}</span>
|
<span className="ml-auto font-medium">{user.mail}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3 text-sm">
|
<div className="flex items-center gap-3 text-sm">
|
||||||
<span className="text-muted-foreground">Gender</span>
|
<span className="text-muted-foreground">{t("gender")}</span>
|
||||||
<Badge variant="outline" className="ml-auto">
|
<Badge variant="outline" className="ml-auto">
|
||||||
{user.gender}
|
{user.gender}
|
||||||
</Badge>
|
</Badge>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
import { useTranslations } from "next-intl";
|
||||||
|
|
||||||
interface Badge {
|
interface Badge {
|
||||||
id: number;
|
id: number;
|
||||||
@@ -6,8 +7,9 @@ interface Badge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function UserBadgesReadonly({ badges }: { badges: Badge[] }) {
|
export function UserBadgesReadonly({ badges }: { badges: Badge[] }) {
|
||||||
|
const t = useTranslations("pages.admin.users.presentation");
|
||||||
if (badges.length === 0) {
|
if (badges.length === 0) {
|
||||||
return <p className="text-sm text-muted-foreground">No badges</p>;
|
return <p className="text-sm text-muted-foreground">{t("noBadges")}</p>;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,95 @@
|
|||||||
|
import { MySqlDialect } from "drizzle-orm/mysql-core";
|
||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
import { PERMS } from "@/lib/permission-slugs";
|
||||||
|
import type { PermissionSet } from "@/lib/permissions";
|
||||||
|
|
||||||
|
const state = vi.hoisted(() => ({
|
||||||
|
allowed: new Set<string>(),
|
||||||
|
execute: vi.fn(),
|
||||||
|
}));
|
||||||
|
vi.mock("@/lib/db", () => ({ db: { execute: state.execute } }));
|
||||||
|
vi.mock("@/lib/permissions", async () => ({
|
||||||
|
...(await import("@/lib/permission-slugs")),
|
||||||
|
canAccess: (_: unknown, permission: string) => state.allowed.has(permission),
|
||||||
|
}));
|
||||||
|
|
||||||
|
import { loadUserOverview } from "./load-user-overview";
|
||||||
|
|
||||||
|
const permissions = {} as PermissionSet;
|
||||||
|
const dialect = new MySqlDialect();
|
||||||
|
beforeEach(() => {
|
||||||
|
state.allowed.clear();
|
||||||
|
state.execute
|
||||||
|
.mockReset()
|
||||||
|
.mockResolvedValue([[{ id: 12, title: "Existing record" }], []]);
|
||||||
|
});
|
||||||
|
describe("user operational overview", () => {
|
||||||
|
it("does not query or expose any restricted source", async () => {
|
||||||
|
expect(await loadUserOverview(42, permissions, 4)).toEqual([]);
|
||||||
|
expect(state.execute).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
it.each([
|
||||||
|
[PERMS.BANS_VIEW, ["sanctions"]],
|
||||||
|
[PERMS.TICKETS_VIEW, ["tickets", "help"]],
|
||||||
|
[PERMS.MODERATION_VIEW, ["mute", "reports"]],
|
||||||
|
[PERMS.SHOP_VIEW, ["transactions"]],
|
||||||
|
[PERMS.LOGS_VIEW, ["purchases", "activity"]],
|
||||||
|
])("queries only sources allowed by %s", async (permission, keys) => {
|
||||||
|
state.allowed.add(permission);
|
||||||
|
const result = await loadUserOverview(42, permissions, 4);
|
||||||
|
expect(result.map((section) => section.key)).toEqual(keys);
|
||||||
|
expect(state.execute).toHaveBeenCalledTimes(keys.length);
|
||||||
|
for (const [query] of state.execute.mock.calls) {
|
||||||
|
const compiled = dialect.sqlToQuery(query);
|
||||||
|
expect(compiled.sql).toMatch(/LIMIT 5$/);
|
||||||
|
expect(compiled.params).toContain(42);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
it("keeps accessible sources available when another query fails", async () => {
|
||||||
|
state.allowed.add(PERMS.TICKETS_VIEW);
|
||||||
|
state.execute.mockRejectedValueOnce(new Error("database unavailable"));
|
||||||
|
const result = await loadUserOverview(42, permissions, 4);
|
||||||
|
expect(result[0]).toMatchObject({
|
||||||
|
key: "tickets",
|
||||||
|
state: "error",
|
||||||
|
rows: [],
|
||||||
|
});
|
||||||
|
expect(result[1]).toMatchObject({
|
||||||
|
key: "help",
|
||||||
|
state: "ready",
|
||||||
|
rows: [{ href: "/admin/help-tickets/12" }],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("distinguishes an empty source from a failed source", async () => {
|
||||||
|
state.allowed.add(PERMS.SHOP_VIEW);
|
||||||
|
state.execute.mockResolvedValueOnce([[], []]);
|
||||||
|
expect(await loadUserOverview(42, permissions, 4)).toEqual([
|
||||||
|
{
|
||||||
|
key: "transactions",
|
||||||
|
state: "ready",
|
||||||
|
rows: [],
|
||||||
|
href: "/admin/transactions",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("selects and preserves recorded purchase quantities and currency costs", async () => {
|
||||||
|
state.allowed.add(PERMS.LOGS_VIEW);
|
||||||
|
const purchase = {
|
||||||
|
id: 5,
|
||||||
|
title: "Chair",
|
||||||
|
amount: 2,
|
||||||
|
credits: 10,
|
||||||
|
points: 3,
|
||||||
|
pointsType: 5,
|
||||||
|
};
|
||||||
|
state.execute.mockResolvedValueOnce([[purchase], []]);
|
||||||
|
const result = await loadUserOverview(42, permissions, 4);
|
||||||
|
const query = dialect.sqlToQuery(state.execute.mock.calls[0][0]).sql;
|
||||||
|
expect(query).toContain(
|
||||||
|
"amount, cost_credits AS credits, cost_points AS points, points_type AS pointsType",
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
result.find((section) => section.key === "purchases")?.rows[0],
|
||||||
|
).toMatchObject(purchase);
|
||||||
|
});
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,87 @@
|
|||||||
|
import { MySqlDialect } from "drizzle-orm/mysql-core";
|
||||||
|
import { beforeEach, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
const state = vi.hoisted(() => ({
|
||||||
|
sql: [] as string[],
|
||||||
|
tables: [] as string[],
|
||||||
|
failLogs: false,
|
||||||
|
}));
|
||||||
|
vi.mock("next/navigation", () => ({
|
||||||
|
notFound: () => {
|
||||||
|
throw new Error("not found");
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
vi.mock("@/lib/db", () => {
|
||||||
|
const tables = Object.fromEntries(
|
||||||
|
["User", "Rooms", "RoomTradeLog", "UsersBadges", "UsersCurrency"].map(
|
||||||
|
(name) => [name, { name }],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
...tables,
|
||||||
|
db: {
|
||||||
|
select() {
|
||||||
|
let name = "";
|
||||||
|
const rows = () =>
|
||||||
|
name === "User"
|
||||||
|
? [{ id: 42, username: "User", rank: 2, online: "0" }]
|
||||||
|
: [];
|
||||||
|
const query = {
|
||||||
|
from(table: { name: string }) {
|
||||||
|
name = table.name;
|
||||||
|
state.tables.push(name);
|
||||||
|
return query;
|
||||||
|
},
|
||||||
|
where() {
|
||||||
|
return query;
|
||||||
|
},
|
||||||
|
orderBy() {
|
||||||
|
return query;
|
||||||
|
},
|
||||||
|
limit() {
|
||||||
|
return query;
|
||||||
|
},
|
||||||
|
// biome-ignore lint/suspicious/noThenProperty: Drizzle queries are intentionally awaitable.
|
||||||
|
then(resolve: (value: unknown[]) => unknown) {
|
||||||
|
return Promise.resolve(rows()).then(resolve);
|
||||||
|
},
|
||||||
|
catch() {
|
||||||
|
return Promise.resolve(rows());
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return query;
|
||||||
|
},
|
||||||
|
async execute(query: Parameters<MySqlDialect["sqlToQuery"]>[0]) {
|
||||||
|
const compiled = new MySqlDialect().sqlToQuery(query).sql;
|
||||||
|
state.sql.push(compiled);
|
||||||
|
if (state.failLogs && compiled.includes("chatlogs_room"))
|
||||||
|
throw new Error("unavailable");
|
||||||
|
return [[], []];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
import { loadUserById } from "./load-user";
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
state.sql = [];
|
||||||
|
state.tables = [];
|
||||||
|
state.failLogs = false;
|
||||||
|
});
|
||||||
|
it("skips chat, commands, trade and ban queries when excluded by profile ACL", async () => {
|
||||||
|
const user = await loadUserById("42", { logs: false, bans: false });
|
||||||
|
expect(state.sql.join(" ")).not.toMatch(
|
||||||
|
/chatlogs_room|commandlogs|FROM bans/,
|
||||||
|
);
|
||||||
|
expect(state.tables).not.toContain("RoomTradeLog");
|
||||||
|
expect(user.chatLogs).toEqual([]);
|
||||||
|
expect(user.commandLogs).toEqual([]);
|
||||||
|
expect(user.user.bansReceived).toEqual([]);
|
||||||
|
});
|
||||||
|
it("keeps the user profile available and identifies a failed activity source", async () => {
|
||||||
|
state.failLogs = true;
|
||||||
|
const user = await loadUserById("42", { logs: true, bans: false });
|
||||||
|
expect(user.user.id).toBe(42);
|
||||||
|
expect(user.activityUnavailable).toBe(true);
|
||||||
|
});
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -1,5 +1,6 @@
|
|||||||
import { sql } from "drizzle-orm";
|
import { sql } from "drizzle-orm";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
|
import { getTranslations } from "next-intl/server";
|
||||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
||||||
import { db } from "@/lib/db";
|
import { db } from "@/lib/db";
|
||||||
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
|
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
|
||||||
@@ -25,7 +26,18 @@ export default async function UserEditPage({
|
|||||||
redirect("/admin");
|
redirect("/admin");
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await loadUserById(id);
|
const overviewT = await getTranslations("pages.admin.users.overview");
|
||||||
|
const canViewLogs = canAccess(
|
||||||
|
permissions,
|
||||||
|
PERMS.LOGS_VIEW,
|
||||||
|
session.user.rank,
|
||||||
|
);
|
||||||
|
const canViewBans = canAccess(
|
||||||
|
permissions,
|
||||||
|
PERMS.BANS_VIEW,
|
||||||
|
session.user.rank,
|
||||||
|
);
|
||||||
|
const data = await loadUserById(id, { logs: canViewLogs, bans: canViewBans });
|
||||||
const watched = await getWatchedUserIds(session.user.id);
|
const watched = await getWatchedUserIds(session.user.id);
|
||||||
|
|
||||||
// Fetch rank list from permissions table for the rank dropdown
|
// Fetch rank list from permissions table for the rank dropdown
|
||||||
@@ -45,6 +57,7 @@ export default async function UserEditPage({
|
|||||||
duckets={data.duckets}
|
duckets={data.duckets}
|
||||||
roomCount={data.roomCount}
|
roomCount={data.roomCount}
|
||||||
chatCount={data.chatCount}
|
chatCount={data.chatCount}
|
||||||
|
canViewLogs={canViewLogs && !data.activityUnavailable}
|
||||||
tradeCount={data.tradeCount}
|
tradeCount={data.tradeCount}
|
||||||
isOnline={data.isOnline}
|
isOnline={data.isOnline}
|
||||||
activeBan={!!data.activeBan}
|
activeBan={!!data.activeBan}
|
||||||
@@ -57,17 +70,21 @@ export default async function UserEditPage({
|
|||||||
<Tabs defaultValue="edit" className="space-y-4 min-w-0">
|
<Tabs defaultValue="edit" className="space-y-4 min-w-0">
|
||||||
<TabsList className="flex-wrap">
|
<TabsList className="flex-wrap">
|
||||||
<TabsTrigger value="edit">Edit Profile</TabsTrigger>
|
<TabsTrigger value="edit">Edit Profile</TabsTrigger>
|
||||||
|
{canViewBans && (
|
||||||
<TabsTrigger value="bans">
|
<TabsTrigger value="bans">
|
||||||
Bans
|
Bans
|
||||||
{data.activeBan && (
|
{data.activeBan && (
|
||||||
<span className="ml-1.5 flex h-2 w-2 rounded-full bg-destructive" />
|
<span className="ml-1.5 flex h-2 w-2 rounded-full bg-destructive" />
|
||||||
)}
|
)}
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
|
)}
|
||||||
<TabsTrigger value="badges">
|
<TabsTrigger value="badges">
|
||||||
Badges ({data.user.badges.length})
|
Badges ({data.user.badges.length})
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
<TabsTrigger value="rooms">Rooms ({data.roomCount})</TabsTrigger>
|
<TabsTrigger value="rooms">Rooms ({data.roomCount})</TabsTrigger>
|
||||||
|
{canViewLogs && (
|
||||||
<TabsTrigger value="activity">Activity</TabsTrigger>
|
<TabsTrigger value="activity">Activity</TabsTrigger>
|
||||||
|
)}
|
||||||
<TabsTrigger value="info">Account Info</TabsTrigger>
|
<TabsTrigger value="info">Account Info</TabsTrigger>
|
||||||
</TabsList>
|
</TabsList>
|
||||||
|
|
||||||
@@ -88,6 +105,7 @@ export default async function UserEditPage({
|
|||||||
/>
|
/>
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
|
||||||
|
{canViewBans && (
|
||||||
<TabsContent value="bans">
|
<TabsContent value="bans">
|
||||||
<UserBanSection
|
<UserBanSection
|
||||||
userId={data.user.id}
|
userId={data.user.id}
|
||||||
@@ -102,6 +120,7 @@ export default async function UserEditPage({
|
|||||||
}))}
|
}))}
|
||||||
/>
|
/>
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
)}
|
||||||
|
|
||||||
<TabsContent value="badges">
|
<TabsContent value="badges">
|
||||||
<UserBadgesSection
|
<UserBadgesSection
|
||||||
@@ -117,12 +136,23 @@ export default async function UserEditPage({
|
|||||||
<UserRooms rooms={data.userRooms} />
|
<UserRooms rooms={data.userRooms} />
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
|
||||||
|
{canViewLogs && (
|
||||||
<TabsContent value="activity">
|
<TabsContent value="activity">
|
||||||
|
{data.activityUnavailable ? (
|
||||||
|
<p
|
||||||
|
role="status"
|
||||||
|
className="rounded-lg border bg-card p-4 text-sm text-destructive"
|
||||||
|
>
|
||||||
|
{overviewT("error")}
|
||||||
|
</p>
|
||||||
|
) : (
|
||||||
<UserActivityLog
|
<UserActivityLog
|
||||||
chatLogs={data.chatLogs}
|
chatLogs={data.chatLogs}
|
||||||
commandLogs={data.commandLogs}
|
commandLogs={data.commandLogs}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
)}
|
||||||
|
|
||||||
<TabsContent value="info">
|
<TabsContent value="info">
|
||||||
<UserAccountInfo user={data.user} />
|
<UserAccountInfo user={data.user} />
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import { getWatchedUserIds } from "@/lib/services/watch";
|
|||||||
import { UserAccountInfo } from "../../_components/user-account-info";
|
import { UserAccountInfo } from "../../_components/user-account-info";
|
||||||
import { UserBadgesReadonly } from "../../_components/user-badges-readonly";
|
import { UserBadgesReadonly } from "../../_components/user-badges-readonly";
|
||||||
import { UserHero } from "../../_components/user-hero";
|
import { UserHero } from "../../_components/user-hero";
|
||||||
import { UserSanctionTimeline } from "../../_components/user-sanction-timeline";
|
import { UserOperationalOverview } from "../../_components/user-operational-overview";
|
||||||
import { loadUserById } from "../../_lib/load-user";
|
import { loadUserById } from "../../_lib/load-user";
|
||||||
import { loadUserSanctions } from "../../_lib/load-user-sanctions";
|
import { loadUserOverview } from "../../_lib/load-user-overview";
|
||||||
import { UserActivityLog } from "../../[id]/user-activity-log";
|
import { UserActivityLog } from "../../[id]/user-activity-log";
|
||||||
import { UserQuickActions } from "../../[id]/user-quick-actions";
|
import { UserQuickActions } from "../../[id]/user-quick-actions";
|
||||||
import { UserRooms } from "../../[id]/user-rooms";
|
import { UserRooms } from "../../[id]/user-rooms";
|
||||||
@@ -25,10 +25,19 @@ export default async function UserShowPage({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const t = await getTranslations("pages.admin.users.detail");
|
const t = await getTranslations("pages.admin.users.detail");
|
||||||
|
const overviewT = await getTranslations("pages.admin.users.overview");
|
||||||
const canEdit = canAccess(permissions, PERMS.USERS_EDIT, session.user.rank);
|
const canEdit = canAccess(permissions, PERMS.USERS_EDIT, session.user.rank);
|
||||||
const data = await loadUserById(id);
|
const canViewLogs = canAccess(
|
||||||
const [sanctions, watched] = await Promise.all([
|
permissions,
|
||||||
loadUserSanctions(data.user.id),
|
PERMS.LOGS_VIEW,
|
||||||
|
session.user.rank,
|
||||||
|
);
|
||||||
|
const data = await loadUserById(id, {
|
||||||
|
logs: canViewLogs,
|
||||||
|
bans: canAccess(permissions, PERMS.BANS_VIEW, session.user.rank),
|
||||||
|
});
|
||||||
|
const [overview, watched] = await Promise.all([
|
||||||
|
loadUserOverview(data.user.id, permissions, session.user.rank),
|
||||||
getWatchedUserIds(session.user.id),
|
getWatchedUserIds(session.user.id),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -40,6 +49,7 @@ export default async function UserShowPage({
|
|||||||
duckets={data.duckets}
|
duckets={data.duckets}
|
||||||
roomCount={data.roomCount}
|
roomCount={data.roomCount}
|
||||||
chatCount={data.chatCount}
|
chatCount={data.chatCount}
|
||||||
|
canViewLogs={canViewLogs && !data.activityUnavailable}
|
||||||
tradeCount={data.tradeCount}
|
tradeCount={data.tradeCount}
|
||||||
isOnline={data.isOnline}
|
isOnline={data.isOnline}
|
||||||
activeBan={!!data.activeBan}
|
activeBan={!!data.activeBan}
|
||||||
@@ -55,8 +65,9 @@ export default async function UserShowPage({
|
|||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Tabs defaultValue="info" className="space-y-4 min-w-0">
|
<Tabs defaultValue="overview" className="space-y-4 min-w-0">
|
||||||
<TabsList className="h-auto flex-wrap justify-start">
|
<TabsList className="h-auto flex-wrap justify-start">
|
||||||
|
<TabsTrigger value="overview">{overviewT("title")}</TabsTrigger>
|
||||||
<TabsTrigger value="info">{t("tabInfo")}</TabsTrigger>
|
<TabsTrigger value="info">{t("tabInfo")}</TabsTrigger>
|
||||||
<TabsTrigger value="badges">
|
<TabsTrigger value="badges">
|
||||||
{t("tabBadges", { count: data.user.badges.length })}
|
{t("tabBadges", { count: data.user.badges.length })}
|
||||||
@@ -64,12 +75,15 @@ export default async function UserShowPage({
|
|||||||
<TabsTrigger value="rooms">
|
<TabsTrigger value="rooms">
|
||||||
{t("tabRooms", { count: data.roomCount })}
|
{t("tabRooms", { count: data.roomCount })}
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
<TabsTrigger value="sanctions">
|
{canViewLogs && (
|
||||||
{t("tabSanctions", { count: sanctions.events.length })}
|
|
||||||
</TabsTrigger>
|
|
||||||
<TabsTrigger value="activity">{t("tabActivity")}</TabsTrigger>
|
<TabsTrigger value="activity">{t("tabActivity")}</TabsTrigger>
|
||||||
|
)}
|
||||||
</TabsList>
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsContent value="overview">
|
||||||
|
<UserOperationalOverview sections={overview} />
|
||||||
|
</TabsContent>
|
||||||
|
|
||||||
<TabsContent value="info">
|
<TabsContent value="info">
|
||||||
<UserAccountInfo user={data.user} />
|
<UserAccountInfo user={data.user} />
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
@@ -87,19 +101,23 @@ export default async function UserShowPage({
|
|||||||
<UserRooms rooms={data.userRooms} />
|
<UserRooms rooms={data.userRooms} />
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
|
||||||
<TabsContent value="sanctions">
|
{canViewLogs && (
|
||||||
<UserSanctionTimeline
|
|
||||||
events={sanctions.events}
|
|
||||||
muteUntil={sanctions.muteUntil}
|
|
||||||
/>
|
|
||||||
</TabsContent>
|
|
||||||
|
|
||||||
<TabsContent value="activity">
|
<TabsContent value="activity">
|
||||||
|
{data.activityUnavailable ? (
|
||||||
|
<p
|
||||||
|
role="status"
|
||||||
|
className="rounded-lg border bg-card p-4 text-sm text-destructive"
|
||||||
|
>
|
||||||
|
{overviewT("error")}
|
||||||
|
</p>
|
||||||
|
) : (
|
||||||
<UserActivityLog
|
<UserActivityLog
|
||||||
chatLogs={data.chatLogs}
|
chatLogs={data.chatLogs}
|
||||||
commandLogs={data.commandLogs}
|
commandLogs={data.commandLogs}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
)}
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
{canEdit && (
|
{canEdit && (
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -54,6 +54,9 @@ vi.mock("@/lib/db", () => {
|
|||||||
where() {
|
where() {
|
||||||
return query;
|
return query;
|
||||||
},
|
},
|
||||||
|
orderBy() {
|
||||||
|
return query;
|
||||||
|
},
|
||||||
async limit() {
|
async limit() {
|
||||||
state.queried.push(table);
|
state.queried.push(table);
|
||||||
return [{ id: 1, title: "Match", subtitle: "Data" }];
|
return [{ id: 1, title: "Match", subtitle: "Data" }];
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
import { AdminSearchRequest } from "./admin-search-request";
|
||||||
|
|
||||||
|
describe("admin search request ownership", () => {
|
||||||
|
it("rejects a late response after the input changes, even before the next debounce fires", async () => {
|
||||||
|
const requests = new AdminSearchRequest();
|
||||||
|
const first = requests.start();
|
||||||
|
const late = Promise.resolve().then(() => requests.accepts(first));
|
||||||
|
requests.cancel();
|
||||||
|
expect(await late).toBe(false);
|
||||||
|
expect(first.signal.aborted).toBe(true);
|
||||||
|
});
|
||||||
|
it("accepts only the newest request and rejects completion after closing", () => {
|
||||||
|
const requests = new AdminSearchRequest();
|
||||||
|
const first = requests.start();
|
||||||
|
const second = requests.start();
|
||||||
|
expect(requests.accepts(first)).toBe(false);
|
||||||
|
expect(requests.accepts(second)).toBe(true);
|
||||||
|
requests.cancel();
|
||||||
|
expect(requests.accepts(second)).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/** Owns the single request allowed to update a search dialog. */
|
||||||
|
export class AdminSearchRequest {
|
||||||
|
private current: AbortController | null = null;
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
this.current?.abort();
|
||||||
|
this.current = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
this.cancel();
|
||||||
|
const controller = new AbortController();
|
||||||
|
this.current = controller;
|
||||||
|
return controller;
|
||||||
|
}
|
||||||
|
|
||||||
|
accepts(controller: AbortController) {
|
||||||
|
return this.current === controller && !controller.signal.aborted;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,16 +36,18 @@ describe("staff smoke contract", () => {
|
|||||||
expect(detail).toContain("canLiftBan");
|
expect(detail).toContain("canLiftBan");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("exposes sanction timeline on user show", () => {
|
it("exposes operational overview on user show", () => {
|
||||||
expect(
|
expect(
|
||||||
existsSync("src/app/admin/users/_components/user-sanction-timeline.tsx"),
|
existsSync(
|
||||||
|
"src/app/admin/users/_components/user-operational-overview.tsx",
|
||||||
|
),
|
||||||
).toBe(true);
|
).toBe(true);
|
||||||
expect(existsSync("src/app/admin/users/_lib/load-user-sanctions.ts")).toBe(
|
expect(existsSync("src/app/admin/users/_lib/load-user-overview.ts")).toBe(
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
expect(
|
expect(
|
||||||
readFileSync("src/app/admin/users/show/[id]/page.tsx", "utf8"),
|
readFileSync("src/app/admin/users/show/[id]/page.tsx", "utf8"),
|
||||||
).toContain("UserSanctionTimeline");
|
).toContain("UserOperationalOverview");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("applies CMS SQL from drizzle/migrations (not Prisma)", () => {
|
it("applies CMS SQL from drizzle/migrations (not Prisma)", () => {
|
||||||
|
|||||||
@@ -281,6 +281,96 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"myDashboard": {
|
"myDashboard": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Запазете промените",
|
"save": "Запазете промените",
|
||||||
"saving": "Запазва се...",
|
"saving": "Запазва се...",
|
||||||
"cancel": "Отказ"
|
"cancel": "Отказ"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Uložte změny",
|
"save": "Uložte změny",
|
||||||
"saving": "Ukládání…",
|
"saving": "Ukládání…",
|
||||||
"cancel": "Zrušit"
|
"cancel": "Zrušit"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Save changes",
|
"save": "Save changes",
|
||||||
"saving": "Gemmer...",
|
"saving": "Gemmer...",
|
||||||
"cancel": "Annuller"
|
"cancel": "Annuller"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1203,6 +1203,84 @@
|
|||||||
"save": "Änderungen speichern",
|
"save": "Änderungen speichern",
|
||||||
"saving": "Wird gespeichert…",
|
"saving": "Wird gespeichert…",
|
||||||
"cancel": "Abbrechen"
|
"cancel": "Abbrechen"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3208,6 +3286,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"radioRequests": {
|
"radioRequests": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Αποθήκευση αλλαγών",
|
"save": "Αποθήκευση αλλαγών",
|
||||||
"saving": "Αποθήκευση…",
|
"saving": "Αποθήκευση…",
|
||||||
"cancel": "Ακύρωση"
|
"cancel": "Ακύρωση"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
+87
-2
File diff suppressed because it is too large.
Load diff
@@ -1203,6 +1203,84 @@
|
|||||||
"save": "Guardar cambios",
|
"save": "Guardar cambios",
|
||||||
"saving": "Guardando…",
|
"saving": "Guardando…",
|
||||||
"cancel": "Cancelar"
|
"cancel": "Cancelar"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3208,6 +3286,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"radioRequests": {
|
"radioRequests": {
|
||||||
|
|||||||
@@ -281,6 +281,96 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"myDashboard": {
|
"myDashboard": {
|
||||||
|
|||||||
@@ -1203,6 +1203,84 @@
|
|||||||
"save": "Enregistrer les modifications",
|
"save": "Enregistrer les modifications",
|
||||||
"saving": "Enregistrement…",
|
"saving": "Enregistrement…",
|
||||||
"cancel": "Annuler"
|
"cancel": "Annuler"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3208,6 +3286,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"radioRequests": {
|
"radioRequests": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Spremite promjene",
|
"save": "Spremite promjene",
|
||||||
"saving": "Spremanje...",
|
"saving": "Spremanje...",
|
||||||
"cancel": "Odustani"
|
"cancel": "Odustani"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Módosítások mentése",
|
"save": "Módosítások mentése",
|
||||||
"saving": "Mentés…",
|
"saving": "Mentés…",
|
||||||
"cancel": "Mégse"
|
"cancel": "Mégse"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
+129
-44
File diff suppressed because it is too large.
Load diff
@@ -281,6 +281,96 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"myDashboard": {
|
"myDashboard": {
|
||||||
|
|||||||
+185
-60
File diff suppressed because it is too large.
Load diff
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Lagre endringer",
|
"save": "Lagre endringer",
|
||||||
"saving": "Lagrer …",
|
"saving": "Lagrer …",
|
||||||
"cancel": "Avbryt"
|
"cancel": "Avbryt"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1233,6 +1233,84 @@
|
|||||||
"save": "Zapisz zmiany",
|
"save": "Zapisz zmiany",
|
||||||
"saving": "Zapisuję…",
|
"saving": "Zapisuję…",
|
||||||
"cancel": "Anuluj"
|
"cancel": "Anuluj"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3238,6 +3316,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1233,6 +1233,84 @@
|
|||||||
"save": "Salvar alterações",
|
"save": "Salvar alterações",
|
||||||
"saving": "Salvando…",
|
"saving": "Salvando…",
|
||||||
"cancel": "Cancelar"
|
"cancel": "Cancelar"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3238,6 +3316,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Salvați modificările",
|
"save": "Salvați modificările",
|
||||||
"saving": "Se salvează…",
|
"saving": "Se salvează…",
|
||||||
"cancel": "Anulează"
|
"cancel": "Anulează"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1231,6 +1231,84 @@
|
|||||||
"save": "Save changes",
|
"save": "Save changes",
|
||||||
"saving": "Saving…",
|
"saving": "Saving…",
|
||||||
"cancel": "Cancel"
|
"cancel": "Cancel"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3236,6 +3314,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Uložiť zmeny",
|
"save": "Uložiť zmeny",
|
||||||
"saving": "Ukladá sa…",
|
"saving": "Ukladá sa…",
|
||||||
"cancel": "Zrušiť"
|
"cancel": "Zrušiť"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Сачувај промене",
|
"save": "Сачувај промене",
|
||||||
"saving": "Чување…",
|
"saving": "Чување…",
|
||||||
"cancel": "Откажи"
|
"cancel": "Откажи"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Spara ändringar",
|
"save": "Spara ändringar",
|
||||||
"saving": "Sparar...",
|
"saving": "Sparar...",
|
||||||
"cancel": "Avbryt"
|
"cancel": "Avbryt"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1233,6 +1233,84 @@
|
|||||||
"save": "Değişiklikleri kaydet",
|
"save": "Değişiklikleri kaydet",
|
||||||
"saving": "Kaydediliyor…",
|
"saving": "Kaydediliyor…",
|
||||||
"cancel": "İptal"
|
"cancel": "İptal"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3238,6 +3316,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
@@ -1232,6 +1232,84 @@
|
|||||||
"save": "Зберегти зміни",
|
"save": "Зберегти зміни",
|
||||||
"saving": "Збереження…",
|
"saving": "Збереження…",
|
||||||
"cancel": "Скасувати"
|
"cancel": "Скасувати"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"users": "Users",
|
||||||
|
"edit": "Edit",
|
||||||
|
"view": "View",
|
||||||
|
"rank": "Rank {rank}",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"banned": "Banned",
|
||||||
|
"credits": "credits",
|
||||||
|
"diamonds": "diamonds",
|
||||||
|
"duckets": "duckets",
|
||||||
|
"pixels": "pixels",
|
||||||
|
"rooms": "Rooms",
|
||||||
|
"messages": "Messages",
|
||||||
|
"trades": "Trades",
|
||||||
|
"accountDetails": "Account details",
|
||||||
|
"registered": "Registered",
|
||||||
|
"lastLogin": "Last login",
|
||||||
|
"ipRegister": "Registration IP",
|
||||||
|
"ipCurrent": "Current IP",
|
||||||
|
"machineId": "Device ID",
|
||||||
|
"email": "Email",
|
||||||
|
"gender": "Gender",
|
||||||
|
"never": "Never",
|
||||||
|
"findIp": "Find users with this IP",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"unavailable": "Not available",
|
||||||
|
"noBadges": "No badges assigned"
|
||||||
|
},
|
||||||
|
"create": {
|
||||||
|
"newUser": "New user",
|
||||||
|
"title": "Create user",
|
||||||
|
"description": "Creates the account immediately with a default avatar and 5,000 credits, pixels, duckets and diamonds.",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"rank": "Rank",
|
||||||
|
"rankOption": "Rank {rank}",
|
||||||
|
"motto": "Motto (optional)",
|
||||||
|
"usernamePlaceholder": "NewHabbo",
|
||||||
|
"passwordPlaceholder": "At least 6 characters",
|
||||||
|
"mottoPlaceholder": "I'm new here!",
|
||||||
|
"generate": "Generate",
|
||||||
|
"passwordGenerated": "Password generated in the password field.",
|
||||||
|
"required": "Username, email and password are required.",
|
||||||
|
"invalidUsername": "Use 3–20 characters: letters, numbers, _ or -.",
|
||||||
|
"passwordLength": "The password must contain at least 6 characters.",
|
||||||
|
"created": "User {username} created."
|
||||||
|
},
|
||||||
|
"overview": {
|
||||||
|
"title": "Overview",
|
||||||
|
"hint": "Up to 5 recent records per source. Only sections you can access are shown.",
|
||||||
|
"restricted": "You do not have permission to view operational records.",
|
||||||
|
"sanctions": "Recent bans",
|
||||||
|
"mute": "Active mute",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"help": "Help center requests",
|
||||||
|
"reports": "In-game reports",
|
||||||
|
"transactions": "Payments",
|
||||||
|
"purchases": "Catalog purchases",
|
||||||
|
"activity": "Recorded staff actions",
|
||||||
|
"openModule": "Open management",
|
||||||
|
"purchaseHint": "Recorded quantities and currency costs.",
|
||||||
|
"purchaseDetail": "Quantity: {amount} · Credits: {credits} · Points: {points} (type {type})",
|
||||||
|
"activityHint": "Staff audit entries targeting this account. This is not a complete history of player activity.",
|
||||||
|
"muteUntil": "Muted until {date}",
|
||||||
|
"error": "This source could not be loaded. Refresh the page to try again.",
|
||||||
|
"empty": "No records found.",
|
||||||
|
"status": {
|
||||||
|
"active": "Active",
|
||||||
|
"expired": "Expired",
|
||||||
|
"open": "Open",
|
||||||
|
"closed": "Closed",
|
||||||
|
"reported": "Reported user",
|
||||||
|
"reporter": "Reporter"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bans": {
|
"bans": {
|
||||||
@@ -3237,6 +3315,16 @@
|
|||||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||||
"clubOffer": "Club offer"
|
"clubOffer": "Club offer"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"furniture": "Furniture",
|
||||||
|
"catalog": "Catalog categories",
|
||||||
|
"tickets": "Support tickets",
|
||||||
|
"loading": "Searching…",
|
||||||
|
"hint": "Enter a numeric ID or at least 2 characters, or choose a page.",
|
||||||
|
"retry": "Retry",
|
||||||
|
"description": "Search pages, users, furniture, catalog categories, articles and support tickets.",
|
||||||
|
"partialError": "Some results could not be loaded. Try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
|||||||
Reference in new issue
Block a user