diff --git a/src/actions/admin-housekeeping.ts b/src/actions/admin-housekeeping.ts index 0feba44c..6928f6dd 100644 --- a/src/actions/admin-housekeeping.ts +++ b/src/actions/admin-housekeeping.ts @@ -127,24 +127,28 @@ export async function deletePermission(formData: FormData): Promise { revalidatePath("/admin/housekeeping"); } -export async function bulkImportPermissions(formData: FormData): Promise { +export async function bulkImportPermissions( + formData: FormData, +): Promise<{ count: number; errors: string[] }> { await requirePermission(PERMS.SETTINGS_EDIT); const raw = sanitize(String(formData.get("json") ?? "")); - if (!raw) return; + if (!raw) return { count: 0, errors: ["Empty input"] }; let parsed: unknown; try { parsed = JSON.parse(raw); } catch { - return; + return { count: 0, errors: ["Invalid JSON"] }; } if (!Array.isArray(parsed)) { - return; + return { count: 0, errors: ["Expected an array"] }; } const userId = await currentUserId(); + const errors: string[] = []; + let count = 0; for (const item of parsed) { const permission = sanitize(String(item.permission ?? "")); @@ -154,6 +158,7 @@ export async function bulkImportPermissions(formData: FormData): Promise { const dependsOn = sanitize(String(item.dependsOn ?? "")) || null; if (!permission || !Number.isFinite(minRank) || minRank < 0) { + errors.push("Invalid entry: " + JSON.stringify(item)); continue; } @@ -176,12 +181,14 @@ export async function bulkImportPermissions(formData: FormData): Promise { updatedBy: userId ?? undefined, }, }); + count++; } catch { - // Failed to upsert + errors.push("Failed to upsert: " + permission); } } revalidatePath("/admin/housekeeping"); + return { count, errors }; } export async function exportPermissions(): Promise { @@ -863,20 +870,4 @@ export async function clearAllPermissions(): Promise { revalidatePath("/admin/housekeeping"); } -export async function testRankPermission(formData: FormData): Promise { - 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"); -} - diff --git a/src/app/admin/housekeeping/client.tsx b/src/app/admin/housekeeping/client.tsx index e3634e1d..a4a29c55 100644 --- a/src/app/admin/housekeeping/client.tsx +++ b/src/app/admin/housekeeping/client.tsx @@ -10,7 +10,6 @@ import { clearAllPermissions, deletePermission, exportPermissions, - testRankPermission, upsertPermission, } from "@/actions/admin-housekeeping"; @@ -429,24 +428,14 @@ export function TestSection({ permissions }: { permissions: HKPerm[] }) { rank: number; permissions: string[]; } | null>(null); - const [testing, setTesting] = useState(false); - const handleTest = useCallback(async () => { + const handleTest = useCallback(() => { const rank = Number(testRank); if (!Number.isFinite(rank) || rank < 0) return toast.error(t("invalidRank")); - setTesting(true); - try { - const fd = new FormData(); - 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); + const matching = permissions.filter((p) => p.minRank <= rank); + setTestResult({ rank, permissions: matching.map((p) => p.permission) }); + toast.success(t("testDone", { count: matching.length })); }, [testRank, permissions, t]); return ( @@ -467,10 +456,9 @@ export function TestSection({ permissions }: { permissions: HKPerm[] }) { {testResult && ( @@ -513,8 +501,17 @@ export function ImportSection() { setImporting(true); try { - await bulkImportPermissions(fd); - toast.success(t("imported")); + const result = await bulkImportPermissions(fd); + 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 = ""; router.refresh(); } catch { diff --git a/src/messages/bg.json b/src/messages/bg.json index 17f86f4b..ad8da3f1 100644 --- a/src/messages/bg.json +++ b/src/messages/bg.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Стаи", @@ -2123,6 +2124,37 @@ "saving": "Запазва се...", "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" + } } } } diff --git a/src/messages/cs.json b/src/messages/cs.json index 6616835b..408b8a32 100644 --- a/src/messages/cs.json +++ b/src/messages/cs.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Pokoje", @@ -2123,6 +2124,37 @@ "saving": "Ukládání…", "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" + } } } } diff --git a/src/messages/da.json b/src/messages/da.json index f4af36c3..60e3925a 100644 --- a/src/messages/da.json +++ b/src/messages/da.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Værelser", @@ -2123,6 +2124,37 @@ "saving": "Gemmer...", "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" + } } } } diff --git a/src/messages/de.json b/src/messages/de.json index 002e30ca..c7f0e0b6 100644 --- a/src/messages/de.json +++ b/src/messages/de.json @@ -1921,7 +1921,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Räume", @@ -2087,6 +2088,37 @@ "rounded": "Rounded corners", "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": { diff --git a/src/messages/el.json b/src/messages/el.json index 0526f771..73019c5d 100644 --- a/src/messages/el.json +++ b/src/messages/el.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Δωμάτια", @@ -2123,6 +2124,37 @@ "saving": "Αποθήκευση…", "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" + } } } } diff --git a/src/messages/en.json b/src/messages/en.json index 286fab34..3b7209b3 100644 --- a/src/messages/en.json +++ b/src/messages/en.json @@ -1876,6 +1876,7 @@ "emptyInput": "Empty input", "invalidJson": "Invalid JSON", "imported": "Imported!", + "importedWithErrors": "Imported {count} permissions with {errors} errors", "presetApplied": "Preset applied!", "cleared": "All permissions cleared!", "invalidRank": "Invalid rank", diff --git a/src/messages/es.json b/src/messages/es.json index b6041c6f..e28c58a7 100644 --- a/src/messages/es.json +++ b/src/messages/es.json @@ -1921,7 +1921,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Salas", @@ -2087,6 +2088,37 @@ "rounded": "Rounded corners", "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": { diff --git a/src/messages/fr.json b/src/messages/fr.json index 7cce0939..fff186db 100644 --- a/src/messages/fr.json +++ b/src/messages/fr.json @@ -1921,7 +1921,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Salons", @@ -2087,6 +2088,37 @@ "rounded": "Rounded corners", "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": { diff --git a/src/messages/hr.json b/src/messages/hr.json index 10d427fb..4547586c 100644 --- a/src/messages/hr.json +++ b/src/messages/hr.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Sobe", @@ -2123,6 +2124,37 @@ "saving": "Spremanje...", "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" + } } } } diff --git a/src/messages/hu.json b/src/messages/hu.json index 85c3b57a..0c7c32cf 100644 --- a/src/messages/hu.json +++ b/src/messages/hu.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Szobák", @@ -2123,6 +2124,37 @@ "saving": "Mentés…", "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" + } } } } diff --git a/src/messages/it.json b/src/messages/it.json index 5e4d4075..44600013 100644 --- a/src/messages/it.json +++ b/src/messages/it.json @@ -1921,7 +1921,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Stanze", @@ -2087,6 +2088,37 @@ "rounded": "Rounded corners", "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": { diff --git a/src/messages/nl.json b/src/messages/nl.json index eddced57..acda7ef5 100644 --- a/src/messages/nl.json +++ b/src/messages/nl.json @@ -1641,7 +1641,7 @@ "pointsForm": { "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.", - "points": "Points", + "points": "Points", "enabled": "Enabled", "disabled": "Disabled", "perMinute": "Per minute", @@ -1876,6 +1876,7 @@ "emptyInput": "Lege invoer", "invalidJson": "Ongeldige JSON", "imported": "Geïmporteerd!", + "importedWithErrors": "{count} permissies geïmporteerd met {errors} fouten", "presetApplied": "Preset toegepast!", "cleared": "Alle permissies verwijderd!", "invalidRank": "Ongeldige rang", @@ -2119,6 +2120,37 @@ "saving": "Opslaan…", "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" + } } } } diff --git a/src/messages/no.json b/src/messages/no.json index fb7f3f90..604bf64e 100644 --- a/src/messages/no.json +++ b/src/messages/no.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Rom", @@ -2123,6 +2124,37 @@ "saving": "Lagrer …", "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" + } } } } diff --git a/src/messages/pl.json b/src/messages/pl.json index 6096665b..f4910cde 100644 --- a/src/messages/pl.json +++ b/src/messages/pl.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Pokoje", @@ -2123,6 +2124,37 @@ "saving": "Zapisuję…", "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" + } } } } diff --git a/src/messages/pt.json b/src/messages/pt.json index 3b7095fb..35f16103 100644 --- a/src/messages/pt.json +++ b/src/messages/pt.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Quartos", @@ -2123,6 +2124,37 @@ "saving": "Salvando…", "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" + } } } } diff --git a/src/messages/ro.json b/src/messages/ro.json index 1125f6f8..0ea46c0c 100644 --- a/src/messages/ro.json +++ b/src/messages/ro.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Camerele", @@ -2123,6 +2124,37 @@ "saving": "Se salvează…", "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" + } } } } diff --git a/src/messages/ru.json b/src/messages/ru.json index 45b7c70d..4ee55434 100644 --- a/src/messages/ru.json +++ b/src/messages/ru.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Rooms", @@ -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" + } } } } diff --git a/src/messages/sk.json b/src/messages/sk.json index fcc59d96..2517d331 100644 --- a/src/messages/sk.json +++ b/src/messages/sk.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Izby", @@ -2123,6 +2124,37 @@ "saving": "Ukladá sa…", "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" + } } } } diff --git a/src/messages/sr.json b/src/messages/sr.json index f50e88fb..2b012fbe 100644 --- a/src/messages/sr.json +++ b/src/messages/sr.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Собе", @@ -2123,6 +2124,37 @@ "saving": "Чување…", "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" + } } } } diff --git a/src/messages/sv.json b/src/messages/sv.json index 7b0f5f38..0511378e 100644 --- a/src/messages/sv.json +++ b/src/messages/sv.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Rum", @@ -2123,6 +2124,37 @@ "saving": "Sparar...", "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" + } } } } diff --git a/src/messages/tr.json b/src/messages/tr.json index eb6e6ac3..03de1c90 100644 --- a/src/messages/tr.json +++ b/src/messages/tr.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Odalar", @@ -2123,6 +2124,37 @@ "saving": "Kaydediliyor…", "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" + } } } } diff --git a/src/messages/uk.json b/src/messages/uk.json index a77ae7f6..48c1d3d2 100644 --- a/src/messages/uk.json +++ b/src/messages/uk.json @@ -1957,7 +1957,8 @@ "auditTitle": "Permission audit log", "auditHint": "All changes to housekeeping permissions are logged.", "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": { "title": "Кімнати", @@ -2123,6 +2124,37 @@ "saving": "Збереження…", "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" + } } } }