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
|
||||
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.
|
||||
|
||||
## 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,
|
||||
Shield,
|
||||
} from "lucide-react";
|
||||
import { useTranslations } from "next-intl";
|
||||
import Link from "@/components/link";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
@@ -25,40 +26,41 @@ interface UserAccountInfoProps {
|
||||
}
|
||||
|
||||
export function UserAccountInfo({ user }: UserAccountInfoProps) {
|
||||
const t = useTranslations("pages.admin.users.presentation");
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>Account Details</CardTitle>
|
||||
<CardTitle>{t("accountDetails")}</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<div className="grid gap-4 sm:grid-cols-2">
|
||||
<div className="space-y-3">
|
||||
<div className="flex items-center gap-3 text-sm">
|
||||
<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">
|
||||
{formatDate(new Date(user.accountCreated * 1000), "date")}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-sm">
|
||||
<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">
|
||||
{user.lastLogin
|
||||
? formatDate(new Date(user.lastLogin * 1000))
|
||||
: "Never"}
|
||||
: t("never")}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-sm">
|
||||
<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">
|
||||
<code className="text-xs font-mono bg-muted px-2 py-0.5 rounded">
|
||||
{user.ipRegister}
|
||||
</code>
|
||||
<Link
|
||||
href={`/admin/users?search=${user.ipRegister}`}
|
||||
title="Find other users with this IP"
|
||||
title={t("findIp")}
|
||||
>
|
||||
<ExternalLink className="h-3 w-3 text-primary" />
|
||||
</Link>
|
||||
@@ -66,14 +68,14 @@ export function UserAccountInfo({ user }: UserAccountInfoProps) {
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-sm">
|
||||
<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">
|
||||
<code className="text-xs font-mono bg-muted px-2 py-0.5 rounded">
|
||||
{user.ipCurrent}
|
||||
</code>
|
||||
<Link
|
||||
href={`/admin/users?search=${user.ipCurrent}`}
|
||||
title="Find other users with this IP"
|
||||
title={t("findIp")}
|
||||
>
|
||||
<ExternalLink className="h-3 w-3 text-primary" />
|
||||
</Link>
|
||||
@@ -88,22 +90,22 @@ export function UserAccountInfo({ user }: UserAccountInfoProps) {
|
||||
variant={user.twoFactorConfirmed ? "default" : "outline"}
|
||||
className="ml-auto"
|
||||
>
|
||||
{user.twoFactorConfirmed ? "Enabled" : "Disabled"}
|
||||
{user.twoFactorConfirmed ? t("enabled") : t("disabled")}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-sm">
|
||||
<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]">
|
||||
{user.machine_id || "N/A"}
|
||||
{user.machine_id || t("unavailable")}
|
||||
</code>
|
||||
</div>
|
||||
<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>
|
||||
</div>
|
||||
<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">
|
||||
{user.gender}
|
||||
</Badge>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
"use client";
|
||||
import { useTranslations } from "next-intl";
|
||||
|
||||
interface Badge {
|
||||
id: number;
|
||||
@@ -6,8 +7,9 @@ interface Badge {
|
||||
}
|
||||
|
||||
export function UserBadgesReadonly({ badges }: { badges: Badge[] }) {
|
||||
const t = useTranslations("pages.admin.users.presentation");
|
||||
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 (
|
||||
|
||||
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 { redirect } from "next/navigation";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
||||
import { db } from "@/lib/db";
|
||||
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
|
||||
@@ -25,7 +26,18 @@ export default async function UserEditPage({
|
||||
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);
|
||||
|
||||
// Fetch rank list from permissions table for the rank dropdown
|
||||
@@ -45,6 +57,7 @@ export default async function UserEditPage({
|
||||
duckets={data.duckets}
|
||||
roomCount={data.roomCount}
|
||||
chatCount={data.chatCount}
|
||||
canViewLogs={canViewLogs && !data.activityUnavailable}
|
||||
tradeCount={data.tradeCount}
|
||||
isOnline={data.isOnline}
|
||||
activeBan={!!data.activeBan}
|
||||
@@ -57,17 +70,21 @@ export default async function UserEditPage({
|
||||
<Tabs defaultValue="edit" className="space-y-4 min-w-0">
|
||||
<TabsList className="flex-wrap">
|
||||
<TabsTrigger value="edit">Edit Profile</TabsTrigger>
|
||||
{canViewBans && (
|
||||
<TabsTrigger value="bans">
|
||||
Bans
|
||||
{data.activeBan && (
|
||||
<span className="ml-1.5 flex h-2 w-2 rounded-full bg-destructive" />
|
||||
)}
|
||||
</TabsTrigger>
|
||||
)}
|
||||
<TabsTrigger value="badges">
|
||||
Badges ({data.user.badges.length})
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="rooms">Rooms ({data.roomCount})</TabsTrigger>
|
||||
{canViewLogs && (
|
||||
<TabsTrigger value="activity">Activity</TabsTrigger>
|
||||
)}
|
||||
<TabsTrigger value="info">Account Info</TabsTrigger>
|
||||
</TabsList>
|
||||
|
||||
@@ -88,6 +105,7 @@ export default async function UserEditPage({
|
||||
/>
|
||||
</TabsContent>
|
||||
|
||||
{canViewBans && (
|
||||
<TabsContent value="bans">
|
||||
<UserBanSection
|
||||
userId={data.user.id}
|
||||
@@ -102,6 +120,7 @@ export default async function UserEditPage({
|
||||
}))}
|
||||
/>
|
||||
</TabsContent>
|
||||
)}
|
||||
|
||||
<TabsContent value="badges">
|
||||
<UserBadgesSection
|
||||
@@ -117,12 +136,23 @@ export default async function UserEditPage({
|
||||
<UserRooms rooms={data.userRooms} />
|
||||
</TabsContent>
|
||||
|
||||
{canViewLogs && (
|
||||
<TabsContent value="activity">
|
||||
{data.activityUnavailable ? (
|
||||
<p
|
||||
role="status"
|
||||
className="rounded-lg border bg-card p-4 text-sm text-destructive"
|
||||
>
|
||||
{overviewT("error")}
|
||||
</p>
|
||||
) : (
|
||||
<UserActivityLog
|
||||
chatLogs={data.chatLogs}
|
||||
commandLogs={data.commandLogs}
|
||||
/>
|
||||
)}
|
||||
</TabsContent>
|
||||
)}
|
||||
|
||||
<TabsContent value="info">
|
||||
<UserAccountInfo user={data.user} />
|
||||
|
||||
@@ -6,9 +6,9 @@ import { getWatchedUserIds } from "@/lib/services/watch";
|
||||
import { UserAccountInfo } from "../../_components/user-account-info";
|
||||
import { UserBadgesReadonly } from "../../_components/user-badges-readonly";
|
||||
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 { loadUserSanctions } from "../../_lib/load-user-sanctions";
|
||||
import { loadUserOverview } from "../../_lib/load-user-overview";
|
||||
import { UserActivityLog } from "../../[id]/user-activity-log";
|
||||
import { UserQuickActions } from "../../[id]/user-quick-actions";
|
||||
import { UserRooms } from "../../[id]/user-rooms";
|
||||
@@ -25,10 +25,19 @@ export default async function UserShowPage({
|
||||
}
|
||||
|
||||
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 data = await loadUserById(id);
|
||||
const [sanctions, watched] = await Promise.all([
|
||||
loadUserSanctions(data.user.id),
|
||||
const canViewLogs = canAccess(
|
||||
permissions,
|
||||
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),
|
||||
]);
|
||||
|
||||
@@ -40,6 +49,7 @@ export default async function UserShowPage({
|
||||
duckets={data.duckets}
|
||||
roomCount={data.roomCount}
|
||||
chatCount={data.chatCount}
|
||||
canViewLogs={canViewLogs && !data.activityUnavailable}
|
||||
tradeCount={data.tradeCount}
|
||||
isOnline={data.isOnline}
|
||||
activeBan={!!data.activeBan}
|
||||
@@ -55,8 +65,9 @@ export default async function UserShowPage({
|
||||
: 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">
|
||||
<TabsTrigger value="overview">{overviewT("title")}</TabsTrigger>
|
||||
<TabsTrigger value="info">{t("tabInfo")}</TabsTrigger>
|
||||
<TabsTrigger value="badges">
|
||||
{t("tabBadges", { count: data.user.badges.length })}
|
||||
@@ -64,12 +75,15 @@ export default async function UserShowPage({
|
||||
<TabsTrigger value="rooms">
|
||||
{t("tabRooms", { count: data.roomCount })}
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="sanctions">
|
||||
{t("tabSanctions", { count: sanctions.events.length })}
|
||||
</TabsTrigger>
|
||||
{canViewLogs && (
|
||||
<TabsTrigger value="activity">{t("tabActivity")}</TabsTrigger>
|
||||
)}
|
||||
</TabsList>
|
||||
|
||||
<TabsContent value="overview">
|
||||
<UserOperationalOverview sections={overview} />
|
||||
</TabsContent>
|
||||
|
||||
<TabsContent value="info">
|
||||
<UserAccountInfo user={data.user} />
|
||||
</TabsContent>
|
||||
@@ -87,19 +101,23 @@ export default async function UserShowPage({
|
||||
<UserRooms rooms={data.userRooms} />
|
||||
</TabsContent>
|
||||
|
||||
<TabsContent value="sanctions">
|
||||
<UserSanctionTimeline
|
||||
events={sanctions.events}
|
||||
muteUntil={sanctions.muteUntil}
|
||||
/>
|
||||
</TabsContent>
|
||||
|
||||
{canViewLogs && (
|
||||
<TabsContent value="activity">
|
||||
{data.activityUnavailable ? (
|
||||
<p
|
||||
role="status"
|
||||
className="rounded-lg border bg-card p-4 text-sm text-destructive"
|
||||
>
|
||||
{overviewT("error")}
|
||||
</p>
|
||||
) : (
|
||||
<UserActivityLog
|
||||
chatLogs={data.chatLogs}
|
||||
commandLogs={data.commandLogs}
|
||||
/>
|
||||
)}
|
||||
</TabsContent>
|
||||
)}
|
||||
</Tabs>
|
||||
|
||||
{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() {
|
||||
return query;
|
||||
},
|
||||
orderBy() {
|
||||
return query;
|
||||
},
|
||||
async limit() {
|
||||
state.queried.push(table);
|
||||
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");
|
||||
});
|
||||
|
||||
it("exposes sanction timeline on user show", () => {
|
||||
it("exposes operational overview on user show", () => {
|
||||
expect(
|
||||
existsSync("src/app/admin/users/_components/user-sanction-timeline.tsx"),
|
||||
existsSync(
|
||||
"src/app/admin/users/_components/user-operational-overview.tsx",
|
||||
),
|
||||
).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,
|
||||
);
|
||||
expect(
|
||||
readFileSync("src/app/admin/users/show/[id]/page.tsx", "utf8"),
|
||||
).toContain("UserSanctionTimeline");
|
||||
).toContain("UserOperationalOverview");
|
||||
});
|
||||
|
||||
it("applies CMS SQL from drizzle/migrations (not Prisma)", () => {
|
||||
|
||||
@@ -281,6 +281,96 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Запазете промените",
|
||||
"saving": "Запазва се...",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Uložte změny",
|
||||
"saving": "Ukládání…",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Save changes",
|
||||
"saving": "Gemmer...",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1203,6 +1203,84 @@
|
||||
"save": "Änderungen speichern",
|
||||
"saving": "Wird gespeichert…",
|
||||
"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": {
|
||||
@@ -3208,6 +3286,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Αποθήκευση αλλαγών",
|
||||
"saving": "Αποθήκευση…",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
+87
-2
File diff suppressed because it is too large.
Load diff
@@ -1203,6 +1203,84 @@
|
||||
"save": "Guardar cambios",
|
||||
"saving": "Guardando…",
|
||||
"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": {
|
||||
@@ -3208,6 +3286,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -281,6 +281,96 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1203,6 +1203,84 @@
|
||||
"save": "Enregistrer les modifications",
|
||||
"saving": "Enregistrement…",
|
||||
"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": {
|
||||
@@ -3208,6 +3286,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Spremite promjene",
|
||||
"saving": "Spremanje...",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Módosítások mentése",
|
||||
"saving": "Mentés…",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
+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})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
+185
-60
File diff suppressed because it is too large.
Load diff
@@ -1232,6 +1232,84 @@
|
||||
"save": "Lagre endringer",
|
||||
"saving": "Lagrer …",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1233,6 +1233,84 @@
|
||||
"save": "Zapisz zmiany",
|
||||
"saving": "Zapisuję…",
|
||||
"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": {
|
||||
@@ -3238,6 +3316,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1233,6 +1233,84 @@
|
||||
"save": "Salvar alterações",
|
||||
"saving": "Salvando…",
|
||||
"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": {
|
||||
@@ -3238,6 +3316,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Salvați modificările",
|
||||
"saving": "Se salvează…",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1231,6 +1231,84 @@
|
||||
"save": "Save changes",
|
||||
"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": {
|
||||
@@ -3236,6 +3314,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Uložiť zmeny",
|
||||
"saving": "Ukladá sa…",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Сачувај промене",
|
||||
"saving": "Чување…",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Spara ändringar",
|
||||
"saving": "Sparar...",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1233,6 +1233,84 @@
|
||||
"save": "Değişiklikleri kaydet",
|
||||
"saving": "Kaydediliyor…",
|
||||
"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": {
|
||||
@@ -3238,6 +3316,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
@@ -1232,6 +1232,84 @@
|
||||
"save": "Зберегти зміни",
|
||||
"saving": "Збереження…",
|
||||
"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": {
|
||||
@@ -3237,6 +3315,16 @@
|
||||
"specialPricing": "Special pricing: {credits} credits, {points} points (type {type})",
|
||||
"restrictedOffers": "{count} offers in this category require Club membership.",
|
||||
"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": {
|
||||
|
||||
Reference in new issue
Block a user