refactor(housekeeping): return result from bulkImport, remove dead server calls, sync i18n
Local Build and Deploy / deploy (push) Successful in 1m15s

- bulkImportPermissions now returns {count, errors} instead of void
- ImportSection shows per-entry error details in toast
- Remove testRankPermission server action (test is 100% client-side)
- Clean up unused testing state in TestSection
- Sync pages.admin.{import,translations} keys to all 20 languages
- Add importedWithErrors translation key to all locales
This commit is contained in:
openhands committed 2026-07-17 19:44:15 +02:00
1 parent 702ab9fc67
commit d693d169dd
24 files changed
+722 -61

No files matched your search

+12 -21
View File
@@ -127,24 +127,28 @@ export async function deletePermission(formData: FormData): Promise<void> {
revalidatePath("/admin/housekeeping"); revalidatePath("/admin/housekeeping");
} }
export async function bulkImportPermissions(formData: FormData): Promise<void> { export async function bulkImportPermissions(
formData: FormData,
): Promise<{ count: number; errors: string[] }> {
await requirePermission(PERMS.SETTINGS_EDIT); await requirePermission(PERMS.SETTINGS_EDIT);
const raw = sanitize(String(formData.get("json") ?? "")); const raw = sanitize(String(formData.get("json") ?? ""));
if (!raw) return; if (!raw) return { count: 0, errors: ["Empty input"] };
let parsed: unknown; let parsed: unknown;
try { try {
parsed = JSON.parse(raw); parsed = JSON.parse(raw);
} catch { } catch {
return; return { count: 0, errors: ["Invalid JSON"] };
} }
if (!Array.isArray(parsed)) { if (!Array.isArray(parsed)) {
return; return { count: 0, errors: ["Expected an array"] };
} }
const userId = await currentUserId(); const userId = await currentUserId();
const errors: string[] = [];
let count = 0;
for (const item of parsed) { for (const item of parsed) {
const permission = sanitize(String(item.permission ?? "")); const permission = sanitize(String(item.permission ?? ""));
@@ -154,6 +158,7 @@ export async function bulkImportPermissions(formData: FormData): Promise<void> {
const dependsOn = sanitize(String(item.dependsOn ?? "")) || null; const dependsOn = sanitize(String(item.dependsOn ?? "")) || null;
if (!permission || !Number.isFinite(minRank) || minRank < 0) { if (!permission || !Number.isFinite(minRank) || minRank < 0) {
errors.push("Invalid entry: " + JSON.stringify(item));
continue; continue;
} }
@@ -176,12 +181,14 @@ export async function bulkImportPermissions(formData: FormData): Promise<void> {
updatedBy: userId ?? undefined, updatedBy: userId ?? undefined,
}, },
}); });
count++;
} catch { } catch {
// Failed to upsert errors.push("Failed to upsert: " + permission);
} }
} }
revalidatePath("/admin/housekeeping"); revalidatePath("/admin/housekeeping");
return { count, errors };
} }
export async function exportPermissions(): Promise<string> { export async function exportPermissions(): Promise<string> {
@@ -863,20 +870,4 @@ export async function clearAllPermissions(): Promise<void> {
revalidatePath("/admin/housekeeping"); revalidatePath("/admin/housekeeping");
} }
export async function testRankPermission(formData: FormData): Promise<void> {
await requirePermission(PERMS.SETTINGS_VIEW);
const rank = Number(formData.get("testRank"));
if (!Number.isFinite(rank) || rank < 0) return;
const perms = await prisma.websiteHousekeepingPermissions.findMany({
where: { minRank: { lte: rank } },
orderBy: [{ groupName: "asc" }, { permission: "asc" }],
select: { permission: true },
});
const granted = perms.map((p) => p.permission);
revalidatePath("/admin/housekeeping");
}
+16 -19
View File
@@ -10,7 +10,6 @@ import {
clearAllPermissions, clearAllPermissions,
deletePermission, deletePermission,
exportPermissions, exportPermissions,
testRankPermission,
upsertPermission, upsertPermission,
} from "@/actions/admin-housekeeping"; } from "@/actions/admin-housekeeping";
@@ -429,24 +428,14 @@ export function TestSection({ permissions }: { permissions: HKPerm[] }) {
rank: number; rank: number;
permissions: string[]; permissions: string[];
} | null>(null); } | null>(null);
const [testing, setTesting] = useState(false);
const handleTest = useCallback(async () => { const handleTest = useCallback(() => {
const rank = Number(testRank); const rank = Number(testRank);
if (!Number.isFinite(rank) || rank < 0) if (!Number.isFinite(rank) || rank < 0)
return toast.error(t("invalidRank")); return toast.error(t("invalidRank"));
setTesting(true); const matching = permissions.filter((p) => p.minRank <= rank);
try { setTestResult({ rank, permissions: matching.map((p) => p.permission) });
const fd = new FormData(); toast.success(t("testDone", { count: matching.length }));
fd.set("testRank", testRank);
await testRankPermission(fd);
const matching = permissions.filter((p) => p.minRank <= rank);
setTestResult({ rank, permissions: matching.map((p) => p.permission) });
toast.success(t("testDone", { count: matching.length }));
} catch {
toast.error(t("errorOccurred"));
}
setTesting(false);
}, [testRank, permissions, t]); }, [testRank, permissions, t]);
return ( return (
@@ -467,10 +456,9 @@ export function TestSection({ permissions }: { permissions: HKPerm[] }) {
<button <button
type="button" type="button"
onClick={handleTest} onClick={handleTest}
disabled={testing}
className="btn btn-primary" className="btn btn-primary"
> >
{testing ? t("testing") : t("test")} {t("test")}
</button> </button>
</div> </div>
{testResult && ( {testResult && (
@@ -513,8 +501,17 @@ export function ImportSection() {
setImporting(true); setImporting(true);
try { try {
await bulkImportPermissions(fd); const result = await bulkImportPermissions(fd);
toast.success(t("imported")); if (result.errors.length > 0) {
toast.error(
t("importedWithErrors", {
count: result.count,
errors: result.errors.length,
}),
);
} else {
toast.success(t("imported", { count: result.count }));
}
if (textareaRef.current) textareaRef.current.value = ""; if (textareaRef.current) textareaRef.current.value = "";
router.refresh(); router.refresh();
} catch { } catch {
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Стаи", "title": "Стаи",
@@ -2123,6 +2124,37 @@
"saving": "Запазва се...", "saving": "Запазва се...",
"cancel": "Отказ" "cancel": "Отказ"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Pokoje", "title": "Pokoje",
@@ -2123,6 +2124,37 @@
"saving": "Ukládání…", "saving": "Ukládání…",
"cancel": "Zrušit" "cancel": "Zrušit"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Værelser", "title": "Værelser",
@@ -2123,6 +2124,37 @@
"saving": "Gemmer...", "saving": "Gemmer...",
"cancel": "Annuller" "cancel": "Annuller"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1921,7 +1921,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Räume", "title": "Räume",
@@ -2087,6 +2088,37 @@
"rounded": "Rounded corners", "rounded": "Rounded corners",
"save": "Save as favicon" "save": "Save as favicon"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
}, },
"client": { "client": {
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Δωμάτια", "title": "Δωμάτια",
@@ -2123,6 +2124,37 @@
"saving": "Αποθήκευση…", "saving": "Αποθήκευση…",
"cancel": "Ακύρωση" "cancel": "Ακύρωση"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+1
View File
@@ -1876,6 +1876,7 @@
"emptyInput": "Empty input", "emptyInput": "Empty input",
"invalidJson": "Invalid JSON", "invalidJson": "Invalid JSON",
"imported": "Imported!", "imported": "Imported!",
"importedWithErrors": "Imported {count} permissions with {errors} errors",
"presetApplied": "Preset applied!", "presetApplied": "Preset applied!",
"cleared": "All permissions cleared!", "cleared": "All permissions cleared!",
"invalidRank": "Invalid rank", "invalidRank": "Invalid rank",
+33 -1
View File
@@ -1921,7 +1921,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Salas", "title": "Salas",
@@ -2087,6 +2088,37 @@
"rounded": "Rounded corners", "rounded": "Rounded corners",
"save": "Save as favicon" "save": "Save as favicon"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
}, },
"client": { "client": {
+33 -1
View File
@@ -1921,7 +1921,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Salons", "title": "Salons",
@@ -2087,6 +2088,37 @@
"rounded": "Rounded corners", "rounded": "Rounded corners",
"save": "Save as favicon" "save": "Save as favicon"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
}, },
"client": { "client": {
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Sobe", "title": "Sobe",
@@ -2123,6 +2124,37 @@
"saving": "Spremanje...", "saving": "Spremanje...",
"cancel": "Odustani" "cancel": "Odustani"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Szobák", "title": "Szobák",
@@ -2123,6 +2124,37 @@
"saving": "Mentés…", "saving": "Mentés…",
"cancel": "Mégse" "cancel": "Mégse"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1921,7 +1921,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Stanze", "title": "Stanze",
@@ -2087,6 +2088,37 @@
"rounded": "Rounded corners", "rounded": "Rounded corners",
"save": "Save as favicon" "save": "Save as favicon"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
}, },
"client": { "client": {
+33 -1
View File
@@ -1641,7 +1641,7 @@
"pointsForm": { "pointsForm": {
"title": "Luisteraar punten configuratie", "title": "Luisteraar punten configuratie",
"subtitle": "Reward listeners with currency for time spent on the radio. Edits write to website_settings (radio_points_* keys) and bust the runtime settings cache. Booleans use 0 / 1.", "subtitle": "Reward listeners with currency for time spent on the radio. Edits write to website_settings (radio_points_* keys) and bust the runtime settings cache. Booleans use 0 / 1.",
"points": "Points", "points": "Points",
"enabled": "Enabled", "enabled": "Enabled",
"disabled": "Disabled", "disabled": "Disabled",
"perMinute": "Per minute", "perMinute": "Per minute",
@@ -1876,6 +1876,7 @@
"emptyInput": "Lege invoer", "emptyInput": "Lege invoer",
"invalidJson": "Ongeldige JSON", "invalidJson": "Ongeldige JSON",
"imported": "Geïmporteerd!", "imported": "Geïmporteerd!",
"importedWithErrors": "{count} permissies geïmporteerd met {errors} fouten",
"presetApplied": "Preset toegepast!", "presetApplied": "Preset toegepast!",
"cleared": "Alle permissies verwijderd!", "cleared": "Alle permissies verwijderd!",
"invalidRank": "Ongeldige rang", "invalidRank": "Ongeldige rang",
@@ -2119,6 +2120,37 @@
"saving": "Opslaan…", "saving": "Opslaan…",
"cancel": "Annuleren" "cancel": "Annuleren"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Rom", "title": "Rom",
@@ -2123,6 +2124,37 @@
"saving": "Lagrer …", "saving": "Lagrer …",
"cancel": "Avbryt" "cancel": "Avbryt"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Pokoje", "title": "Pokoje",
@@ -2123,6 +2124,37 @@
"saving": "Zapisuję…", "saving": "Zapisuję…",
"cancel": "Anuluj" "cancel": "Anuluj"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Quartos", "title": "Quartos",
@@ -2123,6 +2124,37 @@
"saving": "Salvando…", "saving": "Salvando…",
"cancel": "Cancelar" "cancel": "Cancelar"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Camerele", "title": "Camerele",
@@ -2123,6 +2124,37 @@
"saving": "Se salvează…", "saving": "Se salvează…",
"cancel": "Anulează" "cancel": "Anulează"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Rooms", "title": "Rooms",
@@ -2123,6 +2124,37 @@
"saving": "Saving…", "saving": "Saving…",
"cancel": "Cancel" "cancel": "Cancel"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Izby", "title": "Izby",
@@ -2123,6 +2124,37 @@
"saving": "Ukladá sa…", "saving": "Ukladá sa…",
"cancel": "Zrušiť" "cancel": "Zrušiť"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Собе", "title": "Собе",
@@ -2123,6 +2124,37 @@
"saving": "Чување…", "saving": "Чување…",
"cancel": "Откажи" "cancel": "Откажи"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Rum", "title": "Rum",
@@ -2123,6 +2124,37 @@
"saving": "Sparar...", "saving": "Sparar...",
"cancel": "Avbryt" "cancel": "Avbryt"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Odalar", "title": "Odalar",
@@ -2123,6 +2124,37 @@
"saving": "Kaydediliyor…", "saving": "Kaydediliyor…",
"cancel": "İptal" "cancel": "İptal"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }
+33 -1
View File
@@ -1957,7 +1957,8 @@
"auditTitle": "Permission audit log", "auditTitle": "Permission audit log",
"auditHint": "All changes to housekeeping permissions are logged.", "auditHint": "All changes to housekeeping permissions are logged.",
"auditLogsAt": "Audit logs are available on the Audit log page.", "auditLogsAt": "Audit logs are available on the Audit log page.",
"viewAuditLogs": "View audit logs" "viewAuditLogs": "View audit logs",
"importedWithErrors": "Imported {count} permissions with {errors} errors"
}, },
"rooms": { "rooms": {
"title": "Кімнати", "title": "Кімнати",
@@ -2123,6 +2124,37 @@
"saving": "Збереження…", "saving": "Збереження…",
"cancel": "Скасувати" "cancel": "Скасувати"
} }
},
"import": {
"title": "Import",
"subtitle": "Import assets from external sources into your hotel.",
"badges": "Badges",
"badgesDescription": "Import and manage badge assets from external sources.",
"furni": "Furni",
"furniDescription": "Import furniture definitions, SWF files, and icons.",
"clothing": "Clothing",
"clothingDescription": "Import clothing and wearables for avatars.",
"effects": "Effects",
"effectsDescription": "Import avatar effects and animations.",
"pets": "Pets",
"petsDescription": "Import pet data and icons.",
"clone": "Clone",
"cloneDescription": "Clone existing items from one source to another."
},
"translations": {
"title": "Translations",
"subtitle": "Translate your hotel into multiple languages.",
"tabs": {
"cms": "CMS",
"client": "Client (Nitro)",
"emulator": "Emulator"
},
"emulator": {
"title": "Emulator",
"subtitle": "User-facing strings from emulator_settings (commands, wordfilter, pet/matchmaking messages).",
"infoBox": "Configuration settings (ports, timeouts, IDs) do not appear here — use the full settings link. Saved changes are synced to the emulator via RCON.",
"fullSettings": "Full settings"
}
} }
} }
} }