feat: public events/polls, friends graph, captcha, SSE hardening, and admin UX
Ship product gaps: register/vote pages, friend add/accept/decline/remove, email verify TTL, captcha on login/forgot, soft-fail user actions, SSE abort/shared client, Commando Centrum error toasts, admin delete for events/polls, and IT/NL i18n fills. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
1 parent
2ff08e5127
commit
ed7db6e048
76 files changed
+4834
-1376
No files matched your search
+153
-10
@@ -7,6 +7,8 @@
|
||||
"staff": "Staff",
|
||||
"rankings": "Rankings",
|
||||
"guilds": "Guilds",
|
||||
"events": "Events",
|
||||
"polls": "Polls",
|
||||
"leaderboards": "Leaderboards",
|
||||
"rareValues": "Rare values",
|
||||
"shop": "Shop",
|
||||
@@ -39,6 +41,15 @@
|
||||
"lightMode": "Light mode",
|
||||
"darkMode": "Dark mode"
|
||||
},
|
||||
"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:"
|
||||
}
|
||||
},
|
||||
"pages": {
|
||||
"error": {
|
||||
"code": "Error",
|
||||
@@ -88,7 +99,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": "No motto"
|
||||
"noMotto": "No 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": "Messages",
|
||||
@@ -99,11 +119,22 @@
|
||||
"requestsEmptyState": "No pending friend requests.",
|
||||
"wantsToBeFriend": "wants to be your friend.",
|
||||
"accept": "Accept",
|
||||
"decline": "Decline",
|
||||
"offlineTitle": "Offline messages",
|
||||
"offlineEmptySubtitle": "Your inbox is empty",
|
||||
"offlineSubtitle": "{count, plural, one {# message received} other {# messages received}}",
|
||||
"offlineEmptyState": "You have no offline messages.",
|
||||
"unknownUser": "User #{id}"
|
||||
"unknownUser": "User #{id}",
|
||||
"success": {
|
||||
"accepted": "Friend request accepted.",
|
||||
"declined": "Friend request declined."
|
||||
},
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"noMotto": "No motto",
|
||||
@@ -131,7 +162,26 @@
|
||||
"roomsTitle": "Rooms",
|
||||
"roomsSubtitle": "Rooms they own",
|
||||
"roomsEmpty": "No rooms to show.",
|
||||
"roomUntitled": "Untitled room"
|
||||
"roomUntitled": "Untitled room",
|
||||
"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": "Rankings",
|
||||
@@ -185,7 +235,18 @@
|
||||
"addComment": "Add a comment",
|
||||
"commentPlaceholder": "Write your comment…",
|
||||
"postComment": "Post comment",
|
||||
"toComment": "to leave a comment."
|
||||
"toComment": "to leave a comment.",
|
||||
"success": {
|
||||
"posted": "Comment posted."
|
||||
},
|
||||
"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",
|
||||
@@ -269,7 +330,10 @@
|
||||
"pinned": "Pinned",
|
||||
"locked": "Locked",
|
||||
"userNumber": "User #{id}",
|
||||
"unknown": "Unknown"
|
||||
"unknown": "Unknown",
|
||||
"success": {
|
||||
"posted": "Thread posted."
|
||||
}
|
||||
},
|
||||
"guildForumNew": {
|
||||
"backToForum": "← Back to forum",
|
||||
@@ -281,7 +345,13 @@
|
||||
"messageLabel": "Message",
|
||||
"messagePlaceholder": "Write your opening post…",
|
||||
"postThread": "Post thread",
|
||||
"cancel": "Cancel"
|
||||
"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": "Shop",
|
||||
@@ -395,7 +465,16 @@
|
||||
"colStatus": "Status",
|
||||
"colCreated": "Created",
|
||||
"statusOpen": "Open",
|
||||
"statusClosed": "Closed"
|
||||
"statusClosed": "Closed",
|
||||
"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": "Apply for {hotel} staff",
|
||||
@@ -472,7 +551,68 @@
|
||||
"loginToPost": "Log in to post a shout.",
|
||||
"latestTitle": "Latest shouts",
|
||||
"latestSubtitle": "The most recent messages from listeners",
|
||||
"empty": "No shouts yet. Be the first!"
|
||||
"empty": "No shouts yet. Be the first!",
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"radioContests": {
|
||||
"title": "Radio Contests",
|
||||
@@ -627,7 +767,9 @@
|
||||
"createOne": "Create one",
|
||||
"forgotPassword": "Forgot password?",
|
||||
"errorInvalidCredentials": "Invalid username or password",
|
||||
"errorInvalid2fa": "Invalid 2FA code"
|
||||
"errorInvalid2fa": "Invalid 2FA code",
|
||||
"errorUnverified": "Please verify your email before signing in.",
|
||||
"errorCaptcha": "Captcha verification failed. Please try again."
|
||||
},
|
||||
"register": {
|
||||
"title": "Create account",
|
||||
@@ -663,7 +805,8 @@
|
||||
"sentNotice": "If that email is registered, a reset link has been sent. Check your inbox.",
|
||||
"emailPlaceholder": "Your email",
|
||||
"sendResetLink": "Send reset link",
|
||||
"backToLogin": "Back to login"
|
||||
"backToLogin": "Back to login",
|
||||
"errorCaptcha": "Captcha verification failed. Please try again."
|
||||
},
|
||||
"reset": {
|
||||
"title": "Set a new password",
|
||||
|
||||
Reference in new issue
Block a user