diff --git a/src/app/admin/import/furni/nitro-editor-dialog.tsx b/src/app/admin/import/furni/nitro-editor-dialog.tsx index 0fcaafc9..deceb0a6 100644 --- a/src/app/admin/import/furni/nitro-editor-dialog.tsx +++ b/src/app/admin/import/furni/nitro-editor-dialog.tsx @@ -237,7 +237,7 @@ export function NitroEditorDialog({ } })(); return () => controller.abort(); - }, [open, classname]); + }, [open, classname, t]); const handleTabChange = (newTab: string) => { if (activeTab === "json" && newTab !== "json") { diff --git a/src/app/admin/import/furni/upload/upload-furni-client.tsx b/src/app/admin/import/furni/upload/upload-furni-client.tsx index 3ce3ec3e..a5346496 100644 --- a/src/app/admin/import/furni/upload/upload-furni-client.tsx +++ b/src/app/admin/import/furni/upload/upload-furni-client.tsx @@ -1,7 +1,7 @@ "use client"; -import { useTranslations } from "next-intl"; import { AlertCircle, Check, Loader2, Upload } from "lucide-react"; +import { useTranslations } from "next-intl"; import { useRef, useState } from "react"; import { toast } from "sonner"; import { ImportErrorBanner } from "@/components/admin/import-error-banner"; diff --git a/src/app/admin/sounds/sounds-client.tsx b/src/app/admin/sounds/sounds-client.tsx index efb1626a..5a5a75cb 100644 --- a/src/app/admin/sounds/sounds-client.tsx +++ b/src/app/admin/sounds/sounds-client.tsx @@ -10,8 +10,8 @@ import { Trash2, Upload, } from "lucide-react"; -import { useTranslations } from "next-intl"; import { useRouter } from "next/navigation"; +import { useTranslations } from "next-intl"; import { useMemo, useRef, useState } from "react"; import { toast } from "sonner"; import { deleteSoundtrack, updateSoundtrack } from "@/actions/soundtracks"; diff --git a/src/components/admin/catalog/catalog-items-table/catalog-items-table.tsx b/src/components/admin/catalog/catalog-items-table/catalog-items-table.tsx index 36d0c8c5..a0780065 100644 --- a/src/components/admin/catalog/catalog-items-table/catalog-items-table.tsx +++ b/src/components/admin/catalog/catalog-items-table/catalog-items-table.tsx @@ -179,7 +179,9 @@ export function CatalogItemsTable({ const router = useRouter(); const bulk = useTranslations("pages.admin.catalog.bulk"); const discovery = useTranslations("pages.admin.catalog.discovery"); - const t = useTranslations("pages.admin.catalog.catalogItemsTable.catalogItemsTable"); + const t = useTranslations( + "pages.admin.catalog.catalogItemsTable.catalogItemsTable", + ); const [bulkRefreshFrom, setBulkRefreshFrom] = useState< CatalogItemData[] | null >(null); diff --git a/src/messages/ar.json b/src/messages/ar.json index 47592bb6..d314fa26 100644 --- a/src/messages/ar.json +++ b/src/messages/ar.json @@ -947,7 +947,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -955,7 +959,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "catalogPackages": { @@ -1167,6 +1332,55 @@ "save": "Save changes", "saving": "Saving…", "cancel": "Cancel" + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "search": { @@ -1386,7 +1600,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -1397,7 +1646,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "tags": { "title": "Tags", @@ -1885,6 +2174,108 @@ "save": "Save permission", "saving": "Saving…", "cancel": "Cancel" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "online": { @@ -2057,7 +2448,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "transactions": { "title": "Transactions", @@ -2330,7 +2758,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio Moderation", @@ -3164,6 +3608,51 @@ "enterRoom": "Enter room", "changeOwner": "Change owner", "changeOwnerPlaceholder": "New owner username" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3230,7 +3719,54 @@ "presetApplied": "Preset applied: {preset}", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Media Library", @@ -3283,11 +3819,164 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", "upload": "Upload .nitro", "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3299,7 +3988,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3598,6 +4360,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "myDashboard": { @@ -3912,7 +5283,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "News", @@ -4348,7 +5727,38 @@ "colShow": "Show", "colDj": "DJ", "untitledShow": "Untitled show", - "userNumber": "User #{id}" + "userNumber": "User #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radio Schedule", @@ -4593,7 +6003,10 @@ "errorInvalidCredentials": "Invalid username or password", "errorInvalid2fa": "Invalid 2FA code", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Create account", @@ -4631,7 +6044,8 @@ "usernameRequired": "Username is required.", "emailRequired": "Email is required.", "passwordRequired": "Password is required.", - "passwordsDontMatch": "Passwords do not match." + "passwordsDontMatch": "Passwords do not match.", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Reset password", @@ -4846,7 +6260,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4916,6 +6394,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "toolbar": { diff --git a/src/messages/bg.json b/src/messages/bg.json index d7a34b52..27d1ecc0 100644 --- a/src/messages/bg.json +++ b/src/messages/bg.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Новини", @@ -623,7 +631,38 @@ "colShow": "Покажи", "colDj": "DJ", "untitledShow": "Безименно предаване", - "userNumber": "Потребител #{id}" + "userNumber": "Потребител #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "График на радиото", @@ -801,7 +840,10 @@ "welcomeBack": "Добре дошли отново", "welcomeBackSub": "Влезте, за да продължите към {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Създаване на акаунт", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Нулирайте паролата", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Разрешение за запазване", "saving": "Запазва се...", "cancel": "Отказ" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Радио модериране", @@ -3267,6 +3642,51 @@ "enterRoom": "Влез в стаята", "changeOwner": "Смени собственика", "changeOwnerPlaceholder": "Ново потребителско име на собственик" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Медийна библиотека", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/cs.json b/src/messages/cs.json index a680a2ab..6458d4b0 100644 --- a/src/messages/cs.json +++ b/src/messages/cs.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Novinky", @@ -623,7 +631,38 @@ "colShow": "Zobrazit", "colDj": "DJ", "untitledShow": "Pořad bez názvu", - "userNumber": "Uživatel #{id}" + "userNumber": "Uživatel #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Rozpis rádia", @@ -801,7 +840,10 @@ "welcomeBack": "Vítej zpět", "welcomeBackSub": "Přihlas se pro pokračování do {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Vytvořit účet", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Obnovit heslo", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Uložit oprávnění", "saving": "Ukládání…", "cancel": "Zrušit" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Moderování rádia", @@ -3267,6 +3642,51 @@ "enterRoom": "Vstupte do místnosti", "changeOwner": "Změnit vlastníka", "changeOwnerPlaceholder": "Uživatelské jméno nového vlastníka" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Knihovna médií", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/da.json b/src/messages/da.json index 401d9412..c9731ac8 100644 --- a/src/messages/da.json +++ b/src/messages/da.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Nyheder", @@ -623,7 +631,38 @@ "colShow": "Vis", "colDj": "DJ", "untitledShow": "Udsendelse uden titel", - "userNumber": "Bruger #{id}" + "userNumber": "Bruger #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radioskema", @@ -801,7 +840,10 @@ "welcomeBack": "Velkommen tilbage", "welcomeBackSub": "Log ind for at fortsætte til {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Opret konto", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Nulstil adgangskode", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Gem tilladelse", "saving": "Gemmer...", "cancel": "Annuller" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio Moderation", @@ -3267,6 +3642,51 @@ "enterRoom": "Gå ind i værelset", "changeOwner": "Skift ejer", "changeOwnerPlaceholder": "Nyt ejerbrugernavn" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Mediebibliotek", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/de.json b/src/messages/de.json index 64d4060b..d4e2a5d6 100644 --- a/src/messages/de.json +++ b/src/messages/de.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Nachrichten", @@ -623,7 +631,38 @@ "colShow": "Sendung", "colDj": "DJ", "untitledShow": "Unbenannte Sendung", - "userNumber": "Benutzer #{id}" + "userNumber": "Benutzer #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radiosendungplan", @@ -771,7 +810,10 @@ "welcomeBack": "Willkommen zurück", "welcomeBackSub": "Melde dich an, um zu {hotelName} zu gelangen", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Konto erstellen", @@ -809,7 +851,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Passwort zurücksetzen", @@ -1418,6 +1461,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1615,6 +1707,108 @@ "save": "Berechtigung speichern", "saving": "Wird gespeichert…", "cancel": "Abbrechen" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2044,7 +2238,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2052,7 +2250,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2409,7 +2768,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio-Moderation", @@ -3237,6 +3612,51 @@ "enterRoom": "Raum betreten", "changeOwner": "Besitzer ändern", "changeOwnerPlaceholder": "Benutzername des neuen Besitzers" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3303,7 +3723,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Medienbibliothek", @@ -3385,9 +3852,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3401,7 +4021,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3716,7 +4409,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3727,7 +4455,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3901,7 +4669,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4399,6 +5204,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "radioRequests": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/el.json b/src/messages/el.json index 924b01f0..bc0eeb8b 100644 --- a/src/messages/el.json +++ b/src/messages/el.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Νέα", @@ -623,7 +631,38 @@ "colShow": "Εμφάνιση", "colDj": "DJ", "untitledShow": "Παράσταση χωρίς τίτλο", - "userNumber": "Χρήστης #{id}" + "userNumber": "Χρήστης #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Πρόγραμμα ραδιοφώνου", @@ -801,7 +840,10 @@ "welcomeBack": "Καλώς ήρθες πίσω", "welcomeBackSub": "Συνδέσου για να συνεχίσεις στο {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Δημιουργία λογαριασμού", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Επαναφορά κωδικού πρόσβασης", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Αποθήκευση άδειας", "saving": "Αποθήκευση…", "cancel": "Ακύρωση" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Συντονισμός Ραδιοφώνου", @@ -3267,6 +3642,51 @@ "enterRoom": "Μπείτε στο δωμάτιο", "changeOwner": "Αλλαγή κατόχου", "changeOwnerPlaceholder": "Όνομα χρήστη νέου κατόχου" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Βιβλιοθήκη πολυμέσων", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/en.json b/src/messages/en.json index ac25d2f9..08cf22e9 100644 --- a/src/messages/en.json +++ b/src/messages/en.json @@ -732,7 +732,38 @@ "colShow": "Show", "colDj": "DJ", "untitledShow": "Untitled show", - "userNumber": "User #{id}" + "userNumber": "User #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radio Schedule", @@ -1388,7 +1419,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -1399,7 +1465,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "tags": { "title": "Tags", @@ -1728,6 +1834,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -2035,6 +2190,108 @@ "save": "Save permission", "saving": "Saving…", "cancel": "Cancel" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "online": { @@ -2511,6 +2768,165 @@ "invalid_offer_id": "Invalid offer identifier", "duplicate_offer_id": "Repeated offer identifier" } + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2651,7 +3067,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "transactions": { "title": "Transactions", @@ -2924,7 +3377,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio Moderation", @@ -3879,6 +4348,51 @@ "enterRoom": "Enter room", "changeOwner": "Change owner", "changeOwnerPlaceholder": "New owner username" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3945,7 +4459,54 @@ "presetApplied": "Preset applied: {preset}", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Media Library", @@ -3998,11 +4559,164 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", "upload": "Upload .nitro", "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -4014,7 +4728,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -4614,6 +5401,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "mod": { @@ -4998,6 +6394,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "toolbar": { diff --git a/src/messages/es.json b/src/messages/es.json index 1965df18..1a0c0c7e 100644 --- a/src/messages/es.json +++ b/src/messages/es.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Noticias", @@ -623,7 +631,38 @@ "colShow": "Programa", "colDj": "DJ", "untitledShow": "Programa sin título", - "userNumber": "Usuario #{id}" + "userNumber": "Usuario #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Horario de radio", @@ -771,7 +810,10 @@ "welcomeBack": "Bienvenido de nuevo", "welcomeBackSub": "Inicia sesión para continuar en {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Crear cuenta", @@ -809,7 +851,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Restablecer contraseña", @@ -1418,6 +1461,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1615,6 +1707,108 @@ "save": "Guardar permiso", "saving": "Guardando…", "cancel": "Cancelar" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2044,7 +2238,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2052,7 +2250,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2409,7 +2768,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Moderación de radio", @@ -3237,6 +3612,51 @@ "enterRoom": "Entrar a la sala", "changeOwner": "Cambiar dueño", "changeOwnerPlaceholder": "Usuario del nuevo dueño" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3303,7 +3723,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Biblioteca multimedia", @@ -3385,9 +3852,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3401,7 +4021,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3716,7 +4409,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3727,7 +4455,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3901,7 +4669,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4399,6 +5204,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "radioRequests": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/fi.json b/src/messages/fi.json index 9dcc3b1f..4d6cc017 100644 --- a/src/messages/fi.json +++ b/src/messages/fi.json @@ -947,7 +947,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -955,7 +959,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "catalogPackages": { @@ -1167,6 +1332,55 @@ "save": "Save changes", "saving": "Saving…", "cancel": "Cancel" + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "search": { @@ -1386,7 +1600,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -1397,7 +1646,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "tags": { "title": "Tags", @@ -1885,6 +2174,108 @@ "save": "Save permission", "saving": "Saving…", "cancel": "Cancel" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "online": { @@ -2057,7 +2448,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "transactions": { "title": "Transactions", @@ -2330,7 +2758,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio Moderation", @@ -3164,6 +3608,51 @@ "enterRoom": "Enter room", "changeOwner": "Change owner", "changeOwnerPlaceholder": "New owner username" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3230,7 +3719,54 @@ "presetApplied": "Preset applied: {preset}", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Media Library", @@ -3283,11 +3819,164 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", "upload": "Upload .nitro", "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3299,7 +3988,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3598,6 +4360,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "myDashboard": { @@ -3912,7 +5283,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "News", @@ -4348,7 +5727,38 @@ "colShow": "Show", "colDj": "DJ", "untitledShow": "Untitled show", - "userNumber": "User #{id}" + "userNumber": "User #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radio Schedule", @@ -4593,7 +6003,10 @@ "errorInvalidCredentials": "Invalid username or password", "errorInvalid2fa": "Invalid 2FA code", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Create account", @@ -4631,7 +6044,8 @@ "usernameRequired": "Username is required.", "emailRequired": "Email is required.", "passwordRequired": "Password is required.", - "passwordsDontMatch": "Passwords do not match." + "passwordsDontMatch": "Passwords do not match.", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Reset password", @@ -4846,7 +6260,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4916,6 +6394,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "toolbar": { diff --git a/src/messages/fr.json b/src/messages/fr.json index 119e451a..365393e7 100644 --- a/src/messages/fr.json +++ b/src/messages/fr.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Actualités", @@ -623,7 +631,38 @@ "colShow": "Émission", "colDj": "DJ", "untitledShow": "Émission sans titre", - "userNumber": "Utilisateur #{id}" + "userNumber": "Utilisateur #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Programmation radio", @@ -771,7 +810,10 @@ "welcomeBack": "Bon retour", "welcomeBackSub": "Connecte-toi pour continuer vers {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Créer un compte", @@ -809,7 +851,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Réinitialiser le mot de passe", @@ -1418,6 +1461,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1615,6 +1707,108 @@ "save": "Enregistrer la permission", "saving": "Enregistrement…", "cancel": "Annuler" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2044,7 +2238,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2052,7 +2250,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2409,7 +2768,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Modération radio", @@ -3237,6 +3612,51 @@ "enterRoom": "Entrer dans le salon", "changeOwner": "Changer le propriétaire", "changeOwnerPlaceholder": "Nom du nouveau propriétaire" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3303,7 +3723,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Médiathèque", @@ -3385,9 +3852,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3401,7 +4021,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3716,7 +4409,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3727,7 +4455,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3901,7 +4669,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4399,6 +5204,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "radioRequests": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/hr.json b/src/messages/hr.json index a4b82d02..c603df05 100644 --- a/src/messages/hr.json +++ b/src/messages/hr.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Vijesti", @@ -623,7 +631,38 @@ "colShow": "pokazati", "colDj": "DJ", "untitledShow": "Emisija bez naslova", - "userNumber": "Korisnik #{id}" + "userNumber": "Korisnik #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Raspored radija", @@ -801,7 +840,10 @@ "welcomeBack": "Dobrodošao natrag", "welcomeBackSub": "Prijavi se za nastavak u {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Napravi račun", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Resetiraj lozinku", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Spremi dopuštenje", "saving": "Spremanje...", "cancel": "Odustani" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio moderiranje", @@ -3267,6 +3642,51 @@ "enterRoom": "Uđi u sobu", "changeOwner": "Promjena vlasnika", "changeOwnerPlaceholder": "Korisničko ime novog vlasnika" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Mediateka", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/hu.json b/src/messages/hu.json index a2517ee1..c1724b29 100644 --- a/src/messages/hu.json +++ b/src/messages/hu.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Hírek", @@ -623,7 +631,38 @@ "colShow": "Megjelenítés", "colDj": "DJ", "untitledShow": "Cím nélküli műsor", - "userNumber": "Felhasználó #{id}" + "userNumber": "Felhasználó #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Rádió menetrend", @@ -801,7 +840,10 @@ "welcomeBack": "Üdvözöllek újra", "welcomeBackSub": "Jelentkezz be a {hotelName} folytatáshoz", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Hozzon létre fiókot", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Jelszó visszaállítása", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Mentse el az engedélyt", "saving": "Mentés…", "cancel": "Mégse" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Rádió moderálása", @@ -3267,6 +3642,51 @@ "enterRoom": "Lépjen be a szobába", "changeOwner": "Tulajdonosváltás", "changeOwnerPlaceholder": "Új tulajdonos felhasználónév" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Médiatár", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/it.json b/src/messages/it.json index 18b2cfa6..b221cafa 100644 --- a/src/messages/it.json +++ b/src/messages/it.json @@ -732,7 +732,38 @@ "colShow": "Show", "colDj": "DJ", "untitledShow": "Show senza titolo", - "userNumber": "Utente #{id}" + "userNumber": "Utente #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Programmazione radio", @@ -1362,7 +1393,42 @@ "formUpdate": "Aggiorna sondaggio", "formCreate": "Crea sondaggio", "toastUpdated": "Sondaggio aggiornato!", - "toastCreated": "Sondaggio creato!" + "toastCreated": "Sondaggio creato!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min. account per cluster", @@ -1373,7 +1439,47 @@ "devops": { "noEmulatorErrors": "Nessun errore emulator trovato", "noRecentErrors": "Nessun errore recente", - "cmsErrors": "Centro errori CMS" + "cmsErrors": "Centro errori CMS", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "tags": { "title": "Tag", @@ -1703,6 +1809,55 @@ "reported": "Utente segnalato", "reporter": "Segnalante" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1986,6 +2141,108 @@ "save": "Salva permesso", "saving": "Salvataggio…", "cancel": "Annulla" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2291,7 +2548,11 @@ "free": "Gratuite", "paid": "A pagamento", "bundles": "Pacchetti", - "limited": "Edizioni limitate" + "limited": "Edizioni limitate", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} visibili)", "selected": "{count} selezionate", @@ -2299,7 +2560,9 @@ "results": "{count} offerte visibili su {total}.", "selectionHint": "Cambiare ricerca o filtro azzera la selezione.", "noResults": "Nessuna offerta corrisponde alla ricerca e al filtro attuali.", - "selectVisible": "Seleziona tutte le offerte visibili" + "selectVisible": "Seleziona tutte le offerte visibili", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" }, "packages": { "openPackages": "Pacchetti catalogo", @@ -2424,6 +2687,165 @@ "invalid_offer_id": "Identificativo offerta non valido", "duplicate_offer_id": "Identificativo offerta ripetuto" } + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2564,7 +2986,44 @@ "formReadForum": "Leggere il forum", "formPostMessages": "Pubblicare messaggi", "formPostThreads": "Creare discussioni", - "formModForum": "Moderare il forum" + "formModForum": "Moderare il forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "transactions": { "title": "Transazioni", @@ -2837,7 +3296,23 @@ "statusDisabled": "Disattivata", "campaignMeta": "#{id} · {days} giorni · {rewards} ricompense", "startsAt": "Inizio: {date}", - "locksExpired": "Giorni scaduti bloccati" + "locksExpired": "Giorni scaduti bloccati", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Moderazione radio", @@ -3665,6 +4140,51 @@ "enterRoom": "Entra nella stanza", "changeOwner": "Cambia proprietario", "changeOwnerPlaceholder": "Nome utente nuovo proprietario" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3731,7 +4251,54 @@ "saved": "Impostazioni del tema salvate.", "typographyLayout": "Tipografia e impaginazione", "font": "Carattere", - "borderRadius": "Raggio degli angoli" + "borderRadius": "Raggio degli angoli", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Libreria media", @@ -3958,9 +4525,162 @@ "subtitle": "Importa asset da fonti esterne nel tuo hotel.", "badges": "Distintivi", "badgesDescription": "Importa e gestisci asset dei distintivi da fonti esterne.", - "furni": "Mobili", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Importa definizioni mobili, file SWF e icone.", - "clothing": "Abbigliamento", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Importa abiti e indossabili per gli avatar.", "effects": "Effetti", "effectsDescription": "Importa effetti e animazioni avatar.", @@ -3974,7 +4694,80 @@ "syncDescription": "Importa automaticamente i mobili mancanti da tutte le fonti configurate.", "repairIcons": "Ripara icone", "repairIconsDescription": "Scarica le icone mancanti per i mobili già presenti nel database.", - "audit": "Audit catalogo", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scansiona il catalogo per voci mancanti, riferimenti rotti ed elementi assenti dalle fonti clone." }, "translations": { @@ -4583,6 +5376,615 @@ "export": "Impossibile accodare l’esportazione Git. Controlla la configurazione e il worker.", "unknown": "L’aggiornamento non è riuscito. Controlla la diagnostica servizi." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "radioRequests": { @@ -4997,6 +6399,91 @@ "previous": "Precedente", "next": "Successiva", "page": "Pagina {page} di {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "toolbar": { diff --git a/src/messages/ja.json b/src/messages/ja.json index e2758b55..dd9224c3 100644 --- a/src/messages/ja.json +++ b/src/messages/ja.json @@ -947,7 +947,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -955,7 +959,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "catalogPackages": { @@ -1167,6 +1332,55 @@ "save": "Save changes", "saving": "Saving…", "cancel": "Cancel" + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "search": { @@ -1386,7 +1600,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -1397,7 +1646,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "tags": { "title": "Tags", @@ -1885,6 +2174,108 @@ "save": "Save permission", "saving": "Saving…", "cancel": "Cancel" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "online": { @@ -2057,7 +2448,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "transactions": { "title": "Transactions", @@ -2330,7 +2758,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio Moderation", @@ -3164,6 +3608,51 @@ "enterRoom": "Enter room", "changeOwner": "Change owner", "changeOwnerPlaceholder": "New owner username" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3230,7 +3719,54 @@ "presetApplied": "Preset applied: {preset}", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Media Library", @@ -3283,11 +3819,164 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", "upload": "Upload .nitro", "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3299,7 +3988,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3598,6 +4360,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "myDashboard": { @@ -3912,7 +5283,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "News", @@ -4348,7 +5727,38 @@ "colShow": "Show", "colDj": "DJ", "untitledShow": "Untitled show", - "userNumber": "User #{id}" + "userNumber": "User #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radio Schedule", @@ -4593,7 +6003,10 @@ "errorInvalidCredentials": "Invalid username or password", "errorInvalid2fa": "Invalid 2FA code", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Create account", @@ -4631,7 +6044,8 @@ "usernameRequired": "Username is required.", "emailRequired": "Email is required.", "passwordRequired": "Password is required.", - "passwordsDontMatch": "Passwords do not match." + "passwordsDontMatch": "Passwords do not match.", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Reset password", @@ -4846,7 +6260,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4916,6 +6394,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "toolbar": { diff --git a/src/messages/nl.json b/src/messages/nl.json index bc3a0a65..2f8dd625 100644 --- a/src/messages/nl.json +++ b/src/messages/nl.json @@ -288,7 +288,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Nieuws", @@ -724,7 +732,38 @@ "colShow": "Show", "colDj": "DJ", "untitledShow": "Naamloze show", - "userNumber": "Gebruiker #{id}" + "userNumber": "Gebruiker #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radioschema", @@ -973,7 +1012,10 @@ "errorUnverified": "Verifieer je e-mail voordat je inlogt.", "errorCaptcha": "Captcha-verificatie mislukt. Probeer het opnieuw.", "welcomeBack": "Welkom terug", - "welcomeBackSub": "Log in om verder te gaan naar {hotelName}" + "welcomeBackSub": "Log in om verder te gaan naar {hotelName}", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Account aanmaken", @@ -1012,7 +1054,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Wachtwoord resetten", @@ -1381,7 +1424,42 @@ "formUpdate": "Poll bijwerken", "formCreate": "Poll aanmaken", "toastUpdated": "Poll bijgewerkt!", - "toastCreated": "Poll aangemaakt!" + "toastCreated": "Poll aangemaakt!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min. accounts per cluster", @@ -1392,7 +1470,47 @@ "devops": { "noEmulatorErrors": "Geen emulatorfouten gevonden", "noRecentErrors": "Geen recente fouten", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "tags": { "title": "Tags", @@ -1722,6 +1840,55 @@ "reported": "Gemelde gebruiker", "reporter": "Melder" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1919,6 +2086,108 @@ "save": "Permissie opslaan", "saving": "Opslaan…", "cancel": "Annuleren" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2224,7 +2493,11 @@ "free": "Gratis", "paid": "Betaald", "bundles": "Bundels", - "limited": "Gelimiteerde edities" + "limited": "Gelimiteerde edities", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} zichtbaar)", "selected": "{count} geselecteerd", @@ -2232,7 +2505,9 @@ "results": "{count} van {total} aanbiedingen zichtbaar.", "selectionHint": "De selectie wordt gewist wanneer je de zoekopdracht of het filter wijzigt.", "noResults": "Geen aanbiedingen passen bij de huidige zoekopdracht en het filter.", - "selectVisible": "Alle zichtbare aanbiedingen selecteren" + "selectVisible": "Alle zichtbare aanbiedingen selecteren", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" }, "packages": { "openPackages": "Cataloguspakketten", @@ -2357,6 +2632,165 @@ "invalid_offer_id": "Ongeldige aanbiedingsidentificatie", "duplicate_offer_id": "Herhaalde aanbiedingsidentificatie" } + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2497,7 +2931,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "transactions": { "title": "Transacties", @@ -2770,7 +3241,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radiomoderatie", @@ -3598,6 +4085,51 @@ "enterRoom": "Kamer betreden", "changeOwner": "Eigenaar wijzigen", "changeOwnerPlaceholder": "Nieuwe eigenaar gebruikersnaam" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3664,7 +4196,54 @@ "presetApplied": "Preset applied: {preset}", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Mediabibliotheek", @@ -3746,9 +4325,162 @@ "subtitle": "Importeer assets van externe bronnen naar je hotel.", "badges": "Badges", "badgesDescription": "Importeer en beheer badge-assets van externe bronnen.", - "furni": "Meubels", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Importeer meubeldefinities, SWF-bestanden en iconen.", - "clothing": "Kleding", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Importeer kleding en wearables voor avatars.", "effects": "Effecten", "effectsDescription": "Importeer avatar-effecten en animaties.", @@ -3762,7 +4494,80 @@ "syncDescription": "Importeer automatisch ontbrekende meubels van alle geconfigureerde bronnen.", "repairIcons": "Iconen repareren", "repairIconsDescription": "Download ontbrekende icoonbestanden voor meubels die al in de database staan.", - "audit": "Cataloguscontrole", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan je catalogus op ontbrekende items, kapotte verwijzingen en items die ontbreken in kloonbronnen." }, "translations": { @@ -4602,6 +5407,615 @@ "export": "Het Git-exportverzoek kon niet worden ingepland. Controleer de exportinstellingen en de achtergrondworker.", "unknown": "De achtergrondupdate is mislukt. Bekijk de dienstdiagnostiek." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "mod": { @@ -4872,7 +6286,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4922,6 +6400,91 @@ "previous": "Vorige", "next": "Volgende", "page": "Pagina {page} van {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "toolbar": { diff --git a/src/messages/no.json b/src/messages/no.json index f6a5c412..3e0135da 100644 --- a/src/messages/no.json +++ b/src/messages/no.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Nyheter", @@ -623,7 +631,38 @@ "colShow": "Vis", "colDj": "DJ", "untitledShow": "Uten tittel show", - "userNumber": "Bruker nr. {id}" + "userNumber": "Bruker nr. {id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radioplan", @@ -801,7 +840,10 @@ "welcomeBack": "Velkommen tilbake", "welcomeBackSub": "Logg inn for å fortsette til {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Opprett konto", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Tilbakestill passord", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Lagre tillatelsen", "saving": "Lagrer …", "cancel": "Avbryt" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radiomoderasjon", @@ -3267,6 +3642,51 @@ "enterRoom": "Gå inn i rommet", "changeOwner": "Bytt eier", "changeOwnerPlaceholder": "Nytt brukernavn til eier" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Mediebibliotek", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/pl.json b/src/messages/pl.json index b9be5adf..d15d7c38 100644 --- a/src/messages/pl.json +++ b/src/messages/pl.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Wiadomości", @@ -623,7 +631,38 @@ "colShow": "Pokaż", "colDj": "DJ", "untitledShow": "Spektakl bez tytułu", - "userNumber": "Użytkownik nr {id}" + "userNumber": "Użytkownik nr {id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Harmonogram Radia", @@ -801,7 +840,10 @@ "welcomeBack": "Witaj z powrotem", "welcomeBackSub": "Zaloguj się, aby kontynuować w {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Utwórz konto", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Zresetuj hasło", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Zapisz pozwolenie", "saving": "Zapisuję…", "cancel": "Anuluj" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Moderacja radiowa", @@ -3267,6 +3642,51 @@ "enterRoom": "Wejdź do pokoju", "changeOwner": "Zmień właściciela", "changeOwnerPlaceholder": "Nowa nazwa użytkownika właściciela" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Biblioteka multimediów", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/pt.json b/src/messages/pt.json index efead4b0..5a799e84 100644 --- a/src/messages/pt.json +++ b/src/messages/pt.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Notícias", @@ -623,7 +631,38 @@ "colShow": "Mostrar", "colDj": "DJ", "untitledShow": "Programa sem título", - "userNumber": "Usuário #{id}" + "userNumber": "Usuário #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Programação de rádio", @@ -801,7 +840,10 @@ "welcomeBack": "Bem-vindo de volta", "welcomeBackSub": "Entre para continuar em {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Criar conta", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Redefinir senha", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Salvar permissão", "saving": "Salvando…", "cancel": "Cancelar" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Moderação de rádio", @@ -3267,6 +3642,51 @@ "enterRoom": "Entre na sala", "changeOwner": "Alterar proprietário", "changeOwnerPlaceholder": "Nome de usuário do novo proprietário" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Biblioteca de mídia", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/ro.json b/src/messages/ro.json index d2c4195c..6639f235 100644 --- a/src/messages/ro.json +++ b/src/messages/ro.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Știri", @@ -623,7 +631,38 @@ "colShow": "Arată", "colDj": "DJ", "untitledShow": "Emisiune fără titlu", - "userNumber": "Utilizatorul #{id}" + "userNumber": "Utilizatorul #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Program radio", @@ -801,7 +840,10 @@ "welcomeBack": "Bine ai revenit", "welcomeBackSub": "Autentifică-te pentru a continua pe {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Creați cont", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Resetează parola", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Salvați permisiunea", "saving": "Se salvează…", "cancel": "Anulează" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Moderare radio", @@ -3267,6 +3642,51 @@ "enterRoom": "Intră în cameră", "changeOwner": "Schimbați proprietarul", "changeOwnerPlaceholder": "Nume de utilizator nou proprietar" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Biblioteca media", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/ru.json b/src/messages/ru.json index 1e6f370c..18daae0b 100644 --- a/src/messages/ru.json +++ b/src/messages/ru.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Новости", @@ -623,7 +631,38 @@ "colShow": "Показать", "colDj": "Диджей", "untitledShow": "Шоу без названия", - "userNumber": "Пользователь #{id}" + "userNumber": "Пользователь #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Расписание радио", @@ -799,7 +838,10 @@ "welcomeBack": "С возвращением", "welcomeBackSub": "Войди, чтобы продолжить в {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Создать аккаунт", @@ -837,7 +879,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Сбросить пароль", @@ -1446,6 +1489,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1643,6 +1735,108 @@ "save": "Save permission", "saving": "Saving…", "cancel": "Cancel" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2072,7 +2266,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2080,7 +2278,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2437,7 +2796,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radio Moderation", @@ -3265,6 +3640,51 @@ "enterRoom": "Enter room", "changeOwner": "Change owner", "changeOwnerPlaceholder": "New owner username" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3331,7 +3751,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Media Library", @@ -3413,9 +3880,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3429,7 +4049,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3744,7 +4437,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3755,7 +4483,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3929,7 +4697,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4427,6 +5232,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4840,7 +6254,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4910,6 +6388,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/sk.json b/src/messages/sk.json index f72cef66..4789d815 100644 --- a/src/messages/sk.json +++ b/src/messages/sk.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Správy", @@ -623,7 +631,38 @@ "colShow": "Zobraziť", "colDj": "DJ", "untitledShow": "Predstavenie bez názvu", - "userNumber": "Používateľ #{id}" + "userNumber": "Používateľ #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Rozvrh rádia", @@ -801,7 +840,10 @@ "welcomeBack": "Vitaj späť", "welcomeBackSub": "Prihlás sa pre pokračovanie do {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Vytvoriť účet", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Obnoviť heslo", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Uložiť povolenie", "saving": "Ukladá sa…", "cancel": "Zrušiť" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Moderovanie rádia", @@ -3267,6 +3642,51 @@ "enterRoom": "Vstúpte do miestnosti", "changeOwner": "Zmeniť vlastníka", "changeOwnerPlaceholder": "Používateľské meno nového vlastníka" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Knižnica médií", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/sr.json b/src/messages/sr.json index 6e2f6faf..bad5d599 100644 --- a/src/messages/sr.json +++ b/src/messages/sr.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Вести", @@ -623,7 +631,38 @@ "colShow": "Схов", "colDj": "ДЈ", "untitledShow": "Унтитлед схов", - "userNumber": "Корисник #{id}" + "userNumber": "Корисник #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Радио распоред", @@ -801,7 +840,10 @@ "welcomeBack": "Добродошао назад", "welcomeBackSub": "Пријави се да наставиш ка {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Креирајте налог", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Ресетујте лозинку", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Сачувај дозволу", "saving": "Чување…", "cancel": "Откажи" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Радио Модерација", @@ -3267,6 +3642,51 @@ "enterRoom": "Уђите у собу", "changeOwner": "Промени власника", "changeOwnerPlaceholder": "Ново корисничко име власника" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Медиа Либрари", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/sv.json b/src/messages/sv.json index 3b23af63..f6e2e37d 100644 --- a/src/messages/sv.json +++ b/src/messages/sv.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Nyheter", @@ -623,7 +631,38 @@ "colShow": "Visa", "colDj": "DJ", "untitledShow": "Namnlös show", - "userNumber": "Användare #{id}" + "userNumber": "Användare #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radioschema", @@ -801,7 +840,10 @@ "welcomeBack": "Välkommen tillbaka", "welcomeBackSub": "Logga in för att fortsätta till {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Skapa konto", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Återställ lösenord", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Spara behörighet", "saving": "Sparar...", "cancel": "Avbryt" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radiomoderering", @@ -3267,6 +3642,51 @@ "enterRoom": "Gå in i rummet", "changeOwner": "Byt ägare", "changeOwnerPlaceholder": "Nytt användarnamn för ägaren" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Mediebibliotek", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/tr.json b/src/messages/tr.json index 73b41f83..579387d4 100644 --- a/src/messages/tr.json +++ b/src/messages/tr.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Haberler", @@ -623,7 +631,38 @@ "colShow": "Göster", "colDj": "DJ", "untitledShow": "İsimsiz gösteri", - "userNumber": "Kullanıcı #{id}" + "userNumber": "Kullanıcı #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Radyo Programı", @@ -801,7 +840,10 @@ "welcomeBack": "Tekrar hoş geldin", "welcomeBackSub": "{hotelName} devam etmek için giriş yap", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Hesap oluştur", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Şifreyi sıfırla", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "İzni kaydet", "saving": "Kaydediliyor…", "cancel": "İptal" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Radyo Moderasyon", @@ -3267,6 +3642,51 @@ "enterRoom": "Odaya girin", "changeOwner": "Sahibi değiştir", "changeOwnerPlaceholder": "Yeni sahibin kullanıcı adı" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Medya Kitaplığı", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": { diff --git a/src/messages/uk.json b/src/messages/uk.json index 81ad4241..0779d7c5 100644 --- a/src/messages/uk.json +++ b/src/messages/uk.json @@ -246,7 +246,15 @@ "sectionStatsLabel": "Live stats", "sectionStatsTitle": "A community that keeps growing", "sectionCommunityLabel": "Community", - "sectionCommunityTitle": "Make yourself at home" + "sectionCommunityTitle": "Make yourself at home", + "statsPhotos": "Photos", + "onlineNow": "Online now", + "exploreLabel": "Explore the hotel", + "liveUpdates": "Live updates", + "joinCtaTitle": "Ready to make yourself at home?", + "joinCtaBody": "Create your avatar, grab some furni and meet new friends — your hotel adventure starts here.", + "ctaJoin": "Join the hotel", + "browseCommunity": "Browse the community" }, "news": { "title": "Новини", @@ -623,7 +631,38 @@ "colShow": "Показати", "colDj": "діджей", "untitledShow": "Шоу без назви", - "userNumber": "Користувач #{id}" + "userNumber": "Користувач #{id}", + "contests": { + "id": { + "page": { + "Backtocontests": "← Back to contests", + "Description": "Description", + "Prize": "Prize", + "Period": "Period", + "Created": "Created", + "Updated": "Updated", + "Backtogiveaways": "← Back to giveaways", + "Prize`": "Prize:", + "Radio": "Radio", + "Amount": "Amount (", + "Youllreceive": "You'll receive", + "credits": "credits.", + "PAYPAL_CLIENT_ID": "PAYPAL_CLIENT_ID", + "PAYPAL_SECRET": "PAYPAL_SECRET", + "PAYPAL_API": "PAYPAL_API", + "RecoveryCodes": "Recovery Codes", + "StoretheseonetimeusecodesinasafeplaceEachcanbeusedonceifyouloseaccesstoyourauthenticatorapp": "Store these one-time use codes in a safe place. Each can be used once if you lose access to your authenticator app.", + "APP_KEY": "APP_KEY", + "SessionManagement": "Session Management", + "Viewactivesessionsandsignouteverywhere": "View active sessions and sign out everywhere", + "Backtothehotel": "← Back to the hotel", + "Ownedby": "Owned by", + "Thisroomhasnodescription": "This room has no description.", + "Enterthehoteltovisit": "Enter the hotel to visit", + "NobadgeshavebeenpublishedyetCheckbacksoon": "No badges have been published yet. Check back soon!" + } + } + } }, "radioSchedule": { "title": "Розклад радіо", @@ -801,7 +840,10 @@ "welcomeBack": "З поверненням", "welcomeBackSub": "Увійди, щоб продовжити в {hotelName}", "errorUnverified": "Please verify your email before signing in.", - "errorCaptcha": "Captcha verification failed. Please try again." + "errorCaptcha": "Captcha verification failed. Please try again.", + "whoIsOnline": "Who's online", + "newestCitizens": "Newest citizens", + "usersOnline": "{count} online" }, "register": { "title": "Створити акаунт", @@ -839,7 +881,8 @@ "showPassword": "Show", "hidePassword": "Hide", "accountDetails": "Account details", - "credentials": "Credentials & security" + "credentials": "Credentials & security", + "newestCitizens": "Newest citizens" }, "forgot": { "title": "Скинути пароль", @@ -1448,6 +1491,55 @@ "reported": "Reported user", "reporter": "Reporter" } + }, + "usersTable": { + "Online": "Online", + "Offline": "Offline", + "Ban": "Ban", + "users": "users", + "Permanentbanleavedurationat1": "Permanent ban: leave duration at -1.", + "Reason": "Reason", + "Durationseconds1permanent": "Duration (seconds, -1 = permanent)", + "Cancel": "Cancel", + "Adjustcurrencyfor": "Adjust currency for", + "Type": "Type", + "Credits": "Credits", + "PixelsDuckets": "Pixels (Duckets)", + "PointsDiamonds": "Points (Diamonds)", + "Amountpositivegivenegativetake": "Amount (positive = give, negative = take)", + "Apply": "Apply", + "Givebadgeto": "Give badge to", + "Badgecode": "Badge code", + "Give": "Give", + "userstotal": "users total", + "accountssharethisidentifier": "accounts share this identifier", + "staff": "staff", + "and": "… and", + "more": "more", + "EditProfile": "Edit Profile", + "Bans": "Bans", + "Badges": "Badges (", + "Rooms": "Rooms (", + "Activity": "Activity", + "AccountInfo": "Account Info", + "EditUser": "Edit User", + "Username": "Username", + "Email": "Email", + "Rank": "Rank", + "Motto": "Motto", + "Pixels": "Pixels", + "Diamonds": "Diamonds", + "Duckets": "Duckets", + "RecentMessages": "Recent Messages (", + "Norecentmessages": "No recent messages.", + "Room": "Room #", + "RecentCommands": "Recent Commands (", + "Norecentcommands": "No recent commands.", + "Nobadges": "No badges", + "Thisuserdoesntownanyrooms": "This user doesn't own any rooms.", + "Sanctionstimeline": "Sanctions timeline", + "Muteduntil": "Muted until", + "NobansmutesCFHorstaffactionsrecordedforthisuser": "No bans, mutes, CFH, or staff actions recorded for this user." } }, "bans": { @@ -1645,6 +1737,108 @@ "save": "Зберегти дозвіл", "saving": "Збереження…", "cancel": "Скасувати" + }, + "id": { + "rankEditClient": { + "AllOn": "All On", + "AllOff": "All Off", + "Rank": "Rank #", + "Level": "· Level", + "users": "users", + "General": "General", + "Emulator": "Emulator (", + "CMS": "CMS (", + "Users": "Users (", + "RankSettings": "Rank Settings", + "RankName": "Rank Name", + "Badge": "Badge", + "Prefix": "Prefix", + "PrefixColor": "Prefix Color", + "HiddenRank": "Hidden Rank", + "Hidefrompublic": "Hide from public", + "LogCommands": "Log Commands", + "Recordtoauditlog": "Record to audit log", + "RoomEffectID": "Room Effect ID", + "AutoCredits": "Auto Credits", + "AutoPixels": "Auto Pixels", + "AutoGOTW": "Auto GOTW", + "AutoPoints": "Auto Points", + "Save": "Save", + "Userswiththisrank": "Users with this rank", + "showing": "(showing", + "Nouserswiththisrank": "No users with this rank.", + "permissionsenabled": "permissions enabled", + "EnableAll": "Enable All", + "DisableAll": "Disable All", + "Off": "Off", + "Owner": "Owner", + "SaveRank": "Save Rank", + "CMSpermissionsareavailablefromrank4andabove": "CMS permissions are available from rank 4 and above.", + "assigned": "assigned", + "SelectAll": "Select All", + "DeselectAll": "Deselect All", + "Active": "Active", + "Nopermissionsmatchyoursearch": "No permissions match your search.", + "YouweresentherefromthepermissionarchiveEditrankaccessbelowthisisthelivecontrolpanel": "You were sent here from the permission archive. Edit rank access below — this is the live control panel.", + "Liveaccesscontrol": "Live access control", + "ChangesheredecidewhocanopenadminandmodpagesThepermissionarchiveisonlyforcompareexport": "Changes here decide who can open admin and mod pages. The permission archive is only for compare/export.", + "ranks": "ranks ·", + "userstotal": "users total", + "Repairnavgrants": "Repair nav grants", + "NewRank": "New Rank", + "Level`": "Level", + "Configure": "Configure", + "CreateNewRank": "Create New Rank", + "AddanewpermissionrankYoucanconfigureitspermissionsaftercreation": "Add a new permission rank. You can configure its permissions after creation.", + "Higherlevelmorebasepermissionsintheemulator": "Higher level = more base permissions in the emulator", + "Cancel": "Cancel", + "DeleteRank": "Delete Rank #", + "Thiswillpermanentlydelete": "This will permanently delete \"", + "anditsCMSroleThiscannotbeundone": "\" and its CMS role. This cannot be undone.", + "Permissionpageerror": "Permission page error", + "TherankeditorcouldnotberenderedThetechnicaldetailbelowisvisibleonlyinsidethisprotectedadminroute": "The rank editor could not be rendered. The technical detail below is visible only inside this protected admin route.", + "Reference": "Reference:", + "Tryagain": "Try again", + "rankSaved": "Rank updated", + "failed": "Failed to save rank", + "allOn": "Enabled all permissions", + "allOff": "Disabled all permissions", + "rankFallback": "Rank {id}", + "rankMeta": "ID {id} • {count} users", + "tabGeneral": "General", + "tabEmulator": "Emulator", + "tabCms": "CMS Permissions", + "tabUsers": "Users", + "rankSettings": "Rank Settings", + "rankName": "Rank Name", + "badge": "Badge Code", + "prefix": "Prefix", + "prefixColor": "Prefix Color", + "hiddenRank": "Hidden Rank", + "hideFromPublic": "Hide rank from staff page and team lists", + "logCommands": "Log Commands", + "recordToAuditLog": "Record command usage to audit logs", + "roomEffectId": "Room Effect ID", + "autoCredits": "Auto Credits / cycle", + "autoPixels": "Auto Duckets / cycle", + "autoGotw": "Auto GOTW / cycle", + "autoPoints": "Auto Diamonds / cycle", + "save": "Save Settings", + "usersWithThisRank": "Users with this rank", + "showingUsers": "Showing {count} users", + "noUsersWithThisRank": "No users assigned to this rank.", + "permissionsEnabled": "{active} / {total} permissions enabled", + "enableAll": "Enable All", + "disableAll": "Disable All", + "off": "OFF", + "on": "ON", + "owner": "OWNER", + "searchPermissionsPlaceholder": "Search permissions...", + "commands": "Commands", + "account": "Account", + "other": "Other", + "saveRank": "Save Rank" + } } }, "catalog": { @@ -2074,7 +2268,11 @@ "free": "Free", "paid": "Paid", "bundles": "Bundles", - "limited": "Limited editions" + "limited": "Limited editions", + "club_only_yes": "HC Only", + "club_only_no": "Not HC Only", + "have_offer_yes": "Has Offer", + "have_offer_no": "No Offer" }, "shown": "({count} shown)", "selected": "{count} selected", @@ -2082,7 +2280,168 @@ "results": "Showing {count} of {total} offers.", "selectionHint": "Changing the search or filter clears the selection.", "noResults": "No offers match the current search and filter.", - "selectVisible": "Select all visible offers" + "selectVisible": "Select all visible offers", + "clubOnlyFilterLabel": "HC Only Filter", + "haveOfferFilterLabel": "Has Offer Filter" + }, + "catalogItemsTable": { + "catalogItemsTable": { + "Items": "Items (", + "Table": "Table", + "Preview": "Preview", + "Move": "Move (", + "Delete": "Delete (", + "BulkPrice": "Bulk Price", + "ResetOrder": "Reset Order", + "SaveOrder": "Save Order", + "Reset": "Reset", + "SaveAll": "Save All (", + "AddItem": "Add Item", + "AddCatalogItem": "Add Catalog Item", + "Youhaveunsavedchanges": "You have unsaved changes (", + "Press": "). Press", + "CtrlS": "Ctrl+S", + "tosave": "to save.", + "Noitemsinthispage": "No items in this page.", + "AddFirstItem": "Add First Item", + "Name": "Name", + "ItemIDs": "Item IDs", + "ItemName": "Item Name", + "Price": "Price", + "Amt": "Amt", + "Status": "Status", + "Actions": "Actions", + "unnamed": "unnamed", + "Free": "Free", + "LTD": "LTD", + "EditItem": "Edit Item #", + "CatalogName": "Catalog Name", + "CatalogSettings": "Catalog Settings", + "FurnitureSettings": "Furniture Settings", + "Credits": "Credits", + "Points": "Points", + "PointsType": "Points Type", + "Amount": "Amount", + "Order": "Order", + "OfferID": "Offer ID", + "LimitedSells": "Limited Sells", + "LimitedStack": "Limited Stack", + "HaveOffer": "Have Offer", + "Yes": "Yes", + "ClubOnly": "Club Only", + "ExtraData": "Extra Data", + "SongDisk": "Song Disk", + "SelectasoundtracktoplaywhenthisitemisusedingameUploadedfrom": "Select a soundtrack to play when this item is used in-game. Uploaded from", + "adminsounds": "/admin/sounds", + "Identity": "Identity", + "BaseID": "Base ID", + "SpriteID": "Sprite ID", + "Type": "Type", + "sFloor": "s (Floor)", + "iWall": "i (Wall)", + "eEffect": "e (Effect)", + "bBadge": "b (Badge)", + "rRobot": "r (Robot)", + "hHabboClub": "h (Habbo Club)", + "pPet": "p (Pet)", + "Dimensions": "Dimensions", + "Width": "Width", + "Length": "Length", + "StackHeight": "Stack Height", + "Interaction": "Interaction", + "InteractionType": "Interaction Type", + "InteractionModes": "Interaction Modes", + "Permissions": "Permissions", + "Extra": "Extra", + "VendingIDs": "Vending IDs", + "CustomParams": "Custom Params", + "EffectIDMale": "Effect ID Male", + "EffectIDFemale": "Effect ID Female", + "ClothingOnWalk": "Clothing On Walk", + "Save": "Save", + "Cancel": "Cancel", + "Move`": "Move", + "itemstoanotherpage": "item(s) to another page", + "TargetPage": "Target Page", + "MoveItems": "Move Items", + "MoveItemtoanotherpage": "Move Item to another page", + "Suggestionsbasedonpreviousmovesforsimilaritems": "Suggestions based on previous moves for similar items.", + "MoveItem": "Move Item", + "BulkPriceUpdate": "Bulk Price Update", + "Field": "Field", + "Operation": "Operation", + "Settovalue": "Set to value", + "Addvalue": "Add value", + "Changebypercentage": "Change by percentage", + "Usenegativevaluestodecreaseeg20for20": "Use negative values to decrease (e.g. -20 for -20%)", + "Usenegativevaluestosubtract": "Use negative values to subtract", + "Apply": "Apply", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "itemsCount": "Items ({count})" + } + }, + "catalogTranslateTab": { + "TranslateItemNames": "Translate Item Names", + "EditthepublicnameanddescriptionoffurnitureitemsSavingwillupdate": "Edit the public name and description of furniture items. Saving will update:", + "items_basename": "items_base (name)", + "catalogNameauto": "catalogName (auto)", + "FurnitureDatajsonnamedesc": "FurnitureData.json (name + desc)", + "itemsmissingfromFurnitureDatajsonwillbeautoinsertedonsave": "item(s) missing from FurnitureData.json — will be auto-inserted on save", + "Suggest": "Suggest", + "Reset": "Reset", + "SaveAll": "Save All (", + "All": "All (", + "Missing": "Missing (", + "Modified": "Modified (", + "Noitemstotranslateinthispage": "No items to translate in this page.", + "Noitemsmatchthecurrentfilter": "No items match the current filter.", + "Type": "Type", + "ItemName": "Item Name", + "PublicName": "Public Name", + "Description": "Description", + "Status": "Status", + "catalog": "catalog:", + "Modified`": "Modified", + "MissingfromFurnitureDatajson": "Missing from FurnitureData.json", + "Willbeautoinsertedonsave": "Will be auto-inserted on save", + "InFurnitureDatajson": "In FurnitureData.json", + "Catalogmaintenance": "Catalog maintenance", + "Forcethefurnituretablesto100consistencywithFurnitureDatajsonEveryactionrunsinsideadatabasetransactionandrollsbackonerror": "Force the furniture tables to 100% consistency with FurnitureData.json. Every action runs inside a database transaction and rolls back on error.", + "Refresh": "Refresh", + "Currenthealth": "Current health", + "Fixsprite_id": "Fix sprite_id", + "Fixcatalogoffer_id": "Fix catalog offer_id", + "Removeduplicatesitemscatalog": "Remove duplicates (items + catalog)", + "ReconcileFurnitureDataDB": "Reconcile FurnitureData ↔ DB", + "Fixemulatorconstraints": "Fix emulator constraints", + "Alignitems_baseIDstoFurnitureData": "Align items_base IDs to FurnitureData", + "Moveseveryitems_baseidtotheFurnitureDataspriteidsourceoftruthRewritesallreferencingtablesPreviewfirst": "Moves every items_base.id to the FurnitureData sprite id (source of truth). Rewrites all referencing tables. Preview first.", + "Previewchanges": "Preview changes", + "PlannedIDmoves": "Planned ID moves:", + "Newitemstoinsert": "New items to insert:", + "Skippedidoccupied": "Skipped (id occupied):", + "Applyalignment": "Apply alignment", + "Fixeverything": "Fix everything", + "RunsspritefixofferfixreconcilededupandIDalignmentinorderHeavyoperationmakeabackupfirst": "Runs sprite fix, offer fix, reconcile, dedup and ID alignment in order. Heavy operation — make a backup first.", + "Alsomergeduplicatecatalogpagesdoublelinks": "Also merge duplicate catalog pages (double links)", + "Fixeverythingnow": "Fix everything now", + "BulkImport": "Bulk Import", + "BulkImportItems": "Bulk Import Items", + "Itemlist": "Item list", + "Format": "Format:", + "base_idcreditspointspoints_type": "base_id, credits, points, points_type", + "Only": ". Only", + "base_id": "base_id", + "isrequiredotherfieldsdefaultto0Separatorscommaspaceorsemicolon": "is required; other fields default to 0. Separators: comma, space, or semicolon.", + "valid": "valid", + "invalid": "invalid", + "Line": "Line", + "BaseID": "Base ID", + "Credits": "Credits", + "Points": "Points", + "Cancel": "Cancel", + "Import": "Import", + "item": "item" } }, "shop": { @@ -2439,7 +2798,23 @@ "statusDisabled": "Disabled", "campaignMeta": "#{id} · {days} days · {rewards} rewards", "startsAt": "Starts: {date}", - "locksExpired": "Expired days are locked" + "locksExpired": "Expired days are locked", + "page": { + "Couldnotloadsomecalendardatadatabaseunavailable": "Could not load some calendar data (database unavailable).", + "Rank": "Rank", + "Discord": "Discord", + "min": "/min", + "Couldnotloadsomeshopdatadatabaseunavailable": "Could not load some shop data (database unavailable).", + "Couldnotloadsubscriptionsdatabaseunavailable": "Could not load subscriptions (database unavailable).", + "Normal": "Normal", + "BuilderClub": "Builder Club", + "Error": "Error", + "Somethingwentwrong": "Something went wrong", + "ThehotelranintoanunexpectederrorPleasetryagainifitkeepshappeningcontactstaff": "The hotel ran into an unexpected error. Please try again — if it keeps happening, contact staff.", + "Tryagain": "Try again", + "Reference": "Reference:", + "Error`": "Error:" + } }, "radio": { "title": "Модерація радіо", @@ -3267,6 +3642,51 @@ "enterRoom": "Увійти в кімнату", "changeOwner": "Змінити власника", "changeOwnerPlaceholder": "Нове ім'я власника" + }, + "id": { + "roomEditForm": { + "RoomDetails": "Room Details", + "Name": "Name", + "Description": "Description", + "State": "State", + "Open": "Open", + "Locked": "Locked", + "Password": "Password", + "Invisible": "Invisible", + "MaxUsers": "Max Users", + "SaveChanges": "Save Changes", + "DeleteRoom": "Delete Room", + "QuickActions": "Quick Actions", + "Owner": "Owner", + "CurrentUsers": "Current Users", + "RCONCommands": "RCON Commands", + "KickAll": "Kick All", + "Lock": "Lock", + "Unlock": "Unlock", + "Reload": "Reload", + "users": "users", + "Owner`": "Owner:", + "Furniture": "Furniture", + "Edit": "Edit", + "AccessState": "Access State", + "Score": "Score", + "Category": "Category", + "roomstotal": "rooms total", + "Edit`": "Edit:", + "View": "View", + "Refresh": "Refresh", + "AutorefreshON": "Auto-refresh ON", + "AutorefreshOFF": "Auto-refresh OFF", + "Every": "Every", + "Lastupdated": "Last updated:", + "Search": "Search", + "settings": "settings", + "changed": "changed", + "SaveSync": "Save & Sync", + "clear": "clear", + "Nosettingsfound": "No settings found.", + "Perpage": "Per page" + } } }, "emailTemplates": { @@ -3333,7 +3753,54 @@ "saved": "Theme settings saved.", "typographyLayout": "Typography and layout", "font": "Font", - "borderRadius": "Corner radius" + "borderRadius": "Corner radius", + "page": { + "Themesavedaspreset": "Theme saved as preset.", + "Appliedtheme": "Applied theme “", + "Themerenamed": "Theme renamed.", + "Themedeleted": "Theme deleted.", + "Yoursavedthemes": "Your saved themes", + "SavethecurrentconfigurationasanamedpresetthenloaditanytimePerfectforkeepingmultiplebrandthemesreadytoswitch": "Save the current configuration as a named preset, then load it anytime. Perfect for keeping multiple brand themes ready to switch.", + "Savecurrenttheme": "Save current theme", + "Nosavedthemesyetsaveoneabove": "No saved themes yet — save one above.", + "Load": "Load", + "Delete": "Delete", + "Lightmode": "☀ Light mode", + "ThesecolorsareusedwhenvisitorsviewyoursiteinlightmodedefaultMakesurebodytextcontrastswellwithboththepagebackgroundandcardsurface": "These colors are used when visitors view your site in light mode (default). Make sure body text contrasts well with both the page background and card surface.", + "Pagetextcolors": "Page & text colors", + "BackgroundssurfacesandtextcolorsTextcolorsmustcontrastwiththeirbackgroundsforreadability": "Backgrounds, surfaces, and text colors. Text colors must contrast with their backgrounds for readability.", + "Buttonslinks": "Buttons & links", + "ButtonbackgroundstextonbuttonsandlinkcolorsButtontextmustcontrastwithitsbuttonbackground": "Button backgrounds, text on buttons, and link colors. Button text must contrast with its button background.", + "Gradients": "Gradients", + "CardheaderandherosectiongradientTheseblendfromstartendacrossheadingsandbanners": "Card header and hero section gradient. These blend from start → end across headings and banners.", + "AdminpanelHK": "🛠 Admin panel (HK)", + "OverridecolorsfortheHousekeepingadminpanelTheseapplyacrossbothlightanddarkmodesLeaveemptytouseautoderiveddefaults": "Override colors for the Housekeeping admin panel. These apply across both light and dark modes. Leave empty to use auto-derived defaults.", + "Darkmode": "🌙 Dark mode", + "ThesecolorsareusedwhenvisitorsswitchtodarkmodeDarkbackgroundsneedlightertextforgoodcontrast": "These colors are used when visitors switch to dark mode. Dark backgrounds need lighter text for good contrast.", + "Duplicate": "Duplicate", + "Editing": "Editing:", + "Light": "☀ Light", + "Dark": "☾ Dark", + "SaveThemeValues": "Save Theme Values", + "Colors": "Colors (", + "mode": "mode)", + "OnlyvaluesyousethereoverridetheparentscopeLeaveemptytoinherit": "Only values you set here override the parent scope. Leave empty to inherit.", + "TogglevisibilityofblocksinthisscopeHiddenblocksuse": "Toggle visibility of blocks in this scope. Hidden blocks use", + "displaynone": "display: none", + "LayoutSettings": "Layout Settings", + "ControlspacingwidthandgridsettingsforthisscopeValuesareappliedasCSScustomproperties": "Control spacing, width, and grid settings for this scope. Values are applied as CSS custom properties.", + "EffectsTransitions": "Effects & Transitions", + "Controlshadowsbordersandanimationtimingforthisscope": "Control shadows, borders, and animation timing for this scope.", + "MediaBackgrounds": "Media & Backgrounds", + "Setcustomlogosbackgroundimagesandbackgroundpropertiesforthisscope": "Set custom logos, background images, and background properties for this scope.", + "CustomCSS": "Custom CSS", + "AddcustomCSSthatapplieswithinthisscopeUse": "Add custom CSS that applies within this scope. Use", + "asaplaceholderforthescopeselectoreg": "as a placeholder for the scope selector (e.g.", + "contentcard": "& .content-card", + "border2pxsolidred": "border: 2px solid red;", + "CustomHTML": "Custom HTML", + "AddcustomHTMLthatinjectsintothepageforthisscopeUseforcustombannersscriptsorcontentblocks": "Add custom HTML that injects into the page for this scope. Use for custom banners, scripts, or content blocks." + } }, "media": { "title": "Медіатека", @@ -3415,9 +3882,162 @@ "subtitle": "Import assets from external sources into your hotel.", "badges": "Badges", "badgesDescription": "Import and manage badge assets from external sources.", - "furni": "Furni", + "furni": { + "nitroEditorDialog": { + "EditNitro": "Edit Nitro", + "dir": "dir", + "layers": "layers", + "colors": "colors", + "anim": "anim", + "Visual": "Visual", + "JSON": "JSON", + "Dimensions": "Dimensions", + "Xwidth": "X (width)", + "Ydepth": "Y (depth)", + "Zheight": "Z (height)", + "Directions": "Directions", + "8active": "/ 8 active", + "ChoosetheavailablerotationsKeepatleastonedirectionactive": "Choose the available rotations. Keep at least one direction active.", + "Interaction": "Interaction", + "CanStandOn": "Can Stand On", + "CanSitOn": "Can Sit On", + "CanLayOn": "Can Lay On", + "Autodetectfromname": "Auto-detect from name", + "Clicklimit": "Click limit:", + "Modes": "Modes:", + "Types": "Types", + "VisualizationType": "Visualization Type", + "LogicType": "Logic Type", + "Layer": "Layer", + "ZIndex": "Z-Index", + "Alpha": "Alpha", + "Ink": "Ink", + "Colori": "Colori", + "ColorVariant": "Color Variant #", + "Unsavedchanges": "Unsaved changes", + "Reset": "Reset", + "Cancel": "Cancel", + "Save": "Save", + "Editfurniture": "Edit furniture", + "Wallposition": "Wall position", + "Format": "Format:", + "Rotation07": "Rotation (0-7)", + "Extradata": "Extra data", + "Itemstatedataegdicevaluestickynotetextcolor": "Item state/data (e.g. dice value, sticky note text, color)", + "autoDetected": "Auto-detected", + "loadFailed": "Failed to load furniture data", + "networkErrorLoad": "Network error loading furniture data", + "invalidJsonSwitchTabs": "Invalid JSON; please fix errors before switching tabs.", + "resetToOriginal": "Reset to original", + "invalidJson": "Invalid JSON format", + "saveFailed": "Failed to save furniture data" + }, + "upload": { + "uploadFurniClient": { + "FurnitureDetails": "Furniture Details", + "Classname": "Classname *", + "Name": "Name *", + "Description": "Description", + "Type": "Type *", + "Floors": "Floor (s)", + "Walli": "Wall (i)", + "Widthx": "Width (x)", + "Lengthy": "Length (y)", + "Interaction": "Interaction", + "Canstandon": "Can stand on", + "Cansiton": "Can sit on", + "Canlayon": "Can lay on", + "GenerateSQL": "Generate SQL", + "Customparams": "Custom params", + "Files": "Files", + "nitrofile": ".nitro file *", + "Thenitrobundlefilemax50MB": "The .nitro bundle file (max 50MB)", + "IconPNG": "Icon (PNG)", + "Optional64x64PNGiconmax2MBLeaveemptytoskip": "Optional 64x64 PNG icon (max 2MB). Leave empty to skip.", + "ImportSuccessful": "Import Successful", + "Classname`": "Classname:", + "ItemID": "Item ID:", + "CatalogID": "Catalog ID:", + "SQLfile": "SQL file:", + "Warnings": "Warnings:", + "ImportAnother": "Import Another", + "Back": "Back", + "Room": "Room #", + "Owner": "· Owner:", + "Reload": "Reload", + "KickAll": "Kick All", + "Alltypes": "All types", + "Flooronly": "Floor only", + "Wallonly": "Wall only", + "Allowners": "All owners", + "Flat": "Flat", + "Grouped": "Grouped", + "selected": "selected", + "Clear": "Clear", + "Deleteselected": "Delete selected", + "Name`": "Name", + "Type`": "Type", + "Position": "Position", + "Rot": "Rot", + "Owner`": "Owner", + "Actions": "Actions", + "Thisroomhasnofurniture": "This room has no furniture.", + "Noitemsmatchyourfilters": "No items match your filters.", + "Showing": "Showing", + "Furniture": "Furniture", + "Count": "Count", + "Action": "Action", + "Noitems": "No items.", + "Deleteall": "Delete all", + "errorClassname": "Classname required", + "errorNitroRequired": ".nitro file required", + "errorNitroSize": ".nitro file must be under 50MB" + } + } + }, "furniDescription": "Import furniture definitions, SWF files, and icons.", - "clothing": "Clothing", + "clothing": { + "importClothingClient": { + "libraries": "libraries", + "onthispage": "on this page", + "missinghere": "missing here", + "Import": "Import", + "selected": "selected", + "Nolibrariesfound": "No libraries found", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "sets": "sets", + "Nosetsfound": "No sets found", + "Libraries": "Libraries", + "Sets": "Sets", + "None": "None", + "Enabledretiredsourcesareexcludedfromcountsandimports": "Enabled (retired sources are excluded from counts and imports)", + "Save": "Save", + "Cancel": "Cancel", + "CloneSources": "Clone Sources", + "AddSource": "Add Source", + "NosourcesyetAddonetostartcloningfurnifromanotherhotel": "No sources yet. Add one to start cloning furni from another hotel.", + "total": "total", + "present": "present", + "clonable": "clonable", + "Clone": "Clone", + "Cloneallclonable": "Clone all clonable (", + "Nofurnifound": "No furni found", + "Rev": "Rev:", + "Present": "Present", + "Loadingsources": "Loading sources…", + "Selectasourceabovetobrowseandclonefurni": "Select a source above to browse and clone furni.", + "effects": "effects", + "imported": "imported", + "available": "available", + "Noeffectsfound": "No effects found", + "pets": "pets", + "missing": "missing", + "Nopetsfound": "No pets found" + } + }, "clothingDescription": "Import clothing and wearables for avatars.", "effects": "Effects", "effectsDescription": "Import avatar effects and animations.", @@ -3431,7 +4051,80 @@ "syncDescription": "Automatically import missing furniture from all configured sources.", "repairIcons": "Repair Icons", "repairIconsDescription": "Download any missing icon files for furniture already in the database.", - "audit": "Catalog Audit", + "audit": { + "auditClient": { + "Repairmissingicons": "Repair missing icons", + "Repairmissingnitro": "Repair missing .nitro", + "GeneratecatalogSQL": "Generate catalog SQL", + "ApplySQLtodatabase": "Apply SQL to database", + "RepairFurnitureDatajsonaddmissingdedupe": "Repair FurnitureData.json (add missing + dedupe)", + "CheckFurnitureDatajsonforspriteIdconflicts": "Check FurnitureData.json for spriteId conflicts", + "Repairstructuralissuesorphanedrefsduplicates": "Repair structural issues (orphaned refs + duplicates)", + "Cancel": "Cancel", + "items_baseentries": "items_base entries", + "catalog_itemsentries": "catalog_items entries", + "Errors": "Errors", + "Warnings": "Warnings", + "itemswithoutcatalogentry": "items without catalog entry", + "orphanedcatalogreferences": "orphaned catalog references", + "itemswithoutnitro": "items without .nitro", + "itemswithouticon": "items without icon", + "duplicateclassnames": "duplicate classnames", + "itemsmissingfromclonesources": "items missing from clone sources", + "itemscantberepairedlegacybroken": "item(s) can't be repaired (legacy/broken)", + "Iconrepair": "Icon repair:", + "fixed": "fixed", + "failed": "failed", + "skipped": "skipped", + "stillmissing": "still missing", + "Nitrorepair": "Nitro repair:", + "CatalogSQL": "Catalog SQL:", + "statementsgenerated": "statement(s) generated", + "applied": "applied", + "Downloadsql": "Download .sql", + "FurnitureDatarepair": "FurnitureData repair:", + "added": "added", + "duplicatesremoved": "duplicates removed", + "spriteIdconflictsfixed": "spriteId conflicts fixed", + "Structuralrepair": "Structural repair:", + "orphanedrowsremoved": "orphaned rows removed", + "cleaned": "cleaned", + "classnamesmerged": "classname(s) merged", + "duplicaterowsremoved": "duplicate rows removed", + "referencesremapped": "reference(s) remapped", + "Issues": "Issues (", + "Missingfromsources": "Missing from sources (", + "Unrepairablelegacy": "Unrepairable (legacy) (", + "source": "source:", + "missing": "missing", + "Noissuesfound": "No issues found", + "Yourcatalogisclean": "Your catalog is clean!", + "RunAgain": "Run Again", + "Runafullaudittocheckformissingcatalogentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Run a full audit to check for missing catalog entries, broken references, missing files, and items available from clone sources.", + "results": "results", + "imported": "imported", + "available": "available", + "Import": "Import", + "selected": "selected", + "Nobadgesfound": "No badges found", + "Trysearchingbybadgenameorcode": "Try searching by badge name or code", + "Imported": "Imported", + "Page": "Page", + "Prev": "← Prev", + "Next": "Next →", + "EditBadge": "Edit Badge —", + "Name": "Name", + "Description": "Description", + "Save": "Save", + "Processed": "Processed", + "items": "items", + "RepairComplete": "Repair Complete", + "Downloads": "Downloads:", + "Skippedalreadyhadicon": "Skipped (already had icon):", + "Failed": "Failed:", + "ScansallfurnitureinthedatabaseanddownloadsanymissingiconfilesIconsareextractedfromlocalnitrobundlesordownloadedfromconfiguredclonesources": "Scans all furniture in the database and downloads any missing icon files. Icons are extracted from local .nitro bundles or downloaded from configured clone sources." + } + }, "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { @@ -3746,7 +4439,42 @@ "formUpdate": "Update poll", "formCreate": "Create poll", "toastUpdated": "Poll updated!", - "toastCreated": "Poll created!" + "toastCreated": "Poll created!", + "id": { + "pollQuestions": { + "Question": "Question", + "Type": "Type", + "SingleChoice": "Single Choice", + "MultipleChoice": "Multiple Choice", + "FreeText": "Free Text", + "SortOrder": "Sort Order", + "Optionsoneperline": "Options (one per line)", + "Cancel": "Cancel", + "votes": "votes (", + "freetextresponses": "free-text responses", + "totalvote": "total vote", + "CtrlEntertosendYourreplywillbemarkedasstaff": "Ctrl+Enter to send. Your reply will be marked as staff.", + "Ticketclosed": "Ticket closed", + "Actions": "Actions", + "Status": "Status", + "Priority": "Priority", + "Assignto": "Assign to", + "Unassigned": "Unassigned", + "Assigntome": "Assign to me", + "Requester": "Requester", + "Rank": "Rank", + "Registered": "Registered", + "Details": "Details", + "Created": "Created", + "Closed": "Closed", + "Messages": "Messages", + "NewTemplate": "New Template", + "Title": "Title", + "Category": "Category", + "Content": "Content", + "Notemplatesyet": "No templates yet." + } + } }, "multiAccounts": { "minAccounts": "Min accounts per cluster", @@ -3757,7 +4485,47 @@ "devops": { "noEmulatorErrors": "No emulator errors found", "noRecentErrors": "No recent errors", - "cmsErrors": "CMS error center" + "cmsErrors": "CMS error center", + "page": { + "Database": "Database", + "Latency": "Latency:", + "Redis": "Redis", + "Cacheratelimitssessions": "Cache / rate limits / sessions", + "Emulator": "Emulator", + "Version": "Version:", + "OnlineUsers": "Online Users", + "LiverosterinCommandoCentrum": "Live roster in CommandoCentrum", + "Errors24h": "Errors (24h)", + "Emulatorerrorstoday": "Emulator errors today", + "RecentEmulatorErrors": "Recent Emulator Errors", + "CMSerrorcenter": "CMS error center", + "totalerrorsshowingpage": "total errors — showing page", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "DevOps": "DevOps", + "Server": "Server", + "Browser": "Browser", + "bashcmsinstall": "bash cms install", + "bashcmsupdate": "bash cms update", + "ExportCSV": "Export CSV", + "ExportJSON": "Export JSON", + "Advancedkeyvalue": "Advanced key / value", + "Rawwebsite_settingsrowsPreferthegroupedformaboveforcommonkeys": "Raw website_settings rows. Prefer the grouped form above for common keys.", + "Showkeysalreadyintheform": "Show keys already in the form", + "Addoverwrite": "Add / overwrite", + "Nomatchingsettings": "No matching settings", + "Save": "Save", + "Export": "Export", + "keys": "keys", + "readonly": "read-only", + "commentspreserved": "comments preserved", + "Thisfileisreadonly": "This file is read-only.", + "CommentsarepreservedsavingonlypatcheschangedvaluelinesIfakeyusesanonstandardformatandcannotbepatchedinplacethefileisreserializedcommentslostandyouwillbewarned": "Comments are preserved: saving only patches changed value lines. If a key uses a non-standard format and cannot be patched in-place, the file is reserialized (comments lost) and you will be warned.", + "Parseerror": "Parse error:", + "Noentries": "No entries.", + "Prev": "Prev" + } }, "helpTickets": { "title": "Help center tickets", @@ -3931,7 +4699,44 @@ "formReadForum": "Read forum", "formPostMessages": "Post messages", "formPostThreads": "Post threads", - "formModForum": "Moderate forum" + "formModForum": "Moderate forum", + "id": { + "page": { + "0Normal": "0 — Normal", + "1Locked": "1 — Locked", + "2Exclusive": "2 — Exclusive", + "0Off": "0 — Off", + "EVERYONE": "EVERYONE", + "OWNER": "OWNER", + "ADMIN": "ADMIN", + "MEMBER": "MEMBER", + "NONE": "NONE", + "ADMINS": "ADMINS", + "Position": "Position", + "Type": "Type", + "Badge": "Badge", + "Credits": "Credits", + "Pixels": "Pixels", + "Points": "Points", + "Item": "Item", + "BadgeCode": "Badge Code", + "Description": "Description", + "Cancel": "Cancel", + "Add": "Add", + "credits": "credits", + "pixels": "pixels", + "points": "points", + "NewType": "New Type", + "Name": "Name", + "Slug": "Slug", + "Color": "Color", + "Rankminimo0tutti": "Rank minimo (0 = tutti)", + "0Tutti3Mod4Staff6Admin": "0=Tutti, 3=Mod+, 4=Staff+, 6=Admin+", + "NoeventtypesyetCreateyourfirstoneabove": "No event types yet. Create your first one above.", + "Rank": "Rank", + "UserID": "User ID" + } + } }, "items": { "title": "Items base", @@ -4429,6 +5234,615 @@ "export": "The Git export request could not be queued. Check the export configuration and background worker.", "unknown": "The background update failed. Check the service diagnostics." } + }, + "studio": { + "studioClient": { + "Studio": "Studio", + "furnidata": "furnidata", + "results": "results", + "incatalog": "in catalog", + "missingnitro": "missing nitro", + "total": "total", + "present": "present", + "teimporteren": "te importeren", + "Catalog": "Catalog", + "official": "(official)", + "Alltypes": "All types", + "Flooritems": "Floor items", + "Wallitems": "Wall items", + "Allstatuses": "All statuses", + "Notimported": "Not imported", + "Imported": "Imported", + "Incatalog": "In catalog", + "Missingnitro": "Missing nitro", + "Missingfurnidata": "Missing furnidata", + "Missingcatalogentry": "Missing catalog entry", + "Defaultorder": "Default order", + "NameAZ": "Name A–Z", + "ClassnameAZ": "Classname A–Z", + "Category": "Category", + "Importedfirst": "Imported first", + "Notimportedfirst": "Not imported first", + "Resetfilters": "Reset filters", + "nonitro": "no nitro", + "Importoptions": "Import options", + "Translation": "· Translation", + "Speed": "Speed", + "1gentle": "1 (gentle)", + "4recommended": "4 (recommended)", + "12turbo": "12 (turbo)", + "Translate": "Translate", + "Languages": "Languages", + "All": "All", + "None": "None", + "Translateentirecatalog": "Translate entire catalog", + "Defaultforfutureimports": "Default for future imports", + "selectedinthisview": "selected in this view", + "Clear": "Clear", + "Importselected": "Import selected (", + "RebuildNitro": "Rebuild Nitro (", + "Delete": "Delete (", + "SomeselectedfurnitureishiddenbyyourfiltersActionsapplytothevisibleselection": "Some selected furniture is hidden by your filters. Actions apply to the visible selection.", + "Tryagain": "Try again", + "Nonitro": "No nitro", + "Nofurnidata": "No furnidata", + "Nocatalog": "No catalog", + "New": "New", + "Name": "Name", + "Classname": "Classname", + "Type": "Type", + "Status": "Status", + "Actions": "Actions", + "Loadingmore": "Loading more…", + "Scrollformore": "Scroll for more", + "Endofresults": "End of results", + "Deleteimportedfurni": "Delete imported furni", + "Thispermanentlyremoves": "This permanently removes", + "fromitems_baseandthecatalogplusitsassetfiles": "from items_base and the catalog, plus its asset files.", + "Cancel": "Cancel", + "Delete`": "Delete", + "imported": "imported", + "failed": "failed", + "Retryfailed": "Retry failed (", + "Closesummary": "Close summary", + "Stopimport": "Stop import", + "Viewitemdetails": "View item details (", + "Showing": "Showing", + "items": "items", + "Categories": "Categories", + "Allcategories": "All categories", + "Nomatchingcategories": "No matching categories.", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Organizeimports": "Organize imports", + "1Select2Review3Import": "1. Select → 2. Review → 3. Import", + "Source": "Source:", + "Destination": "Destination:", + "localcatalogfurnidatanitroandicons": "local catalog, furnidata, .nitro and icons", + "Translation`": "Translation:", + "Selection": "Selection:", + "furnitureitems": "furniture items", + "Checkingsourcefiles": "Checking source files…", + "checked": "checked", + "Retrysourcecheck": "Retry source check", + "SomesourcescouldnotbeverifiedTheimportwillstilltrytodownloadtheirfiles": "Some sources could not be verified. The import will still try to download their files.", + "Sourcefilesnotfoundbypreliminarycheck": "Source files not found by preliminary check:", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "InspectionisincompleteCloseandretrybeforeimporting": "Inspection is incomplete. Close and retry before importing.", + "readytoimport": "ready to import ·", + "alreadyinSQLcompletemissingdata": "already in SQL (complete missing data) ·", + "conflicts": "conflicts ·", + "sourcefilewarnings": "source file warnings", + "SomelocalfilescouldnotbeverifiedReviewtheitemdetailsbeforecontinuing": "Some local files could not be verified. Review the item details before continuing.", + "Validatingfile": "Validating file…", + "Onlythe": "Only the", + "eligibleitemsbelowwillbesubmittedExistingfurniturekeepsitslocalIDsSQLsettingsandcatalogoffersMissingassetsandcatalogentriesarecompletedfurnidataisrefreshedConflictsareexcluded": "eligible items below will be submitted. Existing furniture keeps its local IDs, SQL settings and catalog offers. Missing assets and catalog entries are completed; furnidata is refreshed. Conflicts are excluded.", + "AutomaticcategoriesandpricesbelowareestimatesSourcerulesmayoverridethemfinalresultsappearintheimportsummary": "Automatic categories and prices below are estimates. Source rules may override them; final results appear in the import summary.", + "credits": "credits +", + "points": "points", + "Previousitems": "Previous items", + "Page": "Page", + "Nextitems": "Next items" + }, + "sync": { + "catalogGitConfiguration": { + "Giteaconnectionsettings": "Gitea connection settings", + "ConnectyourselfhostedGitearepositoryoverHTTPSTheCMSmanagesitsowncheckoutnoGitspecificenvsettingsareneeded": "Connect your self-hosted Gitea repository over HTTPS. The CMS manages its own checkout; no Git-specific .env settings are needed.", + "Provider": "Provider:", + "Giteaselfhosted": "Gitea self-hosted", + "RepositoryURL": "Repository URL", + "Branch": "Branch", + "Giteausername": "Gitea username", + "Giteaaccesstoken": "Gitea access token", + "ThetokenisstoredencryptedandisneverreturnedtothebrowserChangingrepositoryorusernamerequiresenteringthetokenagain": "The token is stored encrypted and is never returned to the browser. Changing repository or username requires entering the token again.", + "Automaticallyexportcatalogchanges": "Automatically export catalog changes", + "Testconnection": "Test connection", + "SyncAllSources": "Sync All Sources", + "Scanconfiguredsourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan configured sources and automatically import any furniture that is not yet present in your hotel.", + "CloneSources": "Clone Sources", + "Scanallconfiguredclonesourcesandautomaticallyimportanyfurniturethatisnotyetpresentinyourhotel": "Scan all configured clone sources and automatically import any furniture that is not yet present in your hotel.", + "OfficialFurnidata": "Official Furnidata", + "ScantheofficialHabbofurnidataandautomaticallyimportanyfurniturethatyourhoteldoesnthaveyet": "Scan the official Habbo furnidata and automatically import any furniture that your hotel doesn't have yet.", + "CatalogAudit": "Catalog Audit", + "Scanyourentirefurniturecatalogformissingentriesbrokenreferencesmissingfilesanditemsavailablefromclonesources": "Scan your entire furniture catalog for missing entries, broken references, missing files, and items available from clone sources.", + "Nitrocleanup": "Nitro cleanup", + "Scanthenitrodirectoriesforfakebundlesnomatchingfurnitureandbrokenbundlesunparseableandremovethem": "Scan the nitro directories for fake bundles (no matching furniture) and broken bundles (unparseable) and remove them.", + "RepairMissingIcons": "Repair Missing Icons", + "ScanallexistingfurnitureanddownloadanymissingiconfilesIconsareextractedfromlocalnitrobundlesorfetchedfromconfiguredclonesources": "Scan all existing furniture and download any missing icon files. Icons are extracted from local .nitro bundles or fetched from configured clone sources.", + "UploadnitroFurniture": "Upload .nitro Furniture", + "UploadanitrobundleandoptionalicontoimportfurnitureintothehotelThedatabaseentrycatalogitemandFurnitureDatajsonwillbeupdatedautomatically": "Upload a .nitro bundle and optional icon to import furniture into the hotel. The database entry, catalog item, and FurnitureData.json will be updated automatically.", + "NewBanner": "New Banner", + "Title": "Title", + "Subtitle": "Subtitle", + "ImageURL": "Image URL", + "LinkURL": "Link URL", + "Color": "Color", + "StartDate": "Start Date", + "EndDate": "End Date", + "Active": "Active", + "Order": "Order", + "Cancel": "Cancel", + "Nobannersyet": "No banners yet.", + "Scheduled": "Scheduled" + } + }, + "nitroQualityPanel": { + "Scale": "Scale", + "sprites": "sprites ·", + "animationdefinitionsdirections": "animation definitions · directions", + "ThisbundlecontainsnospritesatthisscaleMissingscale32doesnotbyitselfmeanthefurnitureisunusable": "This bundle contains no sprites at this scale. Missing scale 32 does not by itself mean the furniture is unusable.", + "Sprite": "Sprite", + "Thisspritecouldnotberendered": "This sprite could not be rendered.", + "InspectthesavedbundleatbothscalesPreviewsshowindividualspritesnottheassembledfurnitureoranimationplayback": "Inspect the saved bundle at both scales. Previews show individual sprites, not the assembled furniture or animation playback.", + "Recheck": "Recheck", + "Checkingscalesandtexturereferences": "Checking scales and texture references…", + "Generatescale32from64": "Generate scale 32 from 64", + "AddsderivedartworkusingnearestneighborreductionExistingscale32ispreservedPreviewusesthesavedbundleandshowsonespriteatitsoriginalpixelsize": "Adds derived artwork using nearest-neighbor reduction. Existing scale 32 is preserved. Preview uses the saved bundle and shows one sprite at its original pixel size.", + "Saveorresetyourpendingeditsfirst": "Save or reset your pending edits first.", + "spriteentrieswillbeaddedCheckpositioningandanimationsintheclientaftersaving": "sprite entries will be added. Check positioning and animations in the client after saving.", + "spriteswereskippedbecausethesourcebundlehasnousableartworkforthem": "sprite(s) were skipped because the source bundle has no usable artwork for them.", + "Savewithbackup": "Save with backup", + "Discardpreview": "Discard preview", + "SavedAcopyoftheoriginalbundleispreserved": "Saved. A copy of the original bundle is preserved.", + "Restoreoriginalbundle": "Restore original bundle", + "LocalfurnidatacouldnotbereadItsvaluesarenotverified": "Local furnidata could not be read. Its values are not verified.", + "Field": "Field", + "Localnow": "Local now", + "Source": "Source", + "SourcevaluesarecomparedwithlocaldataImportmayremapIDsandtranslatenamesExistingfurniturekeepsitslocalIDsandSQLsettingsnewfurniturereceivesafreelocalIDwhenthesourceIDisoccupied": "Source values are compared with local data. Import may remap IDs and translate names. Existing furniture keeps its local IDs and SQL settings; new furniture receives a free local ID when the source ID is occupied.", + "SQLrecordsandcatalogoffers": "SQL records and catalog offers", + "Item": "Item #", + "Sprite`": "· Sprite #", + "NolocalSQLitem": "No local SQL item.", + "Offer": "Offer #", + "Page": "· Page #", + "credits": "credits +", + "points": "points", + "Checkinglocaldataandassets": "Checking local data and assets…", + "Retryinspection": "Retry inspection", + "Missing": "Missing:", + "DuplicaterecordsormismatchedIDstypesrequirereviewbeforerepair": "Duplicate records or mismatched IDs/types require review before repair.", + "SomelocaldatacouldnotbecheckedRetryverificationbeforerepair": "Some local data could not be checked. Retry verification before repair.", + "RepairaddsmissingpartsandpreservesexistingIDssettingsfurnidataandcatalogoffersMissingoffersusetheautomaticcategoryandpriceshownbelow": "Repair adds missing parts and preserves existing IDs, settings, furnidata and catalog offers. Missing offers use the automatic category and price shown below.", + "Rechecklocalstate": "Recheck local state", + "Localinspectionunavailable": "Local inspection unavailable.", + "Furnidetail": "Furni detail", + "rev": "rev", + "Autoimportready": "Auto-import ready", + "Automaticplacement": "Automatic placement", + "Category": "Category", + "Price": "Price", + "credits`": "credits", + "Importaddtocatalog": "Import & add to catalog", + "ThisfurniisintheDBbutthenitrofileismissing": "This furni is in the DB but the .nitro file is missing.", + "Regeneratenitro": "Regenerate .nitro", + "Editnitro": "Edit nitro", + "Deleteimportedfurni": "Delete imported furni", + "selected": "selected", + "found": "found", + "copies": "copies", + "days": "days", + "Exportmanifest": "Export manifest", + "Onlyshowfilesolderthan": "Only show files older than", + "Hiderecentfiles": "Hide recent files", + "assetfilesscanned": "asset files scanned", + "Fakenitrosnomatchingitem": "Fake nitros (no matching item)", + "Brokennitrosunparseable": "Broken nitros (unparseable)", + "DeletingabrokennitroleavesitsiteminthedatabasewithoutabundlepreferredownloadingitorletthecatalogauditreobtainitlaterDatabaserowsareneverremovedbythistool": "Deleting a broken .nitro leaves its item in the database without a bundle — prefer re-downloading it, or let the catalog audit re-obtain it later. Database rows are never removed by this tool.", + "OnlyassetfilesaretouchedFurnitureDatajsonanddatabaserowsstayintact": "Only asset files are touched — FurnitureData.json and database rows stay intact.", + "ScaneveryfurniassetdirectorytofindfakeandbrokennitrobundlesplusorphanedSWFsandiconsDeletethemredownloadthebrokenonesorautocleanoldleftovers": "Scan every furni asset directory to find fake and broken nitro bundles plus orphaned SWFs and icons. Delete them, re-download the broken ones, or auto-clean old leftovers." + } + }, + "sounds": { + "soundsClient": { + "All": "All (", + "SingleMP3s": "Single MP3s (", + "Composition": "Composition (", + "UploadMP3": "Upload MP3", + "Type": "Type", + "Code": "Code", + "Name": "Name", + "Author": "Author", + "Length": "Length", + "Used": "Used", + "PreviewSamples": "Preview / Samples", + "Actions": "Actions", + "Nosongdisksuploadedyet": "No song disks uploaded yet.", + "ClickUploadMP3togetstarted": "Click “Upload MP3” to get started.", + "Noresultsfortheactivefilters": "No results for the active filters.", + "Trax": "Trax", + "sample": "sample:", + "Play": "▶ Play", + "Delete": "Delete “", + "Thissongdiskiscurrentlyusedby": "This song disk is currently used by", + "catalogitem": "catalog item", + "Deletingitwillresetthosecatalogitemstonosongdisk": ". Deleting it will reset those catalog items to “no song disk”.", + "TheMP3filewillberemovedfromdisk": "The MP3 file will be removed from disk.", + "Thisactioncannotbeundone": "This action cannot be undone.", + "Cancel": "Cancel", + "Delete`": "Delete", + "UploadSongDisk": "Upload Song Disk", + "UploadanMP3fileMaxsize10MBThecodewillbegeneratedautomaticallyas": "Upload an MP3 file. Max size 10 MB. The code will be generated automatically as", + "song_id": "song_{id}", + "MP3file": "MP3 file", + "Upload": "Upload", + "Edit": "Edit", + "compositionof": "— composition of", + "samplesEditthe": "samples. Edit the", + "track": "track", + "fieldonlyifyouknowwhatyouaredoing": "field only if you know what you are doing.", + "theMP3filecannotbereplaceddeleteandreuploadifyouneedtochangetheaudio": "— the MP3 file cannot be replaced: delete and re-upload if you need to change the audio.", + "Lengthseconds": "Length (seconds)", + "TrackTraxcomposition": "Track (Trax composition)", + "Format": "Format:", + "channelsample_idlengthsample_idlength": "channel:sample_id,length;sample_id,length;…", + "silenceDetectedsampleIDs": "= silence. Detected sample IDs:", + "Save": "Save", + "Filesareservedfrom": "Files are served from", + "configurablein": "(configurable in", + "Settings": "Settings", + "Stop": "Stop", + "PlayTrax": "Play Trax", + "deleteSuccess": "Song disk deleted", + "deleteError": "Failed to delete song disk", + "searchPlaceholder": "Search by title or code...", + "filterAll": "All", + "filterSingle": "Single MP3s", + "filterComposition": "Compositions" + } + }, + "moderation": { + "cfh": { + "id": { + "cfhDetail": { + "CFH": "CFH #", + "Type": "Type", + "Category": "· Category", + "CallForHelpReport": "Call For Help Report", + "Room": "· Room #", + "ReportMessage": "Report Message", + "Reporter": "Reporter", + "Rank": "Rank", + "Unknownuser": "Unknown user", + "ReportedUser": "Reported User", + "bans": "bans", + "Kick": "Kick", + "Mute": "Mute", + "Alert": "Alert", + "BanHistory": "Ban History (", + "Actions": "Actions", + "Status": "Status", + "Open": "Open", + "Picked": "Picked", + "Closed": "Closed", + "Assigntome": "Assign to me", + "CloseTicket": "Close Ticket", + "AssignedModerator": "Assigned Moderator", + "Unassigned": "Unassigned", + "Details": "Details", + "Created": "Created", + "Room`": "Room", + "Category`": "Category", + "Score": "Score", + "QuickActions": "Quick Actions", + "ResetPassword": "Reset Password", + "Disconnect": "Disconnect", + "Online": "Online", + "SendInGameAlert": "Send In-Game Alert", + "MuteUnmute": "Mute / Unmute", + "Unmute": "Unmute", + "SendCreditsRCON": "Send Credits (RCON)", + "SendCredits": "Send Credits", + "TradelockCMSDB": "Trade lock (CMS DB)", + "Lock7d": "Lock 7d", + "Clearlock": "Clear lock", + "PasswordReset": "Password Reset", + "Newpasswordgeneratedfor": "New password generated for", + "Copyitnowitwontbeshownagain": ". Copy it now — it won't be shown again.", + "Bans": "Bans", + "Unban": "Unban", + "Ban": "Ban", + "ActiveBan": "Active Ban", + "Reason": "Reason", + "Durationhours": "Duration (hours)", + "Account": "Account", + "Machine": "Machine", + "History": "History", + "cfhId": "CFH #{id}", + "typeCategory": "Category: {category}", + "title": "Call for Help #{id}", + "roomMeta": "Room #{id}", + "reportMessage": "Report Message", + "noDescription": "No description provided" + } + } + }, + "team": { + "page": { + "OnlineNow": "Online Now", + "TotalStaff": "Total Staff", + "Aboveminrank": "Above min rank", + "Name": "Name", + "Rank": "Rank", + "CFH": "CFH", + "Tickets": "Tickets", + "Actions": "Actions", + "LastSeen": "Last Seen", + "Web": "Web", + "Mod": "Mod", + "UserActions": "User Actions", + "UserID": "User ID", + "KickDisconnect": "Kick / Disconnect", + "Unmute": "Unmute", + "Mute": "Mute", + "RoomActions": "Room Actions", + "RoomID": "Room ID", + "KickAllFromRoom": "Kick All From Room", + "BroadcastAlert": "Broadcast Alert", + "HotelAlert": "Hotel Alert", + "StaffAlert": "Staff Alert", + "RecentCFHTickets": "Recent CFH Tickets", + "Viewall": "View all", + "NoCFHtickets": "No CFH tickets", + "RecentModActions": "Recent Mod Actions", + "Norecentactions": "No recent actions", + "Online": "Online", + "Offline": "Offline", + "Modview": "Mod view", + "Public": "Public", + "Motto": "Motto", + "ReadonlybanlistformoderatorsCreateliftbansrequiresthefulladminpanel": "Read-only ban list for moderators. Create/lift bans requires the full admin panel.", + "rank": "· rank" + } + } + }, + "prefixes": { + "prefixesClient": { + "UserPrefixes": "User Prefixes", + "Blacklist": "Blacklist", + "Settings": "Settings", + "Search": "Search", + "Add": "Add", + "User": "User", + "Prefix": "Prefix", + "Color": "Color", + "Icon": "Icon", + "Effect": "Effect", + "Active": "Active", + "Date": "Date", + "Actions": "Actions", + "Noprefixesfound": "No prefixes found", + "Previous": "Previous", + "Page": "Page", + "Next": "Next", + "ForbiddenWords": "Forbidden Words", + "Noblacklistwords": "No blacklist words", + "PrefixSettings": "Prefix Settings", + "MaxLength": "Max Length", + "MinimumRank": "Minimum Rank", + "PriceCredits": "Price (Credits)", + "PricePoints": "Price (Points)", + "PointsType": "Points Type", + "0Duckets5Diamondsetc": "0 = Duckets, 5 = Diamonds, etc.", + "SaveSettings": "Save Settings", + "Closeprefixeditor": "Close prefix editor", + "Username": "Username", + "Text": "Text", + "ColorHEXormultiFF000000FF00": "Color (HEX or multi: #FF0000,#00FF00)", + "Cancel": "Cancel", + "confirmDeleteTitle": "Delete Prefix", + "confirmDeleteDesc": "Are you sure you want to delete this user prefix?", + "confirmDelete": "Delete", + "cancel": "Cancel", + "successPrefixDeleted": "Prefix deleted successfully", + "successPrefixUpdated": "Prefix updated successfully", + "successPrefixCreated": "Prefix created successfully", + "successWordAdded": "Blacklist word added", + "successWordRemoved": "Blacklist word removed", + "successSettingsSaved": "Prefix settings saved", + "tabUserPrefixes": "User Prefixes", + "tabBlacklist": "Blacklist", + "tabSettings": "Settings" + } + }, + "catalogTree": { + "CatalogStructure": "Catalog Structure", + "pages": "pages", + "All": "All", + "Showallpages": "Show all pages", + "Showenabledonly": "Show enabled only", + "Off": "Off", + "Showdisabledonly": "Show disabled only", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "result": "result", + "for": "for \"", + "Createsubpage": "Create subpage", + "OFF": "OFF", + "Layout": "Layout", + "Items": "Items", + "Subpages": "Subpages", + "Icon": "Icon", + "Visible": "Visible", + "Enabled": "Enabled", + "RightclickforactionsDoubleclicktoopen": "Right-click for actions · Double-click to open", + "EditPage": "Edit Page", + "CopyID": "Copy ID", + "CreateSubpage": "Create Subpage", + "Delete": "Delete", + "QuickAdd": "Quick Add", + "CtrlK": "Ctrl+K", + "QuickAddFurni": "Quick Add Furni", + "Typeatleast2characterstosearch": "Type at least 2 characters to search", + "Nofurnifoundfor": "No furni found for \"", + "Add": "Add →", + "SelectCatalogIcon": "Select Catalog Icon", + "icons": "icons", + "None": "None", + "Noiconsfound": "No icons found", + "images": "images", + "Clear": "Clear", + "Noimagesfound": "No images found", + "Noitemsinthispageyet": "No items in this page yet", + "Shoppreview": "Shop preview ·", + "items": "items", + "OFFER": "OFFER", + "LTD": "LTD", + "Free": "Free", + "Loading": "Loading…", + "Nosong": "— No song —", + "Use": "Use \"" + }, + "catalogManager": { + "inlineEditor": { + "Selectapagefromthetreetoedit": "Select a page from the tree to edit", + "Parent": "· Parent:", + "Save": "Save", + "Settings": "Settings", + "Items": "Items", + "Translate": "Translate", + "Caption": "Caption", + "Layout": "Layout", + "Order": "Order", + "MinRank": "Min Rank", + "Icon": "Icon", + "Headline": "Headline", + "Teaser": "Teaser", + "Textfields": "Text fields", + "hascontent": "has content", + "Text1": "Text 1", + "Text2": "Text 2", + "TextDetails": "Text Details", + "TextTeaser": "Text Teaser", + "Special": "Special", + "Translatetoolsareavailablefortheshopcatalogonly": "Translate tools are available for the shop catalog only.", + "BCItems": "BC Items (", + "AddItem": "Add Item", + "Retry": "Retry", + "Noitemsinthispage": "No items in this page.", + "Name": "Name", + "ItemIDs": "Item IDs", + "ExtraData": "Extra Data", + "Actions": "Actions", + "CatalogName": "Catalog Name", + "ItemIDssemicolonseparated": "Item IDs (semicolon-separated)", + "Cancel": "Cancel", + "Expandall": "Expand all", + "Collapseall": "Collapse all", + "Newsubpage": "New subpage", + "pages": "pages", + "Sortmode": "Sort mode", + "result": "result", + "Nopagesinthiscategory": "No pages in this category", + "Createapagewiththebuttonorswitchtosortmodetoreorderexistingones": "Create a page with the + button, or switch to sort mode to reorder existing ones.", + "NosubpagesClicktocreateone": "No subpages. Click + to create one.", + "selected": "selected", + "Enable": "Enable", + "Disable": "Disable", + "Delete": "Delete", + "Clear": "Clear", + "root": "root", + "enabled": "enabled", + "items": "items", + "CtrlS": "Ctrl+S", + "save": "save", + "search": "search", + "CtrlK": "Ctrl+K", + "quickadd": "quick add", + "OFF": "OFF", + "Edit": "Edit", + "CopyID": "Copy ID", + "Addsubpage": "Add subpage", + "Duplicatepage": "Duplicate page", + "Auto": "Auto", + "Sort": "Sort", + "Use": "Use", + "layout": "layout", + "Duckets": "Duckets", + "Diamonds": "Diamonds", + "Editpage": "Edit page", + "CtrlShiftF": "Ctrl Shift F" + } + }, + "helpQuestions": { + "id": { + "page": { + "Edithelpcenterentry": "Edit help-center entry", + "HelpCenter": "← Help Center", + "Error": "Error:", + "Buttoncolor": "Button color", + "Buttonbordercolor": "Button border color", + "Smallbox": "Small box", + "Save": "Save", + "Deleteentry": "Delete entry", + "Newhelpcenterentry": "New help-center entry", + "Create": "Create", + "Pos": "Pos.", + "Button": "Button", + "Newadvertisement": "New advertisement", + "Advertisements": "← Advertisements", + "navigator_flatcats": "navigator_flatcats", + "Caption": "Caption", + "Captionsave": "Caption (save)", + "Minrank": "Min rank", + "Maxusers": "Max users", + "Cantrade": "Can trade", + "Public": "Public", + "Listtype": "List type", + "navigator_publics": "navigator_publics", + "Publiccat": "Public cat", + "Visible": "Visible" + } + } + }, + "themeBuilder": { + "scopeForm": { + "AddScope": "+ Add Scope", + "NewScope": "New Scope", + "Cancel": "Cancel", + "Name": "Name", + "Type": "Type", + "Domain": "Domain", + "Module": "Module", + "Selectmodule": "Select module...", + "RoutePath": "Route Path", + "ParentScope": "Parent Scope", + "Noneinheritsfromglobal": "None (inherits from global)", + "CreateScope": "Create Scope", + "ThemeBuilder": "Theme Builder", + "CreateandmanagescopedthemesfordifferentpartsofyoursiteThemesinheritfromparentscopesonlyoverridewhatyouneed": "Create and manage scoped themes for different parts of your site. Themes inherit from parent scopes — only override what you need.", + "Scopecreated": "Scope created.", + "Scopeupdated": "Scope updated.", + "Scopedeleted": "Scope deleted.", + "Themevaluessaved": "Theme values saved.", + "Scopeduplicated": "Scope duplicated.", + "Selectorcreateascopetostartediting": "Select or create a scope to start editing.", + "OFF": "OFF", + "ThemeScopes": "Theme Scopes", + "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", + "Rename": "Rename" + } } }, "error": { @@ -4842,7 +6256,71 @@ }, "hotel": { "title": "Hotel", - "description": "Rooms, radio, and asset tools" + "description": "Rooms, radio, and asset tools", + "routes": { + "themeManager": { + "title": "Theme manager", + "description": "Save, switch, import, export, and publish custom hotel themes (survive updates)", + "currentThemeTitle": "Current theme", + "currentThemeHint": "The palette and background being served to your visitors right now.", + "saveLabel": "Save theme", + "savePlaceholder": "Theme name (e.g. Summer Gold)", + "exportCurrent": "Export", + "savedThemesTitle": "Saved themes", + "savedThemesHint": "Apply any saved theme anytime. Saved themes are stored in the database, so they keep working after CMS updates.", + "noThemes": "No saved themes yet — save one above.", + "active": "Active", + "apply": "Apply", + "export": "Export", + "rename": "Rename", + "renameSave": "OK", + "delete": "Delete", + "deleteConfirm": "Delete theme \"{name}\"?", + "importTitle": "Import a theme", + "importHint": "Upload a `.atom-theme.json` file exported here, or a theme exported from the Theme Builder.", + "importNameLabel": "Name", + "importNamePlaceholder": "Optional override", + "importFileLabel": "Theme file", + "importApplyLabel": "Apply after import", + "importButton": "Import", + "invalidFile": "That file isn't a valid JSON theme.", + "presetsTitle": "Quick start presets", + "backgroundTitle": "Background", + "backgroundHint": "Set a custom background image for the public site using any image URL, or upload one.", + "backgroundPreviewLabel": "Preview", + "backgroundUrlLabel": "Image URL", + "backgroundPositionLabel": "Position", + "backgroundSizeLabel": "Size", + "backgroundRepeatLabel": "Repeat", + "applyBackground": "Apply background", + "uploadButton": "Upload image…", + "clearBackground": "Remove background", + "backgroundEffectLabel": "Effect", + "backgroundEffectHint": "Animate the public background with a gentle, theme-matched layer (aurora uses your primary/accent colors).", + "backgroundEffect_none": "None (plain background)", + "backgroundEffect_aurora": "Aurora glow", + "backgroundEffect_particles": "Floating particles", + "backgroundEffect_aurora-particles": "Aurora + particles", + "backgroundEffectPreview": "Effect: {effect} — shown behind the public site.", + "backgroundOverlayLabel": "Overlay tint", + "backgroundOverlayOpacityLabel": "Overlay strength", + "notice": { + "saved": "Theme saved.", + "applied": "Theme applied.", + "renamed": "Theme renamed.", + "deleted": "Theme deleted.", + "imported": "Theme imported.", + "preset": "Preset applied.", + "background": "Background updated.", + "importError": "That file couldn't be imported. It may be too large or not a theme export.", + "backgroundError": "The image couldn't be uploaded. Use a PNG, JPEG, GIF, or WebP up to 10MB." + } + }, + "nitroCleanup": { + "title": "Nitro cleanup", + "description": "Scan and remove fake, broken, and orphaned furni asset files" + } + } }, "system": { "title": "System", @@ -4912,6 +6390,91 @@ "previous": "Previous", "next": "Next", "page": "Page {page} of {pages}" + }, + "developers": { + "page": { + "Bearer": "🔒 Bearer", + "Session": "🔒 Session", + "Public": "Public", + "Allendpointsliveunder": "All endpoints live under", + "api": "/api", + "andreturnJSONMostreadendpointsareopenahandfulthattouchyouraccountneedatokenBrowsethegroupsbeloweachrowshowsthemethodpathwhatitdoesandwhetheritneedsauthentication": "and return JSON. Most read endpoints are open; a handful that touch your account need a token. Browse the groups below — each row shows the method, path, what it does and whether it needs authentication.", + "Mostreadsare": "Most reads are", + "open": "open", + "andneednocredentialsEndpointsmarked": "and need no credentials. Endpoints marked", + "requireapersonalaccesstokensentintherequestheader": "require a personal access token sent in the request header:", + "AuthorizationBeareryourtoken": "Authorization: Bearer ''", + "Togetatokensignintothewebsiteand": "To get a token, sign in to the website and", + "POST": "POST", + "apitokens": "/api/tokens", + "theplaintexttokenisreturned": "— the plaintext token is returned", + "once": "once", + "andnevershownagainsostoreitsafelyYoucanlistandrevokeyourtokensat": "and never shown again, so store it safely. You can list and revoke your tokens at", + "apimetokens": "/api/me/tokens", + "Thesetokenmanagementendpointsaremarked": ". These token-management endpoints are marked", + "becausetheyuseyoursignedinwebsessionratherthanaBearertoken": "because they use your signed-in web session rather than a Bearer token.", + "TokensaretiedtoyouraccountBearerendpointsonlyeverreturnormodifyyourowndatayourticketsyourshoutsyourDJpoints": "Tokens are tied to your account: Bearer endpoints only ever return or modify your own data (your tickets, your shouts, your DJ points).", + "Enter": "Enter", + "Staff": "Staff", + "Modpanel": "Mod panel", + "Adminpanel": "Admin panel", + "Commandocentrum": "Commandocentrum", + "Logs": "Logs", + "Logogenerator": "Logo generator", + "Mydashboard": "My dashboard", + "Myprofile": "My profile", + "Usersettings": "User settings", + "Twofactor": "Two-factor", + "Loginactivity": "Login activity", + "Friendrequests": "Friend requests (", + "more": "more", + "Logout": "Logout", + "EpicNextInfo": "EpicNext Info", + "CMSinformation": "CMS information", + "EpicNext": "EpicNext", + "ModernNextjsCMS": "Modern Next.js CMS", + "AmodernweblayerforthehotelcommunityfocusedonfastnavigationcleanadministrationandacoherentEpicNextexperience": "A modern web layer for the hotel community, focused on fast navigation, clean administration, and a coherent EpicNext experience." + } + }, + "public": { + "logoGenerator": { + "Hotelname": "Hotel name", + "Searchfont": "Search font", + "Font": "Font —", + "DownloadPNG": "⬇️ Download PNG", + "Failedtoloadfontsprite": "Failed to load font sprite.", + "Notethisfontdoesnothavecharacters": "Note: this font does not have characters:", + "Loadingfont": "Loading font…", + "Username": "Username", + "Password": "Password", + "2FACode": "2FA Code", + "Pleasewait": "Please wait...", + "Watching": "Watching", + "Watch": "Watch", + "AaTextpreview": "Aa Text preview", + "Usereadablecolor": "Use readable color →", + "Navbarkleur": "Navbar kleur", + "Search": "Search", + "Atom": "Atom", + "Nolanguagesfound": "No languages found", + "Hotel": "Hotel", + "Browse": "Browse", + "MediaLibrary": "Media Library", + "Close": "Close", + "Loading": "Loading…", + "NoimagesyetUploadoneabove": "No images yet. Upload one above.", + "totalpage": "total · page", + "Previous": "Previous", + "Next": "Next", + "OnlineNow": "Online Now", + "users": "users", + "Nousersonline": "No users online", + "CSV": "CSV", + "CtrlK": "Ctrl/⌘ K", + "Cancel": "Cancel", + "sprite": "· sprite", + "Git": "Git:" + } } }, "emails": {