diff --git a/src/messages/bg.json b/src/messages/bg.json index da9f64e5..cf38476a 100644 --- a/src/messages/bg.json +++ b/src/messages/bg.json @@ -21,7 +21,9 @@ "admin": "Админ", "openMenu": "Отворете менюто", "closeMenu": "Затваряне на менюто", - "drawBadge": "Начертайте значка" + "drawBadge": "Начертайте значка", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} онлайн", @@ -71,7 +73,16 @@ "emptySubtitle": "Все още нямате добавени приятели", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Добавете приятели в хотела и те ще се покажат тук.", - "noMotto": "Няма мото" + "noMotto": "Няма мото", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Съобщения", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Вашата входяща кутия е празна", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Нямате офлайн съобщения.", - "unknownUser": "Потребител #{id}" + "unknownUser": "Потребител #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Няма мото", @@ -114,7 +148,26 @@ "roomsTitle": "Стаи", "roomsSubtitle": "Стаи, които притежават", "roomsEmpty": "Няма стаи за показване.", - "roomUntitled": "Стая без заглавие" + "roomUntitled": "Стая без заглавие", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Класации", @@ -180,7 +233,19 @@ "addComment": "Добавяне на коментар", "commentPlaceholder": "Напишете своя коментар...", "postComment": "Публикувайте коментар", - "toComment": "да оставите коментар." + "toComment": "да оставите коментар.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Снимки", @@ -264,7 +329,10 @@ "pinned": "Фиксирано", "locked": "Заключено", "userNumber": "Потребител #{id}", - "unknown": "неизвестен" + "unknown": "неизвестен", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Назад към форума", @@ -276,7 +344,13 @@ "messageLabel": "Съобщение", "messagePlaceholder": "Напишете началната си публикация...", "postThread": "Публикуване на тема", - "cancel": "Отказ" + "cancel": "Отказ", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Магазин", @@ -286,7 +360,22 @@ "allPackages": "Всички пакети", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "В момента няма налични пакети.", - "buy": "Купете" + "buy": "Купете", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Допълнете с PayPal", @@ -390,7 +479,16 @@ "colStatus": "Статус", "colCreated": "Създаден", "statusOpen": "Отворете", - "statusClosed": "Затворено" + "statusClosed": "Затворено", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Кандидатствайте за персонал на {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Вече сте кандидатствали за {rank}", "aboutYou": "За вас", "aboutPlaceholder": "Кажете ни защо бихте били страхотен {rank}...", - "applyFor": "Кандидатствайте за {rank}" + "applyFor": "Кандидатствайте за {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Кандидатствайте за екипа на {hotel}", @@ -412,7 +520,17 @@ "pending": "Вашата кандидатура е в процес на разглеждане", "aboutYou": "За вас", "aboutPlaceholder": "Кажете ни защо бихте били чудесен избор за {rank}...", - "applyFor": "Кандидатствайте за {rank}" + "applyFor": "Кандидатствайте за {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Радио", @@ -467,7 +585,16 @@ "loginToPost": "Влезте, за да публикувате вик.", "latestTitle": "Последни викове", "latestSubtitle": "Най-новите съобщения от слушатели", - "empty": "Все още няма викове. Бъдете първи!" + "empty": "Все още няма викове. Бъдете първи!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Радио състезания", @@ -511,7 +638,16 @@ "colStatus": "Статус", "statusPending": "В очакване", "statusApproved": "Одобрено", - "statusPlayed": "Играна" + "statusPlayed": "Играна", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro клиент", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Някакъв предишен DJ или хостинг опит?", "motivationLabel": "Мотивация", "motivationPlaceholder": "Защо искаш да се присъединиш към екипа на радиото?", - "submitButton": "Изпратете заявление" + "submitButton": "Изпратете заявление", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Настройки на акаунта", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Невалидно потребителско име или парола", "errorInvalid2fa": "Невалиден 2FA код", "welcomeBack": "Добре дошли отново", - "welcomeBackSub": "Влезте, за да продължите към {hotelName}" + "welcomeBackSub": "Влезте, за да продължите към {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Създаване на акаунт", @@ -664,7 +810,8 @@ "sentNotice": "Ако този имейл е регистриран, е изпратена връзка за нулиране. Проверете входящата си кутия.", "emailPlaceholder": "Вашият имейл", "sendResetLink": "Изпратете връзка за нулиране", - "backToLogin": "Назад към входа" + "backToLogin": "Назад към входа", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Задайте нова парола", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Табло за управление", @@ -935,7 +1094,14 @@ "saving": "Запазва се...", "deleteAd": "Изтрий рекламата", "cancel": "Отказ" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Кутии за писане", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Транзакции", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Филтър за думи", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/cs.json b/src/messages/cs.json index baeacc44..59e66031 100644 --- a/src/messages/cs.json +++ b/src/messages/cs.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Otevřít nabídku", "closeMenu": "Zavřít nabídku", - "drawBadge": "Nakreslete odznak" + "drawBadge": "Nakreslete odznak", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Zatím jste nepřidali žádné přátele", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Přidejte přátele v hotelu a oni se zde zobrazí.", - "noMotto": "Žádné motto" + "noMotto": "Žádné motto", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Zprávy", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Vaše doručená pošta je prázdná", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Nemáte žádné offline zprávy.", - "unknownUser": "Uživatel #{id}" + "unknownUser": "Uživatel #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Žádné motto", @@ -114,7 +148,26 @@ "roomsTitle": "Pokoje", "roomsSubtitle": "Pokoje, které vlastní", "roomsEmpty": "Žádné místnosti k zobrazení.", - "roomUntitled": "Pokoj bez názvu" + "roomUntitled": "Pokoj bez názvu", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Žebříčky", @@ -180,7 +233,19 @@ "addComment": "Přidejte komentář", "commentPlaceholder": "Napište svůj komentář…", "postComment": "Přidat komentář", - "toComment": "zanechat komentář." + "toComment": "zanechat komentář.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotografie", @@ -264,7 +329,10 @@ "pinned": "Připnuto", "locked": "Zamčeno", "userNumber": "Uživatel #{id}", - "unknown": "Neznámý" + "unknown": "Neznámý", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Zpět na fórum", @@ -276,7 +344,13 @@ "messageLabel": "Zpráva", "messagePlaceholder": "Napište svůj úvodní příspěvek…", "postThread": "Odeslat vlákno", - "cancel": "Zrušit" + "cancel": "Zrušit", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Obchod", @@ -286,7 +360,22 @@ "allPackages": "Všechny balíčky", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Momentálně nejsou k dispozici žádné balíčky.", - "buy": "Koupit" + "buy": "Koupit", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Doplňte přes PayPal", @@ -390,7 +479,16 @@ "colStatus": "Stav", "colCreated": "Vytvořeno", "statusOpen": "Otevřít", - "statusClosed": "Zavřeno" + "statusClosed": "Zavřeno", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Požádejte o zaměstnance {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Již jste požádali o {rank}", "aboutYou": "O vás", "aboutPlaceholder": "Řekni nám, proč bys byl skvělý {rank}…", - "applyFor": "Zažádat o {rank}" + "applyFor": "Zažádat o {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Přihlaste se do týmu {hotel}", @@ -412,7 +520,17 @@ "pending": "Vaše přihláška čeká na vyřízení", "aboutYou": "O vás", "aboutPlaceholder": "Řekněte nám, proč byste se skvěle hodil pro {rank}…", - "applyFor": "Zažádat o {rank}" + "applyFor": "Zažádat o {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Rádio", @@ -467,7 +585,16 @@ "loginToPost": "Chcete-li zveřejnit výkřik, přihlaste se.", "latestTitle": "Nejnovější výkřiky", "latestSubtitle": "Nejnovější zprávy od posluchačů", - "empty": "Zatím žádné výkřiky. Buďte první!" + "empty": "Zatím žádné výkřiky. Buďte první!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Rádiové soutěže", @@ -511,7 +638,16 @@ "colStatus": "Stav", "statusPending": "Čeká na vyřízení", "statusApproved": "Schváleno", - "statusPlayed": "Hráno" + "statusPlayed": "Hráno", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro klient", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Máte nějaké předchozí zkušenosti s DJ nebo hostováním?", "motivationLabel": "Motivace", "motivationPlaceholder": "Proč se chcete připojit k týmu rádia?", - "submitButton": "Odešlete přihlášku" + "submitButton": "Odešlete přihlášku", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Nastavení účtu", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Neplatné uživatelské jméno nebo heslo", "errorInvalid2fa": "Neplatný kód 2FA", "welcomeBack": "Vítej zpět", - "welcomeBackSub": "Přihlas se pro pokračování do {hotelName}" + "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." }, "register": { "title": "Vytvořit účet", @@ -664,7 +810,8 @@ "sentNotice": "Pokud je tento e-mail zaregistrován, byl odeslán odkaz pro obnovení. Zkontrolujte si doručenou poštu.", "emailPlaceholder": "Váš email", "sendResetLink": "Odeslat odkaz na reset", - "backToLogin": "Zpět k přihlášení" + "backToLogin": "Zpět k přihlášení", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Nastavte nové heslo", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Dashboard", @@ -935,7 +1094,14 @@ "saving": "Ukládání…", "deleteAd": "Smazat inzerát", "cancel": "Zrušit" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Zapisovatelné krabičky", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transakce", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filtr slov", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/da.json b/src/messages/da.json index 8d8fc200..f198cc74 100644 --- a/src/messages/da.json +++ b/src/messages/da.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Åbn menuen", "closeMenu": "Luk menuen", - "drawBadge": "Tegn badge" + "drawBadge": "Tegn badge", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Du har ingen tilføjet venner endnu", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Tilføj venner på hotellet, så dukker de op her.", - "noMotto": "Intet motto" + "noMotto": "Intet motto", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Beskeder", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Din indbakke er tom", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Du har ingen offline beskeder.", - "unknownUser": "Bruger #{id}" + "unknownUser": "Bruger #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Intet motto", @@ -114,7 +148,26 @@ "roomsTitle": "Værelser", "roomsSubtitle": "Værelser de ejer", "roomsEmpty": "Ingen lokaler at vise.", - "roomUntitled": "Unavngivet værelse" + "roomUntitled": "Unavngivet værelse", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Placeringer", @@ -180,7 +233,19 @@ "addComment": "Tilføj en kommentar", "commentPlaceholder": "Skriv din kommentar...", "postComment": "Skriv kommentar", - "toComment": "at efterlade en kommentar." + "toComment": "at efterlade en kommentar.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotos", @@ -264,7 +329,10 @@ "pinned": "Fastgjort", "locked": "Låst", "userNumber": "Bruger #{id}", - "unknown": "Ukendt" + "unknown": "Ukendt", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Tilbage til forum", @@ -276,7 +344,13 @@ "messageLabel": "Besked", "messagePlaceholder": "Skriv dit åbningsindlæg...", "postThread": "Post tråd", - "cancel": "Annuller" + "cancel": "Annuller", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Butik", @@ -286,7 +360,22 @@ "allPackages": "Alle pakker", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Ingen tilgængelige pakker lige nu.", - "buy": "Køb" + "buy": "Køb", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Fyld op med PayPal", @@ -390,7 +479,16 @@ "colStatus": "Status", "colCreated": "Oprettet", "statusOpen": "Åbn", - "statusClosed": "Lukket" + "statusClosed": "Lukket", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Ansøg om {hotel} personale", @@ -402,7 +500,17 @@ "alreadyApplied": "Du har allerede ansøgt om {rank}", "aboutYou": "Om dig", "aboutPlaceholder": "Fortæl os, hvorfor du ville være en stor {rank}...", - "applyFor": "Ansøg om {rank}" + "applyFor": "Ansøg om {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Ansøg om {hotel}-teamet", @@ -412,7 +520,17 @@ "pending": "Din ansøgning afventer", "aboutYou": "Om dig", "aboutPlaceholder": "Fortæl os, hvorfor du ville passe godt til {rank}...", - "applyFor": "Ansøg om {rank}" + "applyFor": "Ansøg om {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radio", @@ -467,7 +585,16 @@ "loginToPost": "Log ind for at sende et råb.", "latestTitle": "Seneste råb", "latestSubtitle": "De seneste beskeder fra lyttere", - "empty": "Ingen råb endnu. Vær den første!" + "empty": "Ingen råb endnu. Vær den første!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Radiokonkurrencer", @@ -511,7 +638,16 @@ "colStatus": "Status", "statusPending": "Afventer", "statusApproved": "Godkendt", - "statusPlayed": "Spillede" + "statusPlayed": "Spillede", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro klient", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Har du tidligere erfaring med DJ eller vært?", "motivationLabel": "Motivation", "motivationPlaceholder": "Hvorfor vil du være med på radioholdet?", - "submitButton": "Indsend ansøgning" + "submitButton": "Indsend ansøgning", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Kontoindstillinger", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Ugyldigt brugernavn eller adgangskode", "errorInvalid2fa": "Ugyldig 2FA-kode", "welcomeBack": "Velkommen tilbage", - "welcomeBackSub": "Log ind for at fortsætte til {hotelName}" + "welcomeBackSub": "Log ind for at fortsætte til {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Opret konto", @@ -664,7 +810,8 @@ "sentNotice": "Hvis denne e-mail er registreret, er et nulstillingslink blevet sendt. Tjek din indbakke.", "emailPlaceholder": "Din e-mail", "sendResetLink": "Send nulstillingslink", - "backToLogin": "Tilbage til login" + "backToLogin": "Tilbage til login", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Indstil en ny adgangskode", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Dashboard", @@ -935,7 +1094,14 @@ "saving": "Gemmer...", "deleteAd": "Slet annonce", "cancel": "Annuller" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Skrivbare æsker", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transaktioner", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Ord filter", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/de.json b/src/messages/de.json index 8471926d..e034e3a7 100644 --- a/src/messages/de.json +++ b/src/messages/de.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Open menu", "closeMenu": "Close menu", - "drawBadge": "Abzeichen zeichnen" + "drawBadge": "Abzeichen zeichnen", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Du hast noch keine Freunde hinzugefügt", "subtitle": "{count, plural, one {Du hast # Freund} other {Du hast # Freunde}}", "emptyState": "Füge im Hotel Freunde hinzu und sie werden hier angezeigt.", - "noMotto": "Kein Motto" + "noMotto": "Kein Motto", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Nachrichten", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Dein Posteingang ist leer", "offlineSubtitle": "{count, plural, one {# Nachricht erhalten} other {# Nachrichten erhalten}}", "offlineEmptyState": "Du hast keine Offline-Nachrichten.", - "unknownUser": "Benutzer #{id}" + "unknownUser": "Benutzer #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Kein Motto", @@ -114,7 +148,26 @@ "roomsTitle": "Räume", "roomsSubtitle": "Räume, die sie besitzen", "roomsEmpty": "Keine Räume zu sehen.", - "roomUntitled": "Unbenannter Raum" + "roomUntitled": "Unbenannter Raum", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Ranglisten", @@ -180,7 +233,19 @@ "addComment": "Kommentar hinzufügen", "commentPlaceholder": "Schreibe deinen Kommentar…", "postComment": "Kommentar posten", - "toComment": "um einen Kommentar zu hinterlassen." + "toComment": "um einen Kommentar zu hinterlassen.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotos", @@ -264,7 +329,10 @@ "pinned": "Angepinnt", "locked": "Gesperrt", "userNumber": "Benutzer #{id}", - "unknown": "Unbekannt" + "unknown": "Unbekannt", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Zurück zum Forum", @@ -276,7 +344,13 @@ "messageLabel": "Nachricht", "messagePlaceholder": "Schreibe deinen Eröffnungsbeitrag…", "postThread": "Thema erstellen", - "cancel": "Abbrechen" + "cancel": "Abbrechen", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Shop", @@ -286,7 +360,22 @@ "allPackages": "Alle Pakete", "packagesAvailable": "{count, plural, one {# Paket verfügbar} other {# Pakete verfügbar}}", "empty": "Derzeit keine Pakete verfügbar.", - "buy": "Kaufen" + "buy": "Kaufen", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Aufladen mit PayPal", @@ -390,7 +479,16 @@ "colStatus": "Status", "colCreated": "Erstellt", "statusOpen": "Offen", - "statusClosed": "Geschlossen" + "statusClosed": "Geschlossen", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Bewirb dich als {hotel} Team", @@ -402,7 +500,17 @@ "alreadyApplied": "Du hast dich bereits für {rank} beworben", "aboutYou": "Über dich", "aboutPlaceholder": "Erzähl uns, warum du ein großartiger {rank} wärst…", - "applyFor": "Bewirb dich für {rank}" + "applyFor": "Bewirb dich für {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Bewirb dich für das {hotel} Team", @@ -412,7 +520,17 @@ "pending": "Deine Bewerbung ist in Bearbeitung", "aboutYou": "Über dich", "aboutPlaceholder": "Erzähl uns, warum du eine großartige Ergänzung für {rank} wärst…", - "applyFor": "Bewirb dich für {rank}" + "applyFor": "Bewirb dich für {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radio", @@ -467,7 +585,16 @@ "loginToPost": "Melde dich an, um einen Shout zu posten.", "latestTitle": "Neueste Shouts", "latestSubtitle": "Die aktuellsten Nachrichten von Hörern", - "empty": "Noch keine Shouts. Sei der Erste!" + "empty": "Noch keine Shouts. Sei der Erste!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Radio-Wettbewerbe", @@ -513,7 +640,15 @@ "experiencePlaceholder": "Frühere DJ- oder Moderationserfahrung?", "motivationLabel": "Motivation", "motivationPlaceholder": "Warum möchtest du dem Radioteam beitreten?", - "submitButton": "Bewerbung einreichen" + "submitButton": "Bewerbung einreichen", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Kontoeinstellungen", @@ -588,7 +723,9 @@ "errorInvalidCredentials": "Ungültiger Benutzername oder Passwort", "errorInvalid2fa": "Ungültiger 2FA-Code", "welcomeBack": "Willkommen zurück", - "welcomeBackSub": "Melde dich an, um zu {hotelName} zu gelangen" + "welcomeBackSub": "Melde dich an, um zu {hotelName} zu gelangen", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Konto erstellen", @@ -628,7 +765,8 @@ "sentNotice": "Wenn diese E-Mail registriert ist, wurde ein Reset-Link gesendet. Überprüfe deinen Posteingang.", "emailPlaceholder": "Deine E-Mail", "sendResetLink": "Reset-Link senden", - "backToLogin": "Zurück zur Anmeldung" + "backToLogin": "Zurück zur Anmeldung", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Neues Passwort festlegen", @@ -746,7 +884,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Dashboard", @@ -899,7 +1049,14 @@ "saving": "Wird gespeichert…", "deleteAd": "Anzeige löschen", "cancel": "Abbrechen" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Editierbare Boxen", @@ -1270,7 +1427,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transaktionen", @@ -1858,7 +2017,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Wortfilter", @@ -2205,7 +2392,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2352,7 +2547,247 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } }, @@ -2390,7 +2825,169 @@ "colStatus": "Status", "statusPending": "Pending", "statusApproved": "Approved", - "statusPlayed": "Played" + "statusPlayed": "Played", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/el.json b/src/messages/el.json index 3f03b8a9..2b295832 100644 --- a/src/messages/el.json +++ b/src/messages/el.json @@ -21,7 +21,9 @@ "admin": "Διαχειρ", "openMenu": "Άνοιγμα μενού", "closeMenu": "Κλείσιμο μενού", - "drawBadge": "Σχεδιάστε το σήμα" + "drawBadge": "Σχεδιάστε το σήμα", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} στο διαδίκτυο", @@ -71,7 +73,16 @@ "emptySubtitle": "Δεν έχετε προσθέσει φίλους ακόμα", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Προσθέστε φίλους στο ξενοδοχείο και θα εμφανιστούν εδώ.", - "noMotto": "Χωρίς σύνθημα" + "noMotto": "Χωρίς σύνθημα", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Μηνύματα", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Τα εισερχόμενά σας είναι άδεια", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Δεν έχετε μηνύματα εκτός σύνδεσης.", - "unknownUser": "Χρήστης #{id}" + "unknownUser": "Χρήστης #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Χωρίς σύνθημα", @@ -114,7 +148,26 @@ "roomsTitle": "Δωμάτια", "roomsSubtitle": "Δωμάτια που τους ανήκουν", "roomsEmpty": "Δεν υπάρχουν δωμάτια για εμφάνιση.", - "roomUntitled": "Δωμάτιο χωρίς τίτλο" + "roomUntitled": "Δωμάτιο χωρίς τίτλο", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Κατάταξη", @@ -180,7 +233,19 @@ "addComment": "Προσθέστε ένα σχόλιο", "commentPlaceholder": "Γράψτε το σχόλιό σας…", "postComment": "Δημοσίευση σχολίου", - "toComment": "για να αφήσετε ένα σχόλιο." + "toComment": "για να αφήσετε ένα σχόλιο.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Φωτογραφίες", @@ -264,7 +329,10 @@ "pinned": "Καρφιτσωμένο", "locked": "Κλειδωμένο", "userNumber": "Χρήστης #{id}", - "unknown": "Άγνωστο" + "unknown": "Άγνωστο", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Επιστροφή στο φόρουμ", @@ -276,7 +344,13 @@ "messageLabel": "Μήνυμα", "messagePlaceholder": "Γράψτε την αρχική σας ανάρτηση…", "postThread": "Δημοσίευση νήματος", - "cancel": "Ακύρωση" + "cancel": "Ακύρωση", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Κατάστημα", @@ -286,7 +360,22 @@ "allPackages": "Όλα τα πακέτα", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Δεν υπάρχουν διαθέσιμα πακέτα αυτήν τη στιγμή.", - "buy": "Αγοράστε" + "buy": "Αγοράστε", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Συμπληρώστε με PayPal", @@ -390,7 +479,16 @@ "colStatus": "Κατάσταση", "colCreated": "Δημιουργήθηκε", "statusOpen": "Ανοίξτε", - "statusClosed": "Κλειστό" + "statusClosed": "Κλειστό", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Κάντε αίτηση για προσωπικό {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Έχετε ήδη υποβάλει αίτηση για {rank}", "aboutYou": "Σχετικά με εσάς", "aboutPlaceholder": "Πείτε μας γιατί θα ήσασταν εξαιρετικός {rank}…", - "applyFor": "Αίτηση για {rank}" + "applyFor": "Αίτηση για {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Κάντε αίτηση για την ομάδα του {hotel}", @@ -412,7 +520,17 @@ "pending": "Η αίτησή σας είναι σε εκκρεμότητα", "aboutYou": "Σχετικά με εσάς", "aboutPlaceholder": "Πείτε μας γιατί θα ήσασταν πολύ κατάλληλοι για το {rank}…", - "applyFor": "Αίτηση για {rank}" + "applyFor": "Αίτηση για {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Ραδιόφωνο", @@ -467,7 +585,16 @@ "loginToPost": "Συνδεθείτε για να δημοσιεύσετε μια κραυγή.", "latestTitle": "Τελευταίες κραυγές", "latestSubtitle": "Τα πιο πρόσφατα μηνύματα από ακροατές", - "empty": "Χωρίς φωνές ακόμα. Γίνε ο πρώτος!" + "empty": "Χωρίς φωνές ακόμα. Γίνε ο πρώτος!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Διαγωνισμοί Ραδιοφώνου", @@ -511,7 +638,16 @@ "colStatus": "Κατάσταση", "statusPending": "Σε εκκρεμότητα", "statusApproved": "Εγκρίθηκε", - "statusPlayed": "Έπαιξε" + "statusPlayed": "Έπαιξε", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Πελάτης Nitro", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Κάποια προηγούμενη εμπειρία DJ ή φιλοξενίας;", "motivationLabel": "Κίνητρο", "motivationPlaceholder": "Γιατί θέλετε να γίνετε μέλος της ομάδας του ραδιοφώνου;", - "submitButton": "Υποβολή αίτησης" + "submitButton": "Υποβολή αίτησης", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Ρυθμίσεις λογαριασμού", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης", "errorInvalid2fa": "Μη έγκυρος κωδικός 2FA", "welcomeBack": "Καλώς ήρθες πίσω", - "welcomeBackSub": "Συνδέσου για να συνεχίσεις στο {hotelName}" + "welcomeBackSub": "Συνδέσου για να συνεχίσεις στο {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Δημιουργία λογαριασμού", @@ -664,7 +810,8 @@ "sentNotice": "Εάν αυτό το email είναι καταχωρημένο, έχει σταλεί ένας σύνδεσμος επαναφοράς. Ελέγξτε τα εισερχόμενά σας.", "emailPlaceholder": "Το email σας", "sendResetLink": "Αποστολή συνδέσμου επαναφοράς", - "backToLogin": "Επιστροφή στην είσοδο" + "backToLogin": "Επιστροφή στην είσοδο", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Ορίστε νέο κωδικό πρόσβασης", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Ταμπλό", @@ -935,7 +1094,14 @@ "saving": "Αποθήκευση…", "deleteAd": "Διαγραφή διαφήμισης", "cancel": "Ακύρωση" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Εγγράψιμα κουτιά", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Συναλλαγές", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Φίλτρο Word", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/es.json b/src/messages/es.json index 62ebf810..bab405db 100644 --- a/src/messages/es.json +++ b/src/messages/es.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Open menu", "closeMenu": "Close menu", - "drawBadge": "Diseñar insignia" + "drawBadge": "Diseñar insignia", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} en línea", @@ -71,7 +73,16 @@ "emptySubtitle": "Aún no has añadido amigos", "subtitle": "{count, plural, one {Tienes # amigo} other {Tienes # amigos}}", "emptyState": "Añade amigos en el hotel y aparecerán aquí.", - "noMotto": "Sin lema" + "noMotto": "Sin lema", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Mensajes", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Tu bandeja de entrada está vacía", "offlineSubtitle": "{count, plural, one {# mensaje recibido} other {# mensajes recibidos}}", "offlineEmptyState": "No tienes mensajes fuera de línea.", - "unknownUser": "Usuario #{id}" + "unknownUser": "Usuario #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Sin lema", @@ -114,7 +148,26 @@ "roomsTitle": "Salas", "roomsSubtitle": "Salas que poseen", "roomsEmpty": "No hay salas que mostrar.", - "roomUntitled": "Sala sin título" + "roomUntitled": "Sala sin título", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Clasificaciones", @@ -180,7 +233,19 @@ "addComment": "Añadir un comentario", "commentPlaceholder": "Escribe tu comentario…", "postComment": "Publicar comentario", - "toComment": "para dejar un comentario." + "toComment": "para dejar un comentario.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotos", @@ -264,7 +329,10 @@ "pinned": "Fijado", "locked": "Bloqueado", "userNumber": "Usuario #{id}", - "unknown": "Desconocido" + "unknown": "Desconocido", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Volver al foro", @@ -276,7 +344,13 @@ "messageLabel": "Mensaje", "messagePlaceholder": "Escribe tu mensaje inicial…", "postThread": "Publicar hilo", - "cancel": "Cancelar" + "cancel": "Cancelar", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Tienda", @@ -286,7 +360,22 @@ "allPackages": "Todos los paquetes", "packagesAvailable": "{count, plural, one {# paquete disponible} other {# paquetes disponibles}}", "empty": "No hay paquetes disponibles ahora mismo.", - "buy": "Comprar" + "buy": "Comprar", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Recargar con PayPal", @@ -390,7 +479,16 @@ "colStatus": "Estado", "colCreated": "Creado", "statusOpen": "Abierto", - "statusClosed": "Cerrado" + "statusClosed": "Cerrado", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Solicitar unirte al equipo de {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Ya has solicitado {rank}", "aboutYou": "Sobre ti", "aboutPlaceholder": "Cuéntanos por qué serías un gran {rank}…", - "applyFor": "Solicitar {rank}" + "applyFor": "Solicitar {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Solicitar unirte al equipo de {hotel}", @@ -412,7 +520,17 @@ "pending": "Tu solicitud está pendiente", "aboutYou": "Sobre ti", "aboutPlaceholder": "Cuéntanos por qué serías ideal para {rank}…", - "applyFor": "Solicitar {rank}" + "applyFor": "Solicitar {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radio", @@ -467,7 +585,16 @@ "loginToPost": "Inicia sesión para publicar un saludo.", "latestTitle": "Últimos saludos", "latestSubtitle": "Los mensajes más recientes de los oyentes", - "empty": "Aún no hay saludos. ¡Sé el primero!" + "empty": "Aún no hay saludos. ¡Sé el primero!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Concursos de radio", @@ -513,7 +640,15 @@ "experiencePlaceholder": "¿Tienes experiencia previa como DJ o presentador?", "motivationLabel": "Motivación", "motivationPlaceholder": "¿Por qué quieres unirte al equipo de radio?", - "submitButton": "Enviar solicitud" + "submitButton": "Enviar solicitud", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Configuración de la cuenta", @@ -588,7 +723,9 @@ "errorInvalidCredentials": "Usuario o contraseña inválidos", "errorInvalid2fa": "Código 2FA inválido", "welcomeBack": "Bienvenido de nuevo", - "welcomeBackSub": "Inicia sesión para continuar en {hotelName}" + "welcomeBackSub": "Inicia sesión para continuar en {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Crear cuenta", @@ -628,7 +765,8 @@ "sentNotice": "Si ese correo está registrado, se ha enviado un enlace de restablecimiento. Revisa tu bandeja de entrada.", "emailPlaceholder": "Tu correo electrónico", "sendResetLink": "Enviar enlace de restablecimiento", - "backToLogin": "Volver al inicio de sesión" + "backToLogin": "Volver al inicio de sesión", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Establecer una nueva contraseña", @@ -746,7 +884,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Panel", @@ -899,7 +1049,14 @@ "saving": "Guardando…", "deleteAd": "Eliminar anuncio", "cancel": "Cancelar" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Cajas editables", @@ -1270,7 +1427,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transacciones", @@ -1858,7 +2017,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filtro de palabras", @@ -2205,7 +2392,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2352,7 +2547,247 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } }, @@ -2390,7 +2825,169 @@ "colStatus": "Status", "statusPending": "Pending", "statusApproved": "Approved", - "statusPlayed": "Played" + "statusPlayed": "Played", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/fr.json b/src/messages/fr.json index be549e80..f1b52481 100644 --- a/src/messages/fr.json +++ b/src/messages/fr.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Open menu", "closeMenu": "Close menu", - "drawBadge": "Dessiner un badge" + "drawBadge": "Dessiner un badge", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} en ligne", @@ -71,7 +73,16 @@ "emptySubtitle": "Vous n'avez encore aucun ami ajouté", "subtitle": "{count, plural, one {Vous avez # ami} other {Vous avez # amis}}", "emptyState": "Ajoutez des amis dans l'hôtel et ils apparaîtront ici.", - "noMotto": "Aucune devise" + "noMotto": "Aucune devise", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Messages", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Votre boîte de réception est vide", "offlineSubtitle": "{count, plural, one {# message reçu} other {# messages reçus}}", "offlineEmptyState": "Vous n'avez aucun message hors ligne.", - "unknownUser": "Utilisateur #{id}" + "unknownUser": "Utilisateur #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Aucune devise", @@ -114,7 +148,26 @@ "roomsTitle": "Salons", "roomsSubtitle": "Salons qu'il/elle possède", "roomsEmpty": "Aucun salon à afficher.", - "roomUntitled": "Salon sans titre" + "roomUntitled": "Salon sans titre", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Classements", @@ -180,7 +233,19 @@ "addComment": "Ajouter un commentaire", "commentPlaceholder": "Écrivez votre commentaire…", "postComment": "Publier le commentaire", - "toComment": "pour laisser un commentaire." + "toComment": "pour laisser un commentaire.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Photos", @@ -264,7 +329,10 @@ "pinned": "Épinglé", "locked": "Verrouillé", "userNumber": "Utilisateur #{id}", - "unknown": "Inconnu" + "unknown": "Inconnu", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Retour au forum", @@ -276,7 +344,13 @@ "messageLabel": "Message", "messagePlaceholder": "Écrivez votre premier message…", "postThread": "Publier le sujet", - "cancel": "Annuler" + "cancel": "Annuler", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Boutique", @@ -286,7 +360,22 @@ "allPackages": "Tous les packs", "packagesAvailable": "{count, plural, one {# pack disponible} other {# packs disponibles}}", "empty": "Aucun pack disponible pour le moment.", - "buy": "Acheter" + "buy": "Acheter", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Recharger avec PayPal", @@ -390,7 +479,16 @@ "colStatus": "Statut", "colCreated": "Créé", "statusOpen": "Ouvert", - "statusClosed": "Fermé" + "statusClosed": "Fermé", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Postuler pour {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Vous avez déjà postulé pour {rank}", "aboutYou": "À propos de vous", "aboutPlaceholder": "Dites-nous pourquoi vous seriez un excellent {rank}…", - "applyFor": "Postuler pour {rank}" + "applyFor": "Postuler pour {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Postuler pour rejoindre l'équipe {hotel}", @@ -412,7 +520,17 @@ "pending": "Votre candidature est en attente", "aboutYou": "À propos de vous", "aboutPlaceholder": "Dites-nous pourquoi vous seriez un excellent choix pour {rank}…", - "applyFor": "Postuler pour {rank}" + "applyFor": "Postuler pour {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radio", @@ -467,7 +585,16 @@ "loginToPost": "Connectez-vous pour publier une dédicace.", "latestTitle": "Dernières dédicaces", "latestSubtitle": "Les messages les plus récents des auditeurs", - "empty": "Pas encore de dédicaces. Soyez le premier !" + "empty": "Pas encore de dédicaces. Soyez le premier !", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Concours radio", @@ -513,7 +640,15 @@ "experiencePlaceholder": "Une expérience préalable en tant que DJ ou animateur ?", "motivationLabel": "Motivation", "motivationPlaceholder": "Pourquoi voulez-vous rejoindre l'équipe radio ?", - "submitButton": "Soumettre la candidature" + "submitButton": "Soumettre la candidature", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Paramètres du compte", @@ -588,7 +723,9 @@ "errorInvalidCredentials": "Nom d'utilisateur ou mot de passe invalide", "errorInvalid2fa": "Code A2F invalide", "welcomeBack": "Bon retour", - "welcomeBackSub": "Connecte-toi pour continuer vers {hotelName}" + "welcomeBackSub": "Connecte-toi pour continuer vers {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Créer un compte", @@ -628,7 +765,8 @@ "sentNotice": "Si cet e-mail est enregistré, un lien de réinitialisation a été envoyé. Vérifiez votre boîte de réception.", "emailPlaceholder": "Votre e-mail", "sendResetLink": "Envoyer le lien de réinitialisation", - "backToLogin": "Retour à la connexion" + "backToLogin": "Retour à la connexion", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Définir un nouveau mot de passe", @@ -746,7 +884,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Tableau de bord", @@ -899,7 +1049,14 @@ "saving": "Enregistrement…", "deleteAd": "Supprimer la pub", "cancel": "Annuler" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Boîtes modifiables", @@ -1270,7 +1427,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transactions", @@ -1858,7 +2017,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filtre de mots", @@ -2205,7 +2392,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2352,7 +2547,247 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } }, @@ -2390,7 +2825,169 @@ "colStatus": "Status", "statusPending": "Pending", "statusApproved": "Approved", - "statusPlayed": "Played" + "statusPlayed": "Played", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/hr.json b/src/messages/hr.json index b564bc2f..fb067ebd 100644 --- a/src/messages/hr.json +++ b/src/messages/hr.json @@ -21,7 +21,9 @@ "admin": "Administrator", "openMenu": "Otvori izbornik", "closeMenu": "Zatvori izbornik", - "drawBadge": "Nacrtajte značku" + "drawBadge": "Nacrtajte značku", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Još nemate dodanih prijatelja", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Dodajte prijatelje u hotel i oni će se pojaviti ovdje.", - "noMotto": "Bez mota" + "noMotto": "Bez mota", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Poruke", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Vaš inbox je prazan", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Nemate nijednu izvanmrežnu poruku.", - "unknownUser": "Korisnik #{id}" + "unknownUser": "Korisnik #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Bez mota", @@ -114,7 +148,26 @@ "roomsTitle": "Sobe", "roomsSubtitle": "Sobe koje posjeduju", "roomsEmpty": "Nema soba za pokazati.", - "roomUntitled": "Soba bez naslova" + "roomUntitled": "Soba bez naslova", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "rangiranje", @@ -180,7 +233,19 @@ "addComment": "Dodajte komentar", "commentPlaceholder": "Napišite svoj komentar…", "postComment": "Objavite komentar", - "toComment": "ostaviti komentar." + "toComment": "ostaviti komentar.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotografije", @@ -264,7 +329,10 @@ "pinned": "Prikvačeno", "locked": "Zaključano", "userNumber": "Korisnik #{id}", - "unknown": "Nepoznato" + "unknown": "Nepoznato", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Povratak na forum", @@ -276,7 +344,13 @@ "messageLabel": "Poruka", "messagePlaceholder": "Napišite svoj uvodni post...", "postThread": "Objavi nit", - "cancel": "Odustani" + "cancel": "Odustani", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Trgovina", @@ -286,7 +360,22 @@ "allPackages": "Svi paketi", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Trenutačno nema dostupnih paketa.", - "buy": "Kupiti" + "buy": "Kupiti", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Nadoplatite PayPal", @@ -390,7 +479,16 @@ "colStatus": "Status", "colCreated": "Stvoreno", "statusOpen": "Otvoreno", - "statusClosed": "Zatvoreno" + "statusClosed": "Zatvoreno", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Prijavite se za osoblje {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Već ste se prijavili za {rank}", "aboutYou": "O tebi", "aboutPlaceholder": "Recite nam zašto biste bili izvrstan {rank}…", - "applyFor": "Prijavite se za {rank}" + "applyFor": "Prijavite se za {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Prijavite se za {hotel} tim", @@ -412,7 +520,17 @@ "pending": "Vaša prijava je na čekanju", "aboutYou": "O tebi", "aboutPlaceholder": "Recite nam zašto bi baš vama odgovarao {rank}…", - "applyFor": "Prijavite se za {rank}" + "applyFor": "Prijavite se za {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "radio", @@ -467,7 +585,16 @@ "loginToPost": "Prijavite se da biste objavili shout.", "latestTitle": "Najnoviji uzvici", "latestSubtitle": "Najnovije poruke slušatelja", - "empty": "Još nema povika. Budite prvi!" + "empty": "Još nema povika. Budite prvi!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Radijska natjecanja", @@ -511,7 +638,16 @@ "colStatus": "Status", "statusPending": "Na čekanju", "statusApproved": "Odobreno", - "statusPlayed": "Igrano" + "statusPlayed": "Igrano", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro klijent", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Ima li prethodnog iskustva s DJ-em ili hostingom?", "motivationLabel": "Motivacija", "motivationPlaceholder": "Zašto se želiš pridružiti radijskom timu?", - "submitButton": "Pošaljite prijavu" + "submitButton": "Pošaljite prijavu", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Postavke računa", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Nevažeće korisničko ime ili lozinka", "errorInvalid2fa": "Nevažeći 2FA kod", "welcomeBack": "Dobrodošao natrag", - "welcomeBackSub": "Prijavi se za nastavak u {hotelName}" + "welcomeBackSub": "Prijavi se za nastavak u {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Napravi račun", @@ -664,7 +810,8 @@ "sentNotice": "Ako je ta e-pošta registrirana, poslana je veza za poništavanje. Provjerite svoju pristiglu poštu.", "emailPlaceholder": "Vaš email", "sendResetLink": "Pošalji link za resetiranje", - "backToLogin": "Natrag na prijavu" + "backToLogin": "Natrag na prijavu", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Postavite novu lozinku", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Nadzorna ploča", @@ -935,7 +1094,14 @@ "saving": "Spremanje...", "deleteAd": "Izbriši oglas", "cancel": "Odustani" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Kutije za pisanje", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transakcije", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filtar riječi", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/hu.json b/src/messages/hu.json index f57af8ef..81bb341a 100644 --- a/src/messages/hu.json +++ b/src/messages/hu.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Menü megnyitása", "closeMenu": "Menü bezárása", - "drawBadge": "Rajzolj jelvényt" + "drawBadge": "Rajzolj jelvényt", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Még nincsenek hozzáadott barátaid", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Adjon hozzá barátokat a szállodában, és itt megjelennek.", - "noMotto": "Nincs mottó" + "noMotto": "Nincs mottó", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Üzenetek", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Beérkezett üzenetei üresek", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Nincsenek offline üzenetei.", - "unknownUser": "Felhasználó #{id}" + "unknownUser": "Felhasználó #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Nincs mottó", @@ -114,7 +148,26 @@ "roomsTitle": "Szobák", "roomsSubtitle": "Saját szobák", "roomsEmpty": "Nincs megjeleníthető szoba.", - "roomUntitled": "Névtelen szoba" + "roomUntitled": "Névtelen szoba", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Rangsorok", @@ -180,7 +233,19 @@ "addComment": "Megjegyzés hozzáadása", "commentPlaceholder": "Írja meg véleményét…", "postComment": "Megjegyzés közzététele", - "toComment": "megjegyzést hagyni." + "toComment": "megjegyzést hagyni.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fényképek", @@ -264,7 +329,10 @@ "pinned": "Rögzítve", "locked": "Lezárva", "userNumber": "Felhasználó #{id}", - "unknown": "Ismeretlen" + "unknown": "Ismeretlen", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Vissza a fórumhoz", @@ -276,7 +344,13 @@ "messageLabel": "Üzenet", "messagePlaceholder": "Írd meg a nyitó bejegyzésedet…", "postThread": "Tegye fel a szálat", - "cancel": "Mégse" + "cancel": "Mégse", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Bolt", @@ -286,7 +360,22 @@ "allPackages": "Minden csomag", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Jelenleg nincs elérhető csomag.", - "buy": "Vásároljon" + "buy": "Vásároljon", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Töltse fel PayPal-lal", @@ -390,7 +479,16 @@ "colStatus": "Állapot", "colCreated": "Létrehozva", "statusOpen": "Nyissa meg", - "statusClosed": "Zárva" + "statusClosed": "Zárva", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Jelentkezzen a {hotel} személyzetére", @@ -402,7 +500,17 @@ "alreadyApplied": "Már jelentkezett a(z) {rank}", "aboutYou": "Rólad", "aboutPlaceholder": "Mondd el, miért lennél jó {rank}…", - "applyFor": "Jelentkezés {rank}" + "applyFor": "Jelentkezés {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Jelentkezzen a {hotel} csapatába", @@ -412,7 +520,17 @@ "pending": "Jelentkezése függőben van", "aboutYou": "Rólad", "aboutPlaceholder": "Mondd el, miért lennél kiválóan alkalmas {rank}…", - "applyFor": "Jelentkezés {rank}" + "applyFor": "Jelentkezés {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Rádió", @@ -467,7 +585,16 @@ "loginToPost": "Jelentkezzen be, hogy kiabálást küldjön.", "latestTitle": "Legújabb kiáltások", "latestSubtitle": "A hallgatók legújabb üzenetei", - "empty": "Még nincs kiáltás. Legyen Ön az első!" + "empty": "Még nincs kiáltás. Legyen Ön az első!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Rádióversenyek", @@ -511,7 +638,16 @@ "colStatus": "Állapot", "statusPending": "Függőben", "statusApproved": "Jóváhagyva", - "statusPlayed": "Játszott" + "statusPlayed": "Játszott", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro kliens", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Van előzetes DJ-s vagy házigazdai tapasztalatod?", "motivationLabel": "Motiváció", "motivationPlaceholder": "Miért akarsz csatlakozni a rádió csapatához?", - "submitButton": "Pályázat benyújtása" + "submitButton": "Pályázat benyújtása", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Fiókbeállítások", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Érvénytelen felhasználónév vagy jelszó", "errorInvalid2fa": "Érvénytelen 2FA kód", "welcomeBack": "Üdvözöllek újra", - "welcomeBackSub": "Jelentkezz be a {hotelName} folytatáshoz" + "welcomeBackSub": "Jelentkezz be a {hotelName} folytatáshoz", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Hozzon létre fiókot", @@ -664,7 +810,8 @@ "sentNotice": "Ha ez az e-mail regisztrálva van, akkor visszaállítási hivatkozást küldtek. Ellenőrizze a beérkező leveleket.", "emailPlaceholder": "Az Ön email címe", "sendResetLink": "Reset link küldése", - "backToLogin": "Vissza a bejelentkezéshez" + "backToLogin": "Vissza a bejelentkezéshez", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Állítson be új jelszót", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Irányítópult", @@ -935,7 +1094,14 @@ "saving": "Mentés…", "deleteAd": "Hirdetés törlése", "cancel": "Mégse" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Írható dobozok", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Tranzakciók", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Szószűrő", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/no.json b/src/messages/no.json index 5bd335d1..5d71317d 100644 --- a/src/messages/no.json +++ b/src/messages/no.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Åpne menyen", "closeMenu": "Lukk menyen", - "drawBadge": "Tegn merke" + "drawBadge": "Tegn merke", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Du har ingen venner lagt til ennå", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Legg til venner på hotellet, så dukker de opp her.", - "noMotto": "Ingen motto" + "noMotto": "Ingen motto", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Meldinger", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Innboksen din er tom", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Du har ingen frakoblede meldinger.", - "unknownUser": "Bruker nr. {id}" + "unknownUser": "Bruker nr. {id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Ingen motto", @@ -114,7 +148,26 @@ "roomsTitle": "Rom", "roomsSubtitle": "Rom de eier", "roomsEmpty": "Ingen rom å vise.", - "roomUntitled": "Rom uten tittel" + "roomUntitled": "Rom uten tittel", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Rangeringer", @@ -180,7 +233,19 @@ "addComment": "Legg til en kommentar", "commentPlaceholder": "Skriv din kommentar...", "postComment": "Legg inn kommentar", - "toComment": "for å legge igjen en kommentar." + "toComment": "for å legge igjen en kommentar.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Bilder", @@ -264,7 +329,10 @@ "pinned": "Festet", "locked": "Låst", "userNumber": "Bruker nr. {id}", - "unknown": "Ukjent" + "unknown": "Ukjent", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Tilbake til forumet", @@ -276,7 +344,13 @@ "messageLabel": "Melding", "messagePlaceholder": "Skriv åpningsinnlegget ditt...", "postThread": "Post tråd", - "cancel": "Avbryt" + "cancel": "Avbryt", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Handle", @@ -286,7 +360,22 @@ "allPackages": "Alle pakker", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Ingen tilgjengelige pakker akkurat nå.", - "buy": "Kjøp" + "buy": "Kjøp", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Fyll på med PayPal", @@ -390,7 +479,16 @@ "colStatus": "Status", "colCreated": "Opprettet", "statusOpen": "Åpne", - "statusClosed": "Stengt" + "statusClosed": "Stengt", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Søk på {hotel}-ansatte", @@ -402,7 +500,17 @@ "alreadyApplied": "Du har allerede søkt om {rank}", "aboutYou": "Om deg", "aboutPlaceholder": "Fortell oss hvorfor du ville være en stor {rank}...", - "applyFor": "Søk om {rank}" + "applyFor": "Søk om {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Søk på {hotel}-teamet", @@ -412,7 +520,17 @@ "pending": "Søknaden din er under behandling", "aboutYou": "Om deg", "aboutPlaceholder": "Fortell oss hvorfor du vil passe godt for {rank}...", - "applyFor": "Søk om {rank}" + "applyFor": "Søk om {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radio", @@ -467,7 +585,16 @@ "loginToPost": "Logg inn for å legge ut et rop.", "latestTitle": "Siste rop", "latestSubtitle": "De siste meldingene fra lytterne", - "empty": "Ingen rop ennå. Vær den første!" + "empty": "Ingen rop ennå. Vær den første!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Radiokonkurranser", @@ -511,7 +638,16 @@ "colStatus": "Status", "statusPending": "Venter", "statusApproved": "Godkjent", - "statusPlayed": "Spilt" + "statusPlayed": "Spilt", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro klient", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Noen tidligere DJ eller vertserfaring?", "motivationLabel": "Motivasjon", "motivationPlaceholder": "Hvorfor vil du bli med i radioteamet?", - "submitButton": "Send inn søknad" + "submitButton": "Send inn søknad", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Kontoinnstillinger", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Ugyldig brukernavn eller passord", "errorInvalid2fa": "Ugyldig 2FA-kode", "welcomeBack": "Velkommen tilbake", - "welcomeBackSub": "Logg inn for å fortsette til {hotelName}" + "welcomeBackSub": "Logg inn for å fortsette til {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Opprett konto", @@ -664,7 +810,8 @@ "sentNotice": "Hvis den e-posten er registrert, har en tilbakestillingslenke blitt sendt. Sjekk innboksen din.", "emailPlaceholder": "Din e-post", "sendResetLink": "Send tilbakestillingslink", - "backToLogin": "Tilbake til innlogging" + "backToLogin": "Tilbake til innlogging", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Angi et nytt passord", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Dashbord", @@ -935,7 +1094,14 @@ "saving": "Lagrer …", "deleteAd": "Slett annonse", "cancel": "Avbryt" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Skrivbare bokser", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transaksjoner", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Ordfilter", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/pl.json b/src/messages/pl.json index 3fd7f970..b71c4b0c 100644 --- a/src/messages/pl.json +++ b/src/messages/pl.json @@ -21,7 +21,9 @@ "admin": "Administrator", "openMenu": "Otwórz menu", "closeMenu": "Zamknij menu", - "drawBadge": "Narysuj odznakę" + "drawBadge": "Narysuj odznakę", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Nie masz jeszcze dodanych znajomych", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Dodaj znajomych w hotelu, a oni się tutaj pojawią.", - "noMotto": "Żadnego motta" + "noMotto": "Żadnego motta", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Wiadomości", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Twoja skrzynka odbiorcza jest pusta", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Nie masz żadnych wiadomości offline.", - "unknownUser": "Użytkownik nr {id}" + "unknownUser": "Użytkownik nr {id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Żadnego motta", @@ -114,7 +148,26 @@ "roomsTitle": "Pokoje", "roomsSubtitle": "Pokoje, które są ich własnością", "roomsEmpty": "Brak pokoi do pokazania.", - "roomUntitled": "Pokój bez tytułu" + "roomUntitled": "Pokój bez tytułu", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Rankingi", @@ -180,7 +233,19 @@ "addComment": "Dodaj komentarz", "commentPlaceholder": "Napisz swój komentarz…", "postComment": "Opublikuj komentarz", - "toComment": "aby zostawić komentarz." + "toComment": "aby zostawić komentarz.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Zdjęcia", @@ -264,7 +329,10 @@ "pinned": "Przypięty", "locked": "Zablokowane", "userNumber": "Użytkownik nr {id}", - "unknown": "Nieznany" + "unknown": "Nieznany", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Powrót do forum", @@ -276,7 +344,13 @@ "messageLabel": "Wiadomość", "messagePlaceholder": "Napisz swój post otwierający…", "postThread": "Opublikuj wątek", - "cancel": "Anuluj" + "cancel": "Anuluj", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Sklep", @@ -286,7 +360,22 @@ "allPackages": "Wszystkie pakiety", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "W tej chwili nie są dostępne żadne pakiety.", - "buy": "Kup" + "buy": "Kup", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Doładuj za pomocą PayPal", @@ -390,7 +479,16 @@ "colStatus": "Stan", "colCreated": "Utworzono", "statusOpen": "Otwórz", - "statusClosed": "Zamknięte" + "statusClosed": "Zamknięte", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Aplikuj na pracownika {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Aplikowałeś już na {rank}", "aboutYou": "O tobie", "aboutPlaceholder": "Powiedz nam, dlaczego byłbyś świetnym {rank}…", - "applyFor": "Złóż wniosek o {rank}" + "applyFor": "Złóż wniosek o {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Aplikuj do zespołu {hotel}", @@ -412,7 +520,17 @@ "pending": "Twoje zgłoszenie oczekuje na realizację", "aboutYou": "O tobie", "aboutPlaceholder": "Powiedz nam, dlaczego świetnie nadajesz się na stanowisko {rank}…", - "applyFor": "Złóż wniosek o {rank}" + "applyFor": "Złóż wniosek o {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radia", @@ -467,7 +585,16 @@ "loginToPost": "Zaloguj się, aby opublikować krzyk.", "latestTitle": "Najnowsze krzyki", "latestSubtitle": "Najnowsze wiadomości od słuchaczy", - "empty": "Nie ma jeszcze żadnych krzyków. Bądź pierwszy!" + "empty": "Nie ma jeszcze żadnych krzyków. Bądź pierwszy!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Konkursy radiowe", @@ -511,7 +638,16 @@ "colStatus": "Stan", "statusPending": "Oczekujące", "statusApproved": "Zatwierdzone", - "statusPlayed": "Zagrał" + "statusPlayed": "Zagrał", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Klient nitro", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Jakieś wcześniejsze doświadczenia z DJ-em lub hostingiem?", "motivationLabel": "Motywacja", "motivationPlaceholder": "Dlaczego chcesz dołączyć do zespołu radia?", - "submitButton": "Prześlij wniosek" + "submitButton": "Prześlij wniosek", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Ustawienia konta", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Nieprawidłowa nazwa użytkownika lub hasło", "errorInvalid2fa": "Nieprawidłowy kod 2FA", "welcomeBack": "Witaj z powrotem", - "welcomeBackSub": "Zaloguj się, aby kontynuować w {hotelName}" + "welcomeBackSub": "Zaloguj się, aby kontynuować w {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Utwórz konto", @@ -664,7 +810,8 @@ "sentNotice": "Jeśli ten adres e-mail jest zarejestrowany, został wysłany link resetujący. Sprawdź swoją skrzynkę odbiorczą.", "emailPlaceholder": "Twój e-mail", "sendResetLink": "Wyślij link resetujący", - "backToLogin": "Powrót do logowania" + "backToLogin": "Powrót do logowania", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Ustaw nowe hasło", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Pulpit nawigacyjny", @@ -935,7 +1094,14 @@ "saving": "Zapisuję…", "deleteAd": "Usuń reklamę", "cancel": "Anuluj" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Pudełka z możliwością zapisu", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transakcje", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filtr słów", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/pt.json b/src/messages/pt.json index 880e090a..ace73388 100644 --- a/src/messages/pt.json +++ b/src/messages/pt.json @@ -21,7 +21,9 @@ "admin": "Administrador", "openMenu": "Abrir menu", "closeMenu": "Fechar menu", - "drawBadge": "Desenhar distintivo" + "drawBadge": "Desenhar distintivo", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} on-line", @@ -71,7 +73,16 @@ "emptySubtitle": "Você ainda não adicionou amigos", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Adicione amigos no hotel e eles aparecerão aqui.", - "noMotto": "Sem lema" + "noMotto": "Sem lema", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Mensagens", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Sua caixa de entrada está vazia", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Você não tem mensagens off-line.", - "unknownUser": "Usuário #{id}" + "unknownUser": "Usuário #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Sem lema", @@ -114,7 +148,26 @@ "roomsTitle": "Quartos", "roomsSubtitle": "Quartos que eles possuem", "roomsEmpty": "Não há quartos para mostrar.", - "roomUntitled": "Sala sem título" + "roomUntitled": "Sala sem título", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Classificações", @@ -180,7 +233,19 @@ "addComment": "Adicione um comentário", "commentPlaceholder": "Escreva seu comentário…", "postComment": "Postar comentário", - "toComment": "para deixar um comentário." + "toComment": "para deixar um comentário.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotos", @@ -264,7 +329,10 @@ "pinned": "Fixado", "locked": "Bloqueado", "userNumber": "Usuário #{id}", - "unknown": "Desconhecido" + "unknown": "Desconhecido", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Voltar ao fórum", @@ -276,7 +344,13 @@ "messageLabel": "Mensagem", "messagePlaceholder": "Escreva sua postagem de abertura…", "postThread": "Postar tópico", - "cancel": "Cancelar" + "cancel": "Cancelar", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Loja", @@ -286,7 +360,22 @@ "allPackages": "Todos os pacotes", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Nenhum pacote disponível no momento.", - "buy": "Comprar" + "buy": "Comprar", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Recarregue com PayPal", @@ -390,7 +479,16 @@ "colStatus": "Estado", "colCreated": "Criado", "statusOpen": "Abrir", - "statusClosed": "Fechado" + "statusClosed": "Fechado", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Inscreva-se para funcionários de {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Você já se inscreveu para {rank}", "aboutYou": "Sobre você", "aboutPlaceholder": "Diga-nos por que você seria um ótimo {rank}…", - "applyFor": "Inscreva-se para {rank}" + "applyFor": "Inscreva-se para {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Inscreva-se na equipe do {hotel}", @@ -412,7 +520,17 @@ "pending": "Sua inscrição está pendente", "aboutYou": "Sobre você", "aboutPlaceholder": "Conte-nos por que você seria uma ótima opção para {rank}…", - "applyFor": "Inscreva-se para {rank}" + "applyFor": "Inscreva-se para {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Rádio", @@ -467,7 +585,16 @@ "loginToPost": "Faça login para postar uma mensagem.", "latestTitle": "Últimos gritos", "latestSubtitle": "As mensagens mais recentes dos ouvintes", - "empty": "Nenhum grito ainda. Seja o primeiro!" + "empty": "Nenhum grito ainda. Seja o primeiro!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Concursos de Rádio", @@ -511,7 +638,16 @@ "colStatus": "Estado", "statusPending": "Pendente", "statusApproved": "Aprovado", - "statusPlayed": "Jogado" + "statusPlayed": "Jogado", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Cliente Nitro", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Alguma experiência anterior de DJ ou hospedagem?", "motivationLabel": "Motivação", "motivationPlaceholder": "Por que você quer se juntar à equipe de rádio?", - "submitButton": "Enviar inscrição" + "submitButton": "Enviar inscrição", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Configurações da conta", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Nome de usuário ou senha inválidos", "errorInvalid2fa": "Código 2FA inválido", "welcomeBack": "Bem-vindo de volta", - "welcomeBackSub": "Entre para continuar em {hotelName}" + "welcomeBackSub": "Entre para continuar em {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Criar conta", @@ -664,7 +810,8 @@ "sentNotice": "Se esse e-mail estiver registrado, um link de redefinição foi enviado. Verifique sua caixa de entrada.", "emailPlaceholder": "Seu e-mail", "sendResetLink": "Enviar link de redefinição", - "backToLogin": "Voltar ao login" + "backToLogin": "Voltar ao login", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Defina uma nova senha", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Painel", @@ -935,7 +1094,14 @@ "saving": "Salvando…", "deleteAd": "Excluir anúncio", "cancel": "Cancelar" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Caixas graváveis", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transações", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filtro de palavras", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/ro.json b/src/messages/ro.json index b6990bff..e96d0f10 100644 --- a/src/messages/ro.json +++ b/src/messages/ro.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Deschide meniul", "closeMenu": "Închide meniul", - "drawBadge": "Trage insigna" + "drawBadge": "Trage insigna", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Nu ai niciun prieten adăugat încă", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Adăugați prieteni în hotel și aceștia vor apărea aici.", - "noMotto": "Niciun motto" + "noMotto": "Niciun motto", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Mesaje", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Căsuța dvs. de e-mail este goală", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Nu aveți mesaje offline.", - "unknownUser": "Utilizatorul #{id}" + "unknownUser": "Utilizatorul #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Niciun motto", @@ -114,7 +148,26 @@ "roomsTitle": "Camerele", "roomsSubtitle": "Camerele pe care le dețin", "roomsEmpty": "Nu există camere de afișat.", - "roomUntitled": "Cameră fără titlu" + "roomUntitled": "Cameră fără titlu", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Clasamente", @@ -180,7 +233,19 @@ "addComment": "Adaugă un comentariu", "commentPlaceholder": "Scrie comentariul tau...", "postComment": "Postează comentariu", - "toComment": "sa lasi un comentariu." + "toComment": "sa lasi un comentariu.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotografii", @@ -264,7 +329,10 @@ "pinned": "Fixat", "locked": "Blocat", "userNumber": "Utilizatorul #{id}", - "unknown": "Necunoscut" + "unknown": "Necunoscut", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Înapoi la forum", @@ -276,7 +344,13 @@ "messageLabel": "Mesaj", "messagePlaceholder": "Scrieți postarea de deschidere...", "postThread": "Postează subiectul", - "cancel": "Anulează" + "cancel": "Anulează", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Magazin", @@ -286,7 +360,22 @@ "allPackages": "Toate pachetele", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Nu există pachete disponibile momentan.", - "buy": "Cumpără" + "buy": "Cumpără", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Încărcați cu PayPal", @@ -390,7 +479,16 @@ "colStatus": "Stare", "colCreated": "Creat", "statusOpen": "Deschide", - "statusClosed": "Închis" + "statusClosed": "Închis", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Aplicați pentru personalul {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Ați aplicat deja pentru {rank}", "aboutYou": "Despre tine", "aboutPlaceholder": "Spune-ne de ce ai fi un {rank} grozav...", - "applyFor": "Aplicați pentru {rank}" + "applyFor": "Aplicați pentru {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Aplicați pentru echipa {hotel}", @@ -412,7 +520,17 @@ "pending": "Aplicația dvs. este în așteptare", "aboutYou": "Despre tine", "aboutPlaceholder": "Spune-ne de ce ai fi potrivit pentru {rank}...", - "applyFor": "Aplicați pentru {rank}" + "applyFor": "Aplicați pentru {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radio", @@ -467,7 +585,16 @@ "loginToPost": "Conectați-vă pentru a posta un strigăt.", "latestTitle": "Ultimele strigăte", "latestSubtitle": "Cele mai recente mesaje de la ascultători", - "empty": "Niciun strigăt încă. Fii primul!" + "empty": "Niciun strigăt încă. Fii primul!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Concursuri Radio", @@ -511,7 +638,16 @@ "colStatus": "Stare", "statusPending": "În așteptare", "statusApproved": "Aprobat", - "statusPlayed": "Jucat" + "statusPlayed": "Jucat", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Client Nitro", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Vreo experiență anterioară de DJ sau hosting?", "motivationLabel": "Motivația", "motivationPlaceholder": "De ce vrei să te alături echipei radio?", - "submitButton": "Trimiteți cererea" + "submitButton": "Trimiteți cererea", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Setările contului", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Nume de utilizator sau parolă nevalidă", "errorInvalid2fa": "Cod 2FA nevalid", "welcomeBack": "Bine ai revenit", - "welcomeBackSub": "Autentifică-te pentru a continua pe {hotelName}" + "welcomeBackSub": "Autentifică-te pentru a continua pe {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Creați cont", @@ -664,7 +810,8 @@ "sentNotice": "Dacă acel e-mail este înregistrat, a fost trimis un link de resetare. Verificați-vă căsuța de e-mail.", "emailPlaceholder": "E-mailul dvs", "sendResetLink": "Trimite linkul de resetare", - "backToLogin": "Înapoi la autentificare" + "backToLogin": "Înapoi la autentificare", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Setați o nouă parolă", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Tabloul de bord", @@ -935,7 +1094,14 @@ "saving": "Se salvează…", "deleteAd": "Șterge anunțul", "cancel": "Anulează" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Cutii inscriptibile", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Tranzacții", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filtru de cuvinte", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/ru.json b/src/messages/ru.json index c7ca6888..7df5e2d6 100644 --- a/src/messages/ru.json +++ b/src/messages/ru.json @@ -21,7 +21,9 @@ "admin": "Администратор", "openMenu": "Открыть меню", "closeMenu": "Закрыть меню", - "drawBadge": "Нарисуйте значок" + "drawBadge": "Нарисуйте значок", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} онлайн", @@ -71,7 +73,16 @@ "emptySubtitle": "У вас еще нет добавленных друзей", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Добавьте друзей в отель, и они появятся здесь.", - "noMotto": "Нет девиза" + "noMotto": "Нет девиза", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Сообщения", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Ваш почтовый ящик пуст", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "У вас нет сообщений в автономном режиме.", - "unknownUser": "Пользователь #{id}" + "unknownUser": "Пользователь #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Нет девиза", @@ -114,7 +148,26 @@ "roomsTitle": "Номера", "roomsSubtitle": "Комнаты, которыми они владеют", "roomsEmpty": "Нет комнат для показа.", - "roomUntitled": "Комната без названия" + "roomUntitled": "Комната без названия", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Рейтинг", @@ -180,7 +233,19 @@ "addComment": "Добавить комментарий", "commentPlaceholder": "Напишите свой комментарий...", "postComment": "Оставить комментарий", - "toComment": "чтобы оставить комментарий." + "toComment": "чтобы оставить комментарий.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Фото", @@ -264,7 +329,10 @@ "pinned": "Закреплено", "locked": "Заблокировано", "userNumber": "Пользователь #{id}", - "unknown": "Неизвестно" + "unknown": "Неизвестно", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Вернуться на форум", @@ -276,7 +344,13 @@ "messageLabel": "Сообщение", "messagePlaceholder": "Напишите свою вступительную запись...", "postThread": "Post thread", - "cancel": "Отмена" + "cancel": "Отмена", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Магазин", @@ -286,7 +360,22 @@ "allPackages": "Все пакеты", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "На данный момент нет доступных пакетов.", - "buy": "Купить" + "buy": "Купить", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Пополнить с помощью PayPal", @@ -390,7 +479,16 @@ "colStatus": "Статус", "colCreated": "Создано", "statusOpen": "Открыть", - "statusClosed": "Закрыто" + "statusClosed": "Закрыто", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Подать заявку на персонал {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Вы уже подали заявку на {rank}", "aboutYou": "О вас", "aboutPlaceholder": "Расскажите нам, почему вы были бы отличным {rank}...", - "applyFor": "Применить для {rank}" + "applyFor": "Применить для {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Подать заявку на команду {hotel}", @@ -412,7 +520,17 @@ "pending": "Ваша заявка на рассмотрении", "aboutYou": "О вас", "aboutPlaceholder": "Расскажите нам, почему вы отлично подходите для {rank}...", - "applyFor": "Применить для {rank}" + "applyFor": "Применить для {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Радио", @@ -467,7 +585,16 @@ "loginToPost": "Войдите, чтобы опубликовать сообщение.", "latestTitle": "Последние крики", "latestSubtitle": "Самые свежие сообщения от слушателей", - "empty": "Пока никаких криков. Будьте первыми!" + "empty": "Пока никаких криков. Будьте первыми!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Конкурсы радио", @@ -511,7 +638,16 @@ "colStatus": "Статус", "statusPending": "В ожидании", "statusApproved": "Утвердил", - "statusPlayed": "Сыграно" + "statusPlayed": "Сыграно", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Клиент Nitro", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Есть ли у вас опыт диджея или приема гостей?", "motivationLabel": "Мотивация", "motivationPlaceholder": "Почему вы хотите присоединиться к команде радио?", - "submitButton": "Подать заявку" + "submitButton": "Подать заявку", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Настройки аккаунта", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Неверное имя пользователя или пароль", "errorInvalid2fa": "Недействительный код 2FA", "welcomeBack": "С возвращением", - "welcomeBackSub": "Войди, чтобы продолжить в {hotelName}" + "welcomeBackSub": "Войди, чтобы продолжить в {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Создать аккаунт", @@ -664,7 +810,8 @@ "sentNotice": "Если это письмо зарегистрировано, ссылка для сброса отправлена. Проверьте папку «Входящие».", "emailPlaceholder": "Ваш адрес электронной почты", "sendResetLink": "Отправить ссылку для сброса", - "backToLogin": "Назад к входу" + "backToLogin": "Назад к входу", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Установить новый пароль", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Панель управления", @@ -935,7 +1094,14 @@ "saving": "Сохранение...", "deleteAd": "Удалить объявление", "cancel": "Отмена" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Записываемые коробки", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transactions", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Word Filter", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/sk.json b/src/messages/sk.json index 20b25a7c..f8fd8f9b 100644 --- a/src/messages/sk.json +++ b/src/messages/sk.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Otvoriť menu", "closeMenu": "Zatvoriť ponuku", - "drawBadge": "Nakreslite odznak" + "drawBadge": "Nakreslite odznak", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Zatiaľ ste nepridali žiadnych priateľov", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Pridajte priateľov do hotela a zobrazia sa tu.", - "noMotto": "Žiadne motto" + "noMotto": "Žiadne motto", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Správy", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Vaša doručená pošta je prázdna", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Nemáte žiadne offline správy.", - "unknownUser": "Používateľ #{id}" + "unknownUser": "Používateľ #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Žiadne motto", @@ -114,7 +148,26 @@ "roomsTitle": "Izby", "roomsSubtitle": "Izby, ktoré vlastnia", "roomsEmpty": "Žiadne miestnosti na zobrazenie.", - "roomUntitled": "Izba bez názvu" + "roomUntitled": "Izba bez názvu", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Rebríček", @@ -180,7 +233,19 @@ "addComment": "Pridať komentár", "commentPlaceholder": "Napíšte svoj komentár…", "postComment": "Uverejniť komentár", - "toComment": "zanechať komentár." + "toComment": "zanechať komentár.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotografie", @@ -264,7 +329,10 @@ "pinned": "Pripnuté", "locked": "Zamknuté", "userNumber": "Používateľ #{id}", - "unknown": "Neznámy" + "unknown": "Neznámy", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Späť na fórum", @@ -276,7 +344,13 @@ "messageLabel": "Správa", "messagePlaceholder": "Napíšte svoj úvodný príspevok...", "postThread": "Uverejniť vlákno", - "cancel": "Zrušiť" + "cancel": "Zrušiť", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Obchod", @@ -286,7 +360,22 @@ "allPackages": "Všetky balíčky", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Momentálne nie sú k dispozícii žiadne balíčky.", - "buy": "Kúpiť" + "buy": "Kúpiť", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Doplňte cez PayPal", @@ -390,7 +479,16 @@ "colStatus": "Stav", "colCreated": "Vytvorené", "statusOpen": "Otvorte", - "statusClosed": "Zatvorené" + "statusClosed": "Zatvorené", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Požiadajte o personál {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Už ste požiadali o {rank}", "aboutYou": "O vás", "aboutPlaceholder": "Povedzte nám, prečo by ste boli skvelým {rank}…", - "applyFor": "Požiadať o {rank}" + "applyFor": "Požiadať o {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Prihláste sa do tímu {hotel}", @@ -412,7 +520,17 @@ "pending": "Vaša žiadosť čaká na spracovanie", "aboutYou": "O vás", "aboutPlaceholder": "Povedzte nám, prečo by ste sa skvele hodili na {rank}…", - "applyFor": "Požiadať o {rank}" + "applyFor": "Požiadať o {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Rádio", @@ -467,7 +585,16 @@ "loginToPost": "Ak chcete uverejniť výkrik, prihláste sa.", "latestTitle": "Najnovšie výkriky", "latestSubtitle": "Najnovšie správy od poslucháčov", - "empty": "Zatiaľ žiadne výkriky. Buďte prvý!" + "empty": "Zatiaľ žiadne výkriky. Buďte prvý!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Rádiové súťaže", @@ -511,7 +638,16 @@ "colStatus": "Stav", "statusPending": "Čaká na spracovanie", "statusApproved": "Schválené", - "statusPlayed": "Hrané" + "statusPlayed": "Hrané", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro klient", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Máte nejaké predchádzajúce skúsenosti s DJ-om alebo hosťovaním?", "motivationLabel": "Motivácia", "motivationPlaceholder": "Prečo sa chceš stať členom rozhlasového tímu?", - "submitButton": "Odoslať žiadosť" + "submitButton": "Odoslať žiadosť", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Nastavenia účtu", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Neplatné používateľské meno alebo heslo", "errorInvalid2fa": "Neplatný kód 2FA", "welcomeBack": "Vitaj späť", - "welcomeBackSub": "Prihlás sa pre pokračovanie do {hotelName}" + "welcomeBackSub": "Prihlás sa pre pokračovanie do {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Vytvoriť účet", @@ -664,7 +810,8 @@ "sentNotice": "Ak je tento e-mail zaregistrovaný, bol odoslaný odkaz na obnovenie. Skontrolujte si doručenú poštu.", "emailPlaceholder": "Váš email", "sendResetLink": "Odoslať odkaz na obnovenie", - "backToLogin": "Späť na prihlásenie" + "backToLogin": "Späť na prihlásenie", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Nastavte si nové heslo", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Dashboard", @@ -935,7 +1094,14 @@ "saving": "Ukladá sa…", "deleteAd": "Odstrániť inzerát", "cancel": "Zrušiť" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Zapisovateľné boxy", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transakcie", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Filter slov", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/sr.json b/src/messages/sr.json index 0ac2e061..d0cb753c 100644 --- a/src/messages/sr.json +++ b/src/messages/sr.json @@ -21,7 +21,9 @@ "admin": "Админ", "openMenu": "Отворите мени", "closeMenu": "Затвори мени", - "drawBadge": "Нацртај значку" + "drawBadge": "Нацртај значку", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} на мрежи", @@ -71,7 +73,16 @@ "emptySubtitle": "You have no friends added yet", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Add friends in the hotel and they will show up here.", - "noMotto": "Нема мото" + "noMotto": "Нема мото", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Поруке", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Ваше пријемно сандуче је празно", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "You have no offline messages.", - "unknownUser": "Корисник #{id}" + "unknownUser": "Корисник #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Нема мото", @@ -114,7 +148,26 @@ "roomsTitle": "Собе", "roomsSubtitle": "Собе које поседују", "roomsEmpty": "Нема соба за приказ.", - "roomUntitled": "Унтитлед роом" + "roomUntitled": "Унтитлед роом", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Ранкингс", @@ -180,7 +233,19 @@ "addComment": "Додајте коментар", "commentPlaceholder": "Напишите свој коментар…", "postComment": "Објавите коментар", - "toComment": "да оставите коментар." + "toComment": "да оставите коментар.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Фотографије", @@ -264,7 +329,10 @@ "pinned": "Закачен", "locked": "Закључано", "userNumber": "Корисник #{id}", - "unknown": "Непознато" + "unknown": "Непознато", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Назад на форум", @@ -276,7 +344,13 @@ "messageLabel": "Порука", "messagePlaceholder": "Write your opening post…", "postThread": "Пост тхреад", - "cancel": "Откажи" + "cancel": "Откажи", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Схоп", @@ -286,7 +360,22 @@ "allPackages": "Сви пакети", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "No packages available right now.", - "buy": "Купи" + "buy": "Купи", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Допуните преко ПаиПал-а", @@ -390,7 +479,16 @@ "colStatus": "Статус", "colCreated": "Цреатед", "statusOpen": "Отвори", - "statusClosed": "Затворено" + "statusClosed": "Затворено", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Пријавите се за особље {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "You have already applied for {rank}", "aboutYou": "О теби", "aboutPlaceholder": "Tell us why you'd be a great {rank}…", - "applyFor": "Пријавите се за {rank}" + "applyFor": "Пријавите се за {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Пријавите се за {hotel} тим", @@ -412,7 +520,17 @@ "pending": "Your application is pending", "aboutYou": "О теби", "aboutPlaceholder": "Tell us why you'd be a great fit for {rank}…", - "applyFor": "Пријавите се за {rank}" + "applyFor": "Пријавите се за {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Радио", @@ -467,7 +585,16 @@ "loginToPost": "Пријавите се да бисте објавили узвик.", "latestTitle": "Најновији узвици", "latestSubtitle": "Најновије поруке слушалаца", - "empty": "Још нема вике. Будите први!" + "empty": "Још нема вике. Будите први!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Радио Цонтестс", @@ -511,7 +638,16 @@ "colStatus": "Статус", "statusPending": "На чекању", "statusApproved": "Одобрено", - "statusPlayed": "Играо" + "statusPlayed": "Играо", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Нитро клијент", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Any prior DJ or hosting experience?", "motivationLabel": "Мотивација", "motivationPlaceholder": "Why do you want to join the radio team?", - "submitButton": "Пошаљите пријаву" + "submitButton": "Пошаљите пријаву", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Подешавања налога", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Неважеће корисничко име или лозинка", "errorInvalid2fa": "Неважећи 2ФА код", "welcomeBack": "Добродошао назад", - "welcomeBackSub": "Пријави се да наставиш ка {hotelName}" + "welcomeBackSub": "Пријави се да наставиш ка {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Креирајте налог", @@ -664,7 +810,8 @@ "sentNotice": "Ако је тај емаил регистрован, послата је веза за ресетовање. Проверите пријемно сандуче.", "emailPlaceholder": "Ваш емаил", "sendResetLink": "Пошаљи везу за ресетовање", - "backToLogin": "Назад на пријаву" + "backToLogin": "Назад на пријаву", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Поставите нову лозинку", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Дасхбоард", @@ -935,7 +1094,14 @@ "saving": "Чување…", "deleteAd": "Избриши оглас", "cancel": "Откажи" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Кутије за писање", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Трансакције", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Филтер речи", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/sv.json b/src/messages/sv.json index 9414bbe0..b710520e 100644 --- a/src/messages/sv.json +++ b/src/messages/sv.json @@ -21,7 +21,9 @@ "admin": "Admin", "openMenu": "Öppna menyn", "closeMenu": "Stäng menyn", - "drawBadge": "Rita märke" + "drawBadge": "Rita märke", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} online", @@ -71,7 +73,16 @@ "emptySubtitle": "Du har inga vänner lagt till än", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Lägg till vänner på hotellet så dyker de upp här.", - "noMotto": "Inget motto" + "noMotto": "Inget motto", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Meddelanden", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Din inkorg är tom", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Du har inga offlinemeddelanden.", - "unknownUser": "Användare #{id}" + "unknownUser": "Användare #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Inget motto", @@ -114,7 +148,26 @@ "roomsTitle": "Rum", "roomsSubtitle": "Rum de äger", "roomsEmpty": "Inga rum att visa.", - "roomUntitled": "Namnlöst rum" + "roomUntitled": "Namnlöst rum", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Ranking", @@ -180,7 +233,19 @@ "addComment": "Lägg till en kommentar", "commentPlaceholder": "Skriv din kommentar...", "postComment": "Skriv kommentar", - "toComment": "för att lämna en kommentar." + "toComment": "för att lämna en kommentar.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Foton", @@ -264,7 +329,10 @@ "pinned": "Fäst", "locked": "Låst", "userNumber": "Användare #{id}", - "unknown": "Okänd" + "unknown": "Okänd", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Tillbaka till forumet", @@ -276,7 +344,13 @@ "messageLabel": "Meddelande", "messagePlaceholder": "Skriv ditt inledande inlägg...", "postThread": "Inlägg tråd", - "cancel": "Avbryt" + "cancel": "Avbryt", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Handla", @@ -286,7 +360,22 @@ "allPackages": "Alla paket", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Inga paket tillgängliga just nu.", - "buy": "Köp" + "buy": "Köp", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Fyll på med PayPal", @@ -390,7 +479,16 @@ "colStatus": "Status", "colCreated": "Skapad", "statusOpen": "Öppna", - "statusClosed": "Stängt" + "statusClosed": "Stängt", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Ansök om {hotel} personal", @@ -402,7 +500,17 @@ "alreadyApplied": "Du har redan ansökt om {rank}", "aboutYou": "Om dig", "aboutPlaceholder": "Berätta för oss varför du skulle vara en stor {rank}...", - "applyFor": "Ansök om {rank}" + "applyFor": "Ansök om {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Ansök till {hotel}-teamet", @@ -412,7 +520,17 @@ "pending": "Din ansökan väntar", "aboutYou": "Om dig", "aboutPlaceholder": "Berätta för oss varför du skulle passa bra för {rank}...", - "applyFor": "Ansök om {rank}" + "applyFor": "Ansök om {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radio", @@ -467,7 +585,16 @@ "loginToPost": "Logga in för att skicka ett rop.", "latestTitle": "Senaste ropen", "latestSubtitle": "De senaste meddelandena från lyssnare", - "empty": "Inga rop än. Bli först!" + "empty": "Inga rop än. Bli först!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Radiotävlingar", @@ -511,7 +638,16 @@ "colStatus": "Status", "statusPending": "Väntar", "statusApproved": "Godkänd", - "statusPlayed": "Spelade" + "statusPlayed": "Spelade", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro klient", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Någon tidigare erfarenhet av DJ eller hosting?", "motivationLabel": "Motivation", "motivationPlaceholder": "Varför vill du gå med i radioteamet?", - "submitButton": "Skicka in ansökan" + "submitButton": "Skicka in ansökan", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Kontoinställningar", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Ogiltigt användarnamn eller lösenord", "errorInvalid2fa": "Ogiltig 2FA-kod", "welcomeBack": "Välkommen tillbaka", - "welcomeBackSub": "Logga in för att fortsätta till {hotelName}" + "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." }, "register": { "title": "Skapa konto", @@ -664,7 +810,8 @@ "sentNotice": "Om det e-postmeddelandet är registrerat har en återställningslänk skickats. Kontrollera din inkorg.", "emailPlaceholder": "Din e-post", "sendResetLink": "Skicka återställningslänk", - "backToLogin": "Tillbaka till inloggning" + "backToLogin": "Tillbaka till inloggning", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Ange ett nytt lösenord", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Instrumentbräda", @@ -935,7 +1094,14 @@ "saving": "Sparar...", "deleteAd": "Ta bort annonsen", "cancel": "Avbryt" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Skrivbara lådor", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "Transaktioner", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Ordfilter", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/tr.json b/src/messages/tr.json index 9454b634..ee3383b4 100644 --- a/src/messages/tr.json +++ b/src/messages/tr.json @@ -21,7 +21,9 @@ "admin": "Yönetici", "openMenu": "Menüyü aç", "closeMenu": "Menüyü kapat", - "drawBadge": "Rozet çiz" + "drawBadge": "Rozet çiz", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} çevrimiçi", @@ -71,7 +73,16 @@ "emptySubtitle": "Henüz hiç arkadaşınız eklenmedi", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Otele arkadaşlarınızı ekleyin, burada görünecekler.", - "noMotto": "Slogan yok" + "noMotto": "Slogan yok", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Mesajlar", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Gelen kutunuz boş", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "Çevrimdışı mesajınız yok.", - "unknownUser": "Kullanıcı #{id}" + "unknownUser": "Kullanıcı #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Slogan yok", @@ -114,7 +148,26 @@ "roomsTitle": "Odalar", "roomsSubtitle": "Sahip oldukları odalar", "roomsEmpty": "Gösterilecek oda yok.", - "roomUntitled": "Başlıksız oda" + "roomUntitled": "Başlıksız oda", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Sıralamalar", @@ -180,7 +233,19 @@ "addComment": "Yorum ekle", "commentPlaceholder": "Yorumunuzu yazın…", "postComment": "Yorum gönder", - "toComment": "Yorum bırakmak için." + "toComment": "Yorum bırakmak için.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Fotoğraflar", @@ -264,7 +329,10 @@ "pinned": "Sabitlendi", "locked": "Kilitli", "userNumber": "Kullanıcı #{id}", - "unknown": "Bilinmiyor" + "unknown": "Bilinmiyor", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Foruma geri dön", @@ -276,7 +344,13 @@ "messageLabel": "Mesaj", "messagePlaceholder": "Açılış yazınızı yazın…", "postThread": "Konuyu gönder", - "cancel": "İptal" + "cancel": "İptal", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Mağaza", @@ -286,7 +360,22 @@ "allPackages": "Tüm paketler", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Şu anda mevcut paket yok.", - "buy": "Satın al" + "buy": "Satın al", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "PayPal ile yükleme yapın", @@ -390,7 +479,16 @@ "colStatus": "Durum", "colCreated": "Oluşturuldu", "statusOpen": "Açık", - "statusClosed": "Kapalı" + "statusClosed": "Kapalı", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "{hotel} personeli için başvur", @@ -402,7 +500,17 @@ "alreadyApplied": "{rank} için zaten başvuruda bulundunuz", "aboutYou": "senin hakkında", "aboutPlaceholder": "Bize neden harika bir {rank} olacağınızı söyleyin…", - "applyFor": "{rank} için başvur" + "applyFor": "{rank} için başvur", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "{hotel} ekibine başvurun", @@ -412,7 +520,17 @@ "pending": "Başvurunuz beklemede", "aboutYou": "senin hakkında", "aboutPlaceholder": "Bize neden {rank} için çok uygun olduğunuzu anlatın…", - "applyFor": "{rank} için başvur" + "applyFor": "{rank} için başvur", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "Radyo", @@ -467,7 +585,16 @@ "loginToPost": "Bir duyuru göndermek için giriş yapın.", "latestTitle": "En son bağırışlar", "latestSubtitle": "Dinleyicilerden gelen en son mesajlar", - "empty": "Henüz bağırış yok. İlk siz olun!" + "empty": "Henüz bağırış yok. İlk siz olun!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Radyo Yarışmaları", @@ -511,7 +638,16 @@ "colStatus": "Durum", "statusPending": "Beklemede", "statusApproved": "Onaylandı", - "statusPlayed": "Oynandı" + "statusPlayed": "Oynandı", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Nitro istemcisi", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Daha önce DJ veya hosting deneyiminiz var mı?", "motivationLabel": "Motivasyon", "motivationPlaceholder": "Neden radyo ekibine katılmak istiyorsunuz?", - "submitButton": "Başvuruyu gönder" + "submitButton": "Başvuruyu gönder", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Hesap ayarları", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Geçersiz kullanıcı adı veya şifre", "errorInvalid2fa": "Geçersiz 2FA kodu", "welcomeBack": "Tekrar hoş geldin", - "welcomeBackSub": "{hotelName} devam etmek için giriş yap" + "welcomeBackSub": "{hotelName} devam etmek için giriş yap", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Hesap oluştur", @@ -664,7 +810,8 @@ "sentNotice": "Bu e-posta kayıtlıysa, bir sıfırlama bağlantısı gönderilmiştir. Gelen kutunuzu kontrol edin.", "emailPlaceholder": "E-postanız", "sendResetLink": "Sıfırlama bağlantısını gönder", - "backToLogin": "Girişe geri dön" + "backToLogin": "Girişe geri dön", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Yeni bir şifre belirleyin", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Kontrol Paneli", @@ -935,7 +1094,14 @@ "saving": "Kaydediliyor…", "deleteAd": "Reklamı sil", "cancel": "İptal" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Yazılabilir Kutular", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "İşlemler", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Kelime Filtresi", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } } diff --git a/src/messages/uk.json b/src/messages/uk.json index 42b99ed0..f3dc85de 100644 --- a/src/messages/uk.json +++ b/src/messages/uk.json @@ -21,7 +21,9 @@ "admin": "адмін", "openMenu": "Відкрити меню", "closeMenu": "Закрити меню", - "drawBadge": "Намалюйте значок" + "drawBadge": "Намалюйте значок", + "events": "Events", + "polls": "Polls" }, "header": { "online": "{count} {hotel} онлайн", @@ -71,7 +73,16 @@ "emptySubtitle": "Ви ще не додали друзів", "subtitle": "{count, plural, one {You have # friend} other {You have # friends}}", "emptyState": "Додайте друзів у готель, і вони з’являться тут.", - "noMotto": "Без девізу" + "noMotto": "Без девізу", + "remove": "Remove", + "success": { + "removed": "Friend removed." + }, + "errors": { + "notFound": "That friendship was not found.", + "invalid": "Invalid friend.", + "error": "Something went wrong. Please try again." + } }, "messages": { "title": "Повідомлення", @@ -86,7 +97,30 @@ "offlineEmptySubtitle": "Ваша папка \"Вхідні\" порожня", "offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}", "offlineEmptyState": "У вас немає офлайн-повідомлень.", - "unknownUser": "Користувач #{id}" + "unknownUser": "Користувач #{id}", + "decline": "Decline", + "composeTitle": "Send offline message", + "composeSubtitle": "Delivered in the hotel messenger when your friend is offline", + "composeEmptyFriends": "Add friends in the hotel to send offline messages.", + "composeFriendLabel": "Friend", + "composeFriendPlaceholder": "Choose a friend", + "composeMessageLabel": "Message", + "composeMessagePlaceholder": "Write your message (max 500 characters)…", + "composeSend": "Send message", + "success": { + "accepted": "Friend request accepted.", + "declined": "Friend request declined.", + "sent": "Offline message sent." + }, + "errors": { + "notFound": "That friend request was not found.", + "unauthorized": "You can't act on this friend request.", + "invalid": "Invalid friend request.", + "error": "Something went wrong. Please try again.", + "notFriend": "You can only message friends.", + "emptyMessage": "Please write a message.", + "rateLimited": "Too many messages. Wait a moment and try again." + } }, "profile": { "noMotto": "Без девізу", @@ -114,7 +148,26 @@ "roomsTitle": "Кімнати", "roomsSubtitle": "Кімнати у них є", "roomsEmpty": "Немає кімнат для показу.", - "roomUntitled": "Кімната без назви" + "roomUntitled": "Кімната без назви", + "addFriend": "Add friend", + "alreadyFriends": "You're friends", + "requestPending": "Request pending", + "respondInMessages": "Respond in Messages", + "success": { + "sent": "Friend request sent.", + "guestbook": "Guestbook message posted." + }, + "errors": { + "self": "You can't send a friend request to yourself.", + "alreadyFriends": "You're already friends with this user.", + "alreadyPending": "You already sent a friend request to this user.", + "incomingPending": "This user already sent you a request — accept or decline it in Messages.", + "empty": "Please write a message before posting.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "invalid": "That request was invalid.", + "error": "Something went wrong. Please try again." + } }, "rankings": { "title": "Рейтинги", @@ -180,7 +233,19 @@ "addComment": "Додайте коментар", "commentPlaceholder": "Напишіть свій коментар…", "postComment": "Опублікувати коментар", - "toComment": "щоб залишити коментар." + "toComment": "щоб залишити коментар.", + "success": { + "posted": "Comment posted.", + "reaction": "Reaction updated." + }, + "errors": { + "empty": "Please write a comment before posting.", + "moderated": "That comment was blocked by moderation.", + "ratelimit": "You're commenting too fast. Please wait a moment and try again.", + "invalid": "Invalid comment.", + "notFound": "That article was not found.", + "error": "Something went wrong. Please try again." + } }, "photos": { "title": "Фотографії", @@ -264,7 +329,10 @@ "pinned": "Закріплено", "locked": "Заблоковано", "userNumber": "Користувач #{id}", - "unknown": "Невідомий" + "unknown": "Невідомий", + "success": { + "posted": "Thread posted." + } }, "guildForumNew": { "backToForum": "← Повернутися на форум", @@ -276,7 +344,13 @@ "messageLabel": "повідомлення", "messagePlaceholder": "Напишіть свій вступний пост…", "postThread": "Опублікувати тему", - "cancel": "Скасувати" + "cancel": "Скасувати", + "errors": { + "invalid": "Subject and message are required.", + "notFound": "That guild was not found.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "shop": { "title": "Магазин", @@ -286,7 +360,22 @@ "allPackages": "Всі пакети", "packagesAvailable": "{count, plural, one {# package available} other {# packages available}}", "empty": "Зараз немає доступних пакетів.", - "buy": "купити" + "buy": "купити", + "loginToBuy": "Log in to buy", + "creditsHint": "Packages are paid with in-game credits. Top up first if you need more.", + "topUpLink": "Top up credits", + "priceCredits": "{credits} credits (≈ {usd})", + "priceCreditsShort": "{credits} cr", + "success": { + "bought": "Package purchased — rewards have been added to your account.", + "boughtNamed": "You purchased \"{name}\" — rewards have been added to your account." + }, + "errors": { + "invalid": "That package is no longer available.", + "credits": "You don't have enough credits for this package.", + "ratelimit": "You're purchasing too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "topup": { "title": "Поповнити через PayPal", @@ -390,7 +479,16 @@ "colStatus": "Статус", "colCreated": "Створено", "statusOpen": "відкритий", - "statusClosed": "Закрито" + "statusClosed": "Закрито", + "success": { + "created": "Ticket submitted." + }, + "errors": { + "invalid": "Please fill in a subject and description.", + "moderated": "That ticket was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyStaff": { "title": "Подайте заявку на роботу в {hotel}", @@ -402,7 +500,17 @@ "alreadyApplied": "Ви вже подали заявку на {rank}", "aboutYou": "Про вас", "aboutPlaceholder": "Розкажіть нам, чому ви стали б чудовим {rank}…", - "applyFor": "Подати заявку на {rank}" + "applyFor": "Подати заявку на {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this position.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "applyTeam": { "title": "Подайте заявку в команду {hotel}", @@ -412,7 +520,17 @@ "pending": "Ваша заявка очікує на розгляд", "aboutYou": "Про вас", "aboutPlaceholder": "Розкажіть нам, чому вам підійде {rank}…", - "applyFor": "Подати заявку на {rank}" + "applyFor": "Подати заявку на {rank}", + "success": { + "submitted": "Application submitted — staff will review it soon." + }, + "errors": { + "empty": "Please write at least 10 characters about yourself.", + "invalid": "Invalid application.", + "duplicate": "You have already applied for this team.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radio": { "title": "радіо", @@ -467,7 +585,16 @@ "loginToPost": "Увійдіть, щоб опублікувати крик.", "latestTitle": "Останні крики", "latestSubtitle": "Найновіші повідомлення від слухачів", - "empty": "Ще немає криків. Будь першим!" + "empty": "Ще немає криків. Будь першим!", + "success": { + "posted": "Shout posted." + }, + "errors": { + "invalid": "Please write a message before shouting.", + "moderated": "That shout was blocked by moderation.", + "ratelimit": "You're shouting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "radioContests": { "title": "Радіоконкурси", @@ -511,7 +638,16 @@ "colStatus": "Статус", "statusPending": "В очікуванні", "statusApproved": "Затверджено", - "statusPlayed": "Грав" + "statusPlayed": "Грав", + "success": { + "posted": "Request submitted." + }, + "errors": { + "empty": "Please enter a song title or artist.", + "invalid": "Invalid request.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "client": { "title": "Клієнт Nitro", @@ -549,7 +685,15 @@ "experiencePlaceholder": "Маєте попередній досвід ді-джея чи хостингу?", "motivationLabel": "Мотивація", "motivationPlaceholder": "Чому ви хочете приєднатися до команди радіо?", - "submitButton": "Подати заявку" + "submitButton": "Подати заявку", + "success": { + "submitted": "Application submitted — we will get back to you soon." + }, + "errors": { + "invalid": "Please fill in all required fields.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } }, "settings": { "accountSettings": "Налаштування облікового запису", @@ -624,7 +768,9 @@ "errorInvalidCredentials": "Недійсне ім'я користувача або пароль", "errorInvalid2fa": "Недійсний код 2FA", "welcomeBack": "З поверненням", - "welcomeBackSub": "Увійди, щоб продовжити в {hotelName}" + "welcomeBackSub": "Увійди, щоб продовжити в {hotelName}", + "errorUnverified": "Please verify your email before signing in.", + "errorCaptcha": "Captcha verification failed. Please try again." }, "register": { "title": "Створити акаунт", @@ -664,7 +810,8 @@ "sentNotice": "Якщо ця електронна адреса зареєстрована, буде надіслано посилання для скидання. Перевірте свою поштову скриньку.", "emailPlaceholder": "Ваш email", "sendResetLink": "Надіслати посилання для скидання", - "backToLogin": "Назад до входу" + "backToLogin": "Назад до входу", + "errorCaptcha": "Captcha verification failed. Please try again." }, "reset": { "title": "Встановіть новий пароль", @@ -782,7 +929,19 @@ "hubCatalog": "Catalog & rares", "hubShop": "Shop & payments", "hubTools": "Tools", - "hubObservability": "Observability" + "hubObservability": "Observability", + "helpTickets": "Help-center tickets", + "marketplace": "Marketplace", + "expandAll": "Expand all", + "collapseAll": "Collapse all", + "community": "Community", + "monitoring": "Monitoring", + "staffAccess": "Ranks & permissions", + "multiAccounts": "Multi-accounts", + "chatLog": "Chat log", + "commandLog": "Command log", + "tradeLog": "Trade log", + "tools": "Tools" }, "dashboard": { "title": "Приладова панель", @@ -935,7 +1094,14 @@ "saving": "Збереження…", "deleteAd": "Видалити оголошення", "cancel": "Скасувати" - } + }, + "deleteSuccess": "Advertisement deleted!", + "deleteError": "Failed to delete advertisement.", + "adsCount": "Total ads", + "latest": "Latest", + "mostRecentAd": "Most recent ad", + "allAds": "All advertisements", + "colPreview": "Preview" }, "writeableBoxes": { "title": "Коробки для запису", @@ -1306,7 +1472,9 @@ "colPosition": "Position", "colTransaction": "Transaction", "colUser": "User", - "colDescription": "Description" + "colDescription": "Description", + "pageOf": "Page {page} of {lastPage}", + "packagesTotal": "{count} packages" }, "transactions": { "title": "транзакції", @@ -1894,7 +2062,35 @@ "userPrefix": "user", "pagination": "Page {page} of {pages} · {total} total", "next": "Next", - "prev": "Previous" + "prev": "Previous", + "unknownUser": "unknown", + "emptyValue": "-", + "colTime": "Time", + "audit": { + "colTargetId": "Target ID", + "colDetails": "Details", + "colDate": "Date", + "searchPlaceholder": "Search by action or target…", + "changesCount": "{count} changes", + "notAvailable": "N/A" + }, + "chat": { + "colMessage": "Message", + "colRoomId": "Room ID", + "searchPlaceholder": "Search by username or message…" + }, + "commands": { + "colCommand": "Command", + "colParams": "Params", + "searchPlaceholder": "Search by username, command, or params…" + }, + "trades": { + "colUserOne": "User one", + "colUserTwo": "User two", + "colStatus": "Status", + "statusUnknown": "unknown", + "searchPlaceholder": "Search by username…" + } }, "wordfilter": { "title": "Фільтр Word", @@ -2241,7 +2437,15 @@ "pets": "Pets", "petsDescription": "Import pet data and icons.", "clone": "Clone", - "cloneDescription": "Clone existing items from one source to another." + "cloneDescription": "Clone existing items from one source to another.", + "upload": "Upload .nitro", + "uploadDescription": "Upload .nitro bundles and icons directly without SWF conversion.", + "sync": "Auto Sync", + "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", + "auditDescription": "Scan your catalog for missing entries, broken references, and items missing from clone sources." }, "translations": { "title": "Translations", @@ -2388,9 +2592,402 @@ "devops": "DevOps", "errors": "Errors", "alerts": "Alerts", - "toolsGroup": "Tools" + "toolsGroup": "Tools", + "helpTickets": "Help-center tickets" + }, + "events": "Events", + "eventsSubtitle": "Hotel events and event types", + "tickets": "Support desk", + "ticketsSubtitle": "CMS tickets, help-center tickets, and reply templates", + "staffAccess": "Ranks & permissions", + "staffAccessSubtitle": "Staff ranks, ACL permissions and housekeeping access", + "analytics": "Analytics", + "analyticsSubtitle": "Hotel activity, retention and economy", + "devops": "DevOps", + "devopsSubtitle": "Service health and emulator errors" + }, + "events": { + "newEvent": "+ New event", + "createTitle": "Create event", + "createSubtitle": "Schedule a new hotel event", + "searchPlaceholder": "Search events…", + "colId": "ID", + "colTitle": "Title", + "colType": "Type", + "colStarts": "Starts", + "colStatus": "Status", + "colActions": "Actions", + "statusPublished": "Published", + "statusDraft": "Draft", + "statusCancelled": "Cancelled", + "statusCompleted": "Completed", + "statRegistrations": "Registrations", + "statPrizes": "Prizes", + "statWinners": "Winners", + "statTime": "Time", + "maxPlayers": "Max: {count}", + "timeUpcoming": "Upcoming", + "timePast": "Past", + "endsAt": "Ends: {date}", + "userFallback": "User #{id}", + "registrationsTitle": "Registrations ({count})", + "noRegistrations": "No registrations yet.", + "noPrizes": "No prizes configured yet.", + "noWinners": "No winners yet.", + "addPrize": "Add prize", + "addWinner": "Add winner", + "formEditTitle": "Edit event", + "formDetailsTitle": "Event details", + "formTitle": "Title", + "formEventType": "Event type", + "formSelectType": "Select type", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formMaxPlayers": "Max players", + "formUnlimited": "Unlimited", + "formRoomId": "Room ID", + "formOptional": "Optional", + "formImageUrl": "Image URL", + "formSaving": "Saving…", + "formUpdate": "Update event", + "formCreate": "Create event", + "toastUpdated": "Event updated!", + "toastCreated": "Event created!" + }, + "polls": { + "newPoll": "+ New poll", + "createTitle": "Create poll", + "createSubtitle": "Create a new community poll or survey", + "searchPlaceholder": "Search polls…", + "colId": "ID", + "colTitle": "Title", + "colStatus": "Status", + "colType": "Type", + "colCreated": "Created", + "colActions": "Actions", + "statusActive": "Active", + "statusDraft": "Draft", + "statusClosed": "Closed", + "typeMultiple": "Multiple choice", + "typeSingle": "Single choice", + "statVoters": "Total voters", + "statQuestions": "Questions", + "statVotes": "Total votes", + "questionsTitle": "Questions ({count})", + "addQuestion": "Add question", + "noQuestions": "No questions yet. Add your first question above.", + "resultsTitle": "Results", + "formEditTitle": "Edit poll", + "formDetailsTitle": "Poll details", + "formTitle": "Title", + "formDescription": "Description", + "formStartsAt": "Starts at", + "formEndsAt": "Ends at", + "formSelectStart": "Select start date", + "formSelectEnd": "Select end date", + "formShowResults": "Show results to voters", + "formAllowMultiple": "Allow multiple answers", + "formSaving": "Saving…", + "formUpdate": "Update poll", + "formCreate": "Create poll", + "toastUpdated": "Poll updated!", + "toastCreated": "Poll created!" + }, + "multiAccounts": { + "minAccounts": "Min accounts per cluster", + "resultLimit": "Result limit", + "refresh": "Refresh", + "noClusters": "No clusters found at the current thresholds." + }, + "devops": { + "noEmulatorErrors": "No emulator errors found", + "noRecentErrors": "No recent errors" + }, + "helpTickets": { + "title": "Help center tickets", + "subtitle": "Player tickets from /help/tickets", + "noTickets": "No open help center tickets", + "searchPlaceholder": "Search title, user or ID…", + "presetOpen": "Open", + "presetAll": "All", + "statusOpen": "Open", + "statusClosed": "Closed", + "colTicket": "Ticket", + "colStatus": "Status", + "colUser": "User", + "colCreated": "Created", + "colUpdated": "Updated", + "meta": "by {user} · {count} replies", + "backToList": "Back to list", + "threadTitle": "Conversation", + "staffBadge": "Staff", + "replyPlaceholder": "Reply as staff…", + "replySubmit": "Send reply", + "replyHint": "Ctrl+Enter to send.", + "closeSubmit": "Close ticket", + "reopenSubmit": "Reopen ticket", + "closedHint": "This ticket is closed.", + "actionsTitle": "Actions", + "requesterTitle": "Requester", + "detailsTitle": "Details", + "rankLabel": "Rank {rank}", + "messageCountLabel": "Messages", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed.", + "reopened": "Ticket reopened." + } + }, + "marketplace": { + "title": "Marketplace", + "subtitle": "Hotel marketplace listings", + "activeListings": "Active listings", + "soldListings": "Sold", + "filterActive": "Active", + "filterSold": "Sold", + "empty": "No marketplace listings to show.", + "loadError": "Could not load marketplace data (database unavailable).", + "cancel": "Cancel listing", + "colId": "ID", + "colItem": "Item ID", + "colSeller": "Seller", + "colPrice": "Price", + "colListed": "Listed", + "colSold": "Sold at", + "colActions": "Actions" + }, + "analytics": { + "loadError": "Some analytics queries failed. Numbers below may be incomplete — check the database connection and emulator tables.", + "totalUsers": "Total users", + "onlineNow": "{count} online now", + "weekRegistrations": "Week registrations", + "thisMonth": "{count} this month", + "activeRooms": "Active rooms", + "totalRooms": "{count} total rooms", + "weeklyActivity": "Weekly activity", + "tradesAndBans": "{trades} trades, {bans} bans", + "registrationsChartTitle": "Registrations (30 days)", + "registrationsChartDescription": "New user registrations over the last 30 days", + "chatActivity": "Chat activity", + "messagesLast7Days": "Messages in the last 7 days", + "trades": "Trades", + "tradesLast7Days": "Trades in the last 7 days", + "retention": "Retention", + "usersOnlineOverTotal": "Users online / total", + "activity": { + "chatMessages": "Chat messages", + "commands": "Commands", + "bans": "Bans", + "registrations": "Registrations", + "last7Days": "Last 7 days", + "dailyBreakdownTitle": "Daily breakdown (7 days)", + "colDay": "Day", + "colChats": "Chats", + "colCmds": "Cmds", + "colBans": "Bans", + "colRegs": "Regs", + "mostActiveUsersTitle": "Most active users (7 days)", + "noChatActivity": "No chat activity", + "msgCount": "{count} msgs", + "userFallback": "User #{id}" + }, + "economy": { + "creditsInCirculation": "Credits in circulation", + "creditsDescription": "Total credits across all users", + "pixelsInCirculation": "Pixels in circulation", + "pixelsDescription": "Total pixels across all users", + "pointsInCirculation": "Points in circulation", + "pointsDescription": "Total points across all users", + "weeklyTrades": "Weekly trades", + "marketplaceListings": "{count} marketplace listings", + "shopRevenueTitle": "Shop revenue (7d)", + "purchases": "Purchases", + "creditsSpent": "Credits spent", + "pointsSpent": "Points spent", + "marketplaceTitle": "Marketplace", + "activeListings": "Active listings", + "sold7d": "Sold (7d)", + "currencyDistributionTitle": "Currency distribution", + "credits": "Credits", + "pixels": "Pixels", + "points": "Points", + "catalogSpendingTitle": "Catalog spending", + "creditsTooltip": "{count} credits", + "pointsTooltip": "{count} points" + }, + "peakHours": { + "title": "Peak hours", + "description": "User activity by day & hour (last 7 days)", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "tooltip": "{day} {hour}:00 — {count} users", + "less": "Less", + "more": "More" } } + }, + "error": { + "code": "Error", + "title": "Something went wrong", + "subtitle": "The hotel hit an unexpected snag.", + "body": "Try again in a moment. If it keeps happening, contact staff with the reference below.", + "tryAgain": "Try again", + "backHome": "Back home", + "reference": "Reference: {digest}" + }, + "notFound": { + "code": "404", + "title": "Page not found", + "subtitle": "This room doesn’t exist — or the furniture was moved.", + "body": "Check the link, or head back to the lobby.", + "backHome": "Back home", + "latestNews": "Latest news" + }, + "sessions": { + "title": "Login activity", + "subtitle": "Recent sign-ins and failed attempts on your account", + "recentTitle": "Recent sign-ins", + "recentEmpty": "No sign-ins recorded yet.", + "colWhen": "When", + "colIp": "IP", + "colDevice": "Device", + "failedTitle": "Failed attempts", + "failedSubtitle": "Wrong password on your username", + "unknownDevice": "Unknown device", + "signOutEverywhereTitle": "Sign out everywhere", + "signOutEverywhereDescription": "Ends all website sessions on every device. You will need to sign in again here too.", + "signOutEverywhereButton": "Sign out all sessions", + "successSignedOutAll": "All sessions have been signed out." + }, + "guildForumThread": { + "backToForum": "← Back to forum", + "unnamedGuild": "Unnamed guild", + "noSubject": "(no subject)", + "inGuildForum": "{guild} forum", + "pinned": "Pinned", + "locked": "Locked", + "postsTitle": "Posts", + "postsSubtitle": "{count, plural, one {# post} other {# posts}}", + "postsEmpty": "No posts in this thread.", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Add your message to this thread", + "replyPlaceholder": "Write your reply…", + "replySubmit": "Post reply", + "lockedHint": "This thread is locked — new replies are disabled.", + "loginToReply": "Sign in to reply.", + "loginLink": "Log in", + "success": { + "replied": "Reply posted." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That thread was not found.", + "locked": "This thread is locked.", + "ratelimit": "You're posting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "helpTicketDetail": { + "backToList": "← Your tickets", + "ticketId": "Ticket #{id}", + "statusOpen": "Open", + "statusClosed": "Closed", + "messagesTitle": "Conversation", + "messagesSubtitle": "{count, plural, one {# message} other {# messages}}", + "you": "You", + "userNumber": "User #{id}", + "replyTitle": "Reply", + "replySubtitle": "Send a follow-up to staff", + "replyPlaceholder": "Write your message…", + "replySubmit": "Send reply", + "closeTitle": "Close ticket", + "closeSubtitle": "Mark this request as resolved when you no longer need help", + "closeSubmit": "Close ticket", + "closedHint": "This ticket is closed. Open a new ticket if you need more help.", + "success": { + "replied": "Reply sent.", + "closed": "Ticket closed." + }, + "errors": { + "invalid": "Please enter a message.", + "notFound": "That ticket was not found.", + "closedTicket": "This ticket is closed.", + "moderated": "That message was blocked by moderation.", + "ratelimit": "You're submitting too fast. Please wait a moment and try again.", + "error": "Something went wrong. Please try again." + } + }, + "events": { + "title": "Events", + "subtitle": "Upcoming and recent hotel events you can join", + "empty": "No events yet.", + "back": "← Events", + "when": "When", + "status": "Status", + "statusPublished": "Open", + "statusCompleted": "Completed", + "registrations": "Registrations", + "registered": "{count} registered", + "spots": "{count} / {max} spots", + "registerTitle": "Register", + "registerSubtitle": "Save your spot for this event", + "register": "Register for event", + "registering": "Registering…", + "registerSuccess": "You are registered!", + "registerError": "Could not register for this event.", + "loginToRegister": "Log in to register for this event.", + "alreadyRegistered": "You are already registered.", + "eventEnded": "This event has ended.", + "eventFull": "This event is full.", + "cannotRegister": "Registration is not available.", + "prizesTitle": "Prizes", + "winnersTitle": "Winners", + "unknownUser": "User #{id}" + }, + "polls": { + "title": "Polls", + "subtitle": "Share your opinion in community polls", + "empty": "No polls yet.", + "back": "← Polls", + "statusActive": "Open", + "statusClosed": "Closed", + "questionsCount": "{count} questions", + "ends": "Ends {date}", + "voteTitle": "Cast your vote", + "voteSubtitle": "Answer each question below", + "submitVote": "Submit vote", + "voting": "Submitting…", + "voteSuccess": "Thanks for voting!", + "voteError": "Could not submit your vote.", + "loginToVote": "Log in to vote in this poll.", + "alreadyVoted": "You have already voted.", + "pollClosed": "This poll is closed.", + "cannotVote": "Voting is not available.", + "textPlaceholder": "Your answer…", + "resultsTitle": "Results", + "voteCount": "{count} ({pct}%)", + "totalVotes": "{count} total votes", + "textResponses": "{count} free-text responses" + } + }, + "emails": { + "verify": { + "subject": "Verify your email · {hotel}", + "heading": "Verify your email", + "body": "Welcome to {hotel}! Confirm this email address to finish setting up your account.", + "button": "Verify email", + "fallback": "If the button doesn't work, paste this link into your browser:" } } }