i18n: translate all public page bodies (EN + IT)

Internationalised the ~44 public pages with next-intl (the shell was
already translated). Each page now pulls its copy from a "pages.<slug>"
namespace via getTranslations (server) / useTranslations (client); the
EN + IT catalogs were authored by parallel agents and merged centrally,
with natural Italian (ICU plurals) and it backfilled from en for any
gap. request.ts gained getMessageFallback/onError so a missing key
degrades to the English value, never a raw key.

Behaviour unchanged (only display text moved to t() calls; queries,
actions, fields, ContentCard structure preserved). Verified on the prod
server: with NEXT_LOCALE=it, home/community/staff/news/shop/rankings all
render Italian copy, no raw-key leakage; English unchanged. The nav
language switcher toggles EN/IT live. tsc 0, vitest 49/49, next build 0.

Admin pages intentionally left in English (staff tooling).
This commit is contained in:
Simo committed 2026-06-28 20:40:06 +02:00
1 parent 1199176883
commit e004dfedaf
47 files changed
+1740 -471

No files matched your search

+571
View File
@@ -35,5 +35,576 @@
"language": "Language",
"lightMode": "Light mode",
"darkMode": "Dark mode"
},
"pages": {
"staff": {
"title": "Staff",
"subtitle": "The team behind the hotel",
"ranksTitle": "Ranks",
"ranksSubtitle": "What each part of the team takes care of",
"membersTitle": "Team members",
"membersEmptySubtitle": "Nobody to show right now",
"membersSubtitle": "{count, plural, one {# member keeping things running} other {# members keeping things running}}",
"emptyState": "No staff members to show.",
"colUsername": "Username",
"colRank": "Rank",
"colMotto": "Motto"
},
"leaderboard": {
"title": "Leaderboard",
"subtitle": "Top 20 players by {currency}",
"tab_credits": "Credits",
"tab_diamonds": "Diamonds",
"tab_duckets": "Duckets",
"emptyState": "No rankings to show yet.",
"colAvatar": "Avatar",
"colPlayer": "Player"
},
"friends": {
"title": "Friends",
"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"
},
"messages": {
"title": "Messages",
"subtitle": "Friend requests and offline messages waiting for you",
"requestsTitle": "Friend requests",
"requestsEmptySubtitle": "Nobody's asked to be your friend yet",
"requestsSubtitle": "{count, plural, one {# pending request} other {# pending requests}}",
"requestsEmptyState": "No pending friend requests.",
"wantsToBeFriend": "wants to be your friend.",
"accept": "Accept",
"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}"
},
"profile": {
"noMotto": "No motto",
"statRank": "Rank",
"statCredits": "Credits",
"statRegistered": "Registered",
"badgesTitle": "Badges",
"badgesEmpty": "No badges yet.",
"photosTitle": "Photos",
"photosEmpty": "No photos yet.",
"guestbookTitle": "Guestbook",
"guestbookSubtitle": "Messages on {username}'s wall",
"leaveMessage": "Leave a message",
"guestbookPlaceholder": "Write something on {username}'s guestbook…",
"post": "Post",
"loginToPost": "Log in to leave a guestbook message.",
"guestbookEmpty": "No guestbook entries yet.",
"unknownUser": "User #{id}"
},
"rankings": {
"title": "Rankings",
"subtitle": "The top 12 players ranked by credits",
"emptyState": "No players to rank yet."
},
"home": {
"welcome": "Welcome to {hotelName}",
"welcomeSubtitle": "Your retro hotel, now powered by Next.js",
"welcomeBody": "Hang out, collect furni, and meet friends.",
"enterHotel": "Enter hotel",
"latestNews": "Latest news",
"newsTitle": "Latest news",
"newsSubtitle": "Fresh from the hotel",
"allNews": "All news →",
"noArticles": "No articles yet."
},
"news": {
"title": "News",
"subtitle": "The latest announcements, events and updates from the hotel",
"noArticles": "No articles yet."
},
"article": {
"backToNews": "← News",
"reactionsTitle": "Reactions",
"reactionsSubtitle": "Tell us what you think",
"reaction": {
"like": "Like",
"love": "Love",
"wow": "Wow"
},
"removeReaction": "Click to remove your reaction",
"reactWith": "React with {reaction}",
"noReactions": "No reactions yet.",
"logIn": "Log in",
"toReact": "to react.",
"commentsTitle": "Comments",
"commentsSubtitle": "Join the conversation",
"commentsCount": "{count} so far",
"noComments": "No comments yet. Be the first to comment.",
"userNumber": "User #{id}",
"addComment": "Add a comment",
"commentPlaceholder": "Write your comment…",
"postComment": "Post comment",
"toComment": "to leave a comment."
},
"photos": {
"title": "Photos",
"subtitle": "The latest snapshots taken in the hotel",
"noPhotos": "No photos yet.",
"photoAlt": "Photo by user #{id}",
"byUser": "by user #{id}"
},
"badges": {
"title": "Badges",
"subtitle": "The badges you can earn and show off around the hotel",
"noBadges": "No badges available yet."
},
"community": {
"title": "Community",
"subtitle": "Everything happening around the hotel in one place",
"open": "Open →",
"links": {
"rankings": {
"title": "Rankings",
"text": "See the wealthiest players in the hotel, ranked by credits."
},
"staff": {
"title": "Staff",
"text": "Meet the team that keeps the hotel running every day."
},
"news": {
"title": "News",
"text": "The latest announcements, events and updates."
},
"photos": {
"title": "Photos",
"text": "Snapshots shared by the community from around the hotel."
},
"guilds": {
"title": "Guilds",
"text": "Browse the groups players have created and joined."
},
"leaderboards": {
"title": "Leaderboards",
"text": "Who's on top this season across the hotel's stats."
}
}
},
"guilds": {
"title": "Guilds",
"subtitle": "Browse the groups players have created and joined",
"empty": "No guilds yet.",
"unnamedGuild": "Unnamed guild",
"noDescription": "No description"
},
"guild": {
"allGuilds": "← All guilds",
"unnamedGuild": "Unnamed guild",
"noDescription": "No description",
"memberSingular": "Member",
"memberPlural": "Members",
"founded": "Founded",
"forumLink": "Forum →",
"discussion": "Discussion",
"membersTitle": "Members",
"memberLowerSingular": "member",
"memberLowerPlural": "members",
"noMembers": "No members.",
"owner": "Owner",
"noMotto": "No motto"
},
"guildForum": {
"backToGuild": "← Back to guild",
"unnamedGuild": "Unnamed guild",
"forumTitle": "{guild} — Forum",
"threadSingular": "thread",
"threadPlural": "threads",
"newThread": "+ New thread",
"empty": "No threads in this forum yet.",
"colSubject": "Subject",
"colAuthor": "Author",
"colPosts": "Posts",
"colDate": "Date",
"noSubject": "(no subject)",
"pinned": "Pinned",
"locked": "Locked",
"userNumber": "User #{id}",
"unknown": "Unknown"
},
"guildForumNew": {
"backToForum": "← Back to forum",
"unnamedGuild": "Unnamed guild",
"title": "New thread",
"subtitle": "in {guild} forum",
"subjectLabel": "Subject",
"subjectPlaceholder": "Thread subject",
"messageLabel": "Message",
"messagePlaceholder": "Write your opening post…",
"postThread": "Post thread",
"cancel": "Cancel"
},
"shop": {
"title": "Shop",
"subtitle": "Top up your account and grab exclusive packages, currency and badges.",
"browsingCategory": "Browsing the {category} packages.",
"all": "All",
"allPackages": "All packages",
"packagesAvailable": "{count, plural, one {# package available} other {# packages available}}",
"empty": "No packages available right now.",
"buy": "Buy"
},
"topup": {
"title": "Top up with PayPal",
"subtitle": "Pay securely with PayPal and your credits are added the moment the payment clears.",
"cancelled": "Checkout was cancelled — no payment was taken.",
"chooseAmount": "Choose an amount",
"notConfiguredPre": "PayPal isn't configured yet. An administrator needs to set",
"notConfiguredAnd": "and",
"notConfiguredOptional": "(and optionally",
"notConfiguredPost": "for sandbox vs. live).",
"balanceTitle": "Your balance",
"signedInAs": "Signed in as {username}",
"credits": "Credits",
"creditsPerUnit": "Credits per 1.00 {currency}",
"rateLine": "You receive <strong>{amount}</strong> credits per 1.00 {currency}. Credits appear in-game the next time you log in."
},
"marketplace": {
"title": "Marketplace",
"subtitle": "Browse furniture and rares listed by players. Listings are placed in-game and update live — head into the hotel to make an offer.",
"activeOffers": "Active offers",
"sellers": "Sellers",
"totalValue": "Total value",
"activeListings": "Active listings",
"mostRecentFirst": "Most recently listed first",
"empty": "There are no active marketplace offers right now. Check back later.",
"colOffer": "Offer",
"colItem": "Item",
"colSeller": "Seller",
"colPrice": "Price",
"colListed": "Listed",
"itemLabel": "Item #{id}",
"userLabel": "User #{id}",
"justNow": "just now",
"minutesAgo": "{count}m ago",
"hoursAgo": "{count}h ago",
"daysAgo": "{count}d ago"
},
"rares": {
"title": "Rare values",
"subtitle": "Get an overview of all of the rares on the hotel, grouped by category.",
"empty": "We currently have no rares listed here.",
"rareCount": "{count, plural, one {# rare} other {# rares}}",
"viewRares": "View rares →"
},
"rareCategory": {
"rareCount": "{count, plural, one {# rare in this category} other {# rares in this category}}",
"allRares": "← All rares",
"empty": "No rares listed in this category yet.",
"colRare": "Rare",
"colCredits": "Credits",
"colCurrency": "Currency",
"creditsValue": "{value} credits",
"duckets": "Duckets",
"diamonds": "Diamonds",
"credits": "Credits"
},
"redeem": {
"title": "Redeem a voucher",
"subtitle": "Got a voucher code? Enter it below to add the reward to your account.",
"enterCode": "Enter your code",
"oncePerAccount": "Each voucher can only be redeemed once per account.",
"balanceTitle": "Your balance",
"signedInAs": "Signed in as {username}",
"credits": "Credits",
"instantCredit": "Redeemed rewards are credited instantly and appear in-game the next time you log in."
},
"help": {
"title": "Help Center",
"subtitle": "Find guides, support topics, and the hotel rules — everything you need to get help.",
"myTickets": "My tickets →",
"topicsTitle": "Support topics",
"topicsSubtitle": "Browse guides and answers to common questions",
"topicsEmpty": "No help topics yet.",
"rulesTitle": "Hotel rules",
"rulesSubtitle": "Please read these before hanging out in the hotel",
"rulesEmpty": "No rules published yet.",
"categoryEmpty": "No rules in this category."
},
"helpCategory": {
"back": "← Help Center",
"topicSubtitle": "Help Center topic",
"moreTitle": "More help topics",
"moreSubtitle": "Jump to another support topic"
},
"helpTickets": {
"title": "Help Tickets",
"subtitle": "Submit a ticket to staff and track your open requests.",
"statTotal": "Total tickets",
"statOpen": "Open",
"statClosed": "Closed",
"newTitle": "New ticket",
"newSubtitle": "Describe your issue and staff will follow up",
"subjectPlaceholder": "Subject",
"contentPlaceholder": "Describe your issue…",
"submit": "Submit ticket",
"listTitle": "Your tickets",
"listSubtitle": "Every request you have sent to staff",
"listEmpty": "You have no tickets yet.",
"colId": "ID",
"colSubject": "Subject",
"colStatus": "Status",
"colCreated": "Created",
"statusOpen": "Open",
"statusClosed": "Closed"
},
"applyStaff": {
"title": "Apply for {hotel} staff",
"subtitle": "We open staff applications every now and then. If you come across a position you feel you would fit perfectly into, do not hesitate to apply for it.",
"noPositionsTitle": "No positions open",
"noPositionsBody": "There are currently no positions open. Please come back at a later time to check if we have any openings by then. Thank you for your interest.",
"noDeadline": "No deadline set",
"deadline": "Application deadline: {date}",
"alreadyApplied": "You have already applied for {rank}",
"aboutYou": "About you",
"aboutPlaceholder": "Tell us why you'd be a great {rank}…",
"applyFor": "Apply for {rank}"
},
"applyTeam": {
"title": "Apply for the {hotel} team",
"subtitle": "We open team applications periodically. If you see a team you fit, do not hesitate to apply!",
"noPositionsTitle": "No team positions open",
"noPositionsBody": "There are currently no open team positions. Please come back later to check for new openings. Thank you!",
"pending": "Your application is pending",
"aboutYou": "About you",
"aboutPlaceholder": "Tell us why you'd be a great fit for {rank}…",
"applyFor": "Apply for {rank}"
},
"radio": {
"title": "Radio",
"subtitle": "Tune in to the hotel radio — live DJ sets, requests and shoutouts.",
"nowPlaying": "Now playing",
"nothingPlaying": "Nothing playing right now.",
"onAir": "On air: {dj}",
"noDj": "No DJ on air.",
"audioUnsupported": "Your browser does not support the audio element.",
"streamOffline": "The stream is currently offline.",
"exploreTitle": "Explore the radio",
"exploreSubtitle": "Schedule, shouts, requests and more",
"linkSchedule": "Schedule",
"linkScheduleText": "Our weekly line-up of DJs and shows.",
"linkShouts": "Shouts",
"linkShoutsText": "Shout-outs and requests from the community.",
"linkRequests": "Requests",
"linkRequestsText": "Ask the DJ to spin your favourite track.",
"linkApply": "Apply as DJ",
"linkApplyText": "Join the team and take to the airwaves.",
"linkLeaderboard": "Leaderboard",
"linkLeaderboardText": "Top listeners ranked by points earned.",
"todayTitle": "Today's schedule",
"todayTitleWithDay": "Today's schedule · {day}",
"todaySubtitle": "What's on the airwaves today",
"fullWeek": "Full week →",
"noShowsToday": "No shows scheduled for today.",
"colTime": "Time",
"colShow": "Show",
"colDj": "DJ",
"untitledShow": "Untitled show",
"userNumber": "User #{id}"
},
"radioSchedule": {
"title": "Radio Schedule",
"subtitle": "Our weekly line-up of DJs and shows",
"empty": "No shows scheduled yet.",
"colDay": "Day",
"colTime": "Time",
"colDj": "DJ",
"colShow": "Show",
"noShows": "No shows"
},
"radioShouts": {
"title": "Radio Shouts",
"subtitle": "Shout-outs and requests from the community",
"postTitle": "Post a shout",
"postSubtitle": "Send a message to the DJ on air",
"messageLabel": "Your message",
"messagePlaceholder": "Send a shout to the DJ…",
"shoutButton": "Shout",
"loginToPost": "Log in to post a shout.",
"latestTitle": "Latest shouts",
"latestSubtitle": "The most recent messages from listeners",
"empty": "No shouts yet. Be the first!"
},
"radioContests": {
"title": "Radio Contests",
"subtitle": "Tune in and take part in our latest on-air contests",
"empty": "No contests yet.",
"contestLabel": "Contest #{id}",
"dateUnknown": "Date unknown"
},
"radioGiveaways": {
"title": "Radio Giveaways",
"subtitle": "Listen in for your chance to win in our radio giveaways",
"empty": "No giveaways yet.",
"giveawayLabel": "Giveaway #{id}",
"dateUnknown": "Date unknown"
},
"radioLeaderboard": {
"title": "Radio Listener Leaderboard",
"subtitle": "Top 50 listeners by points earned tuning in to the radio",
"empty": "No listener points to show yet.",
"colRank": "Rank",
"colAvatar": "Avatar",
"colListener": "Listener",
"colPoints": "Points"
},
"radioApply": {
"title": "Apply to be a Radio DJ",
"subtitle": "Tell us about yourself and why you'd be a great fit for the airwaves",
"latestTitle": "Your latest application",
"statusLabel": "Status:",
"submittedOn": "· submitted {date}",
"submitAgain": "You can submit again below if your details have changed.",
"formTitle": "Application form",
"formSubtitle": "All fields marked required must be filled in",
"realNameLabel": "Real name",
"realNamePlaceholder": "Your full name",
"ageLabel": "Age",
"availabilityLabel": "Availability",
"availabilityPlaceholder": "Which days and times can you broadcast?",
"musicStyleLabel": "Music style",
"musicStylePlaceholder": "e.g. House, Pop, Hip-Hop",
"experienceLabel": "Experience",
"optional": "(optional)",
"experiencePlaceholder": "Any prior DJ or hosting experience?",
"motivationLabel": "Motivation",
"motivationPlaceholder": "Why do you want to join the radio team?",
"submitButton": "Submit application"
},
"settings": {
"accountSettings": "Account settings",
"accountSettingsSubtitle": "Manage your profile, security and connected accounts",
"publicProfile": "Your public profile",
"noMotto": "No motto",
"noEmail": "No e-mail on file",
"changeMotto": "Change motto",
"changeMottoSubtitle": "Updates instantly in-game if you are online",
"mottoPlaceholder": "Your motto",
"saveMotto": "Save motto",
"securityTitle": "Security",
"securitySubtitle": "Two-factor authentication",
"securityDescription": "Add a second layer of protection to your account.",
"twoFactorLink": "Two-factor authentication",
"connectionsTitle": "Connected accounts",
"connectionsSubtitle": "Sign in with one click",
"connectionsDescription": "Link Discord or Google to your hotel account.",
"manageConnections": "Manage connections"
},
"settings2fa": {
"backToSettings": "← Settings",
"title": "Two-factor authentication",
"subtitle": "Add a second layer of security with an authenticator app",
"nowEnabled": "2FA is now enabled. 🔒",
"disabledNotice": "2FA has been disabled.",
"badCode": "That code wasn't valid — try again.",
"noAppKeyPrefix": "2FA is unavailable until",
"noAppKeyMiddle": "is configured (the same Laravel",
"noAppKeySuffix": "as your AtomCMS install, so existing secrets stay readable).",
"isEnabled": "2FA is enabled",
"onYourAccount": "on your account.",
"disable": "Disable 2FA",
"scanOrEnter": "Scan or enter this key",
"scanInstructions": "Add this to Google Authenticator / Authy, then enter the 6-digit code to confirm.",
"manualKey": "Manual key:",
"codePlaceholder": "6-digit code",
"confirm": "Confirm",
"enableIntro": "Add a second layer of security with an authenticator app.",
"enable": "Enable 2FA"
},
"connections": {
"backToSettings": "← Settings",
"title": "Connected accounts",
"subtitle": "Link a social account so you can sign in with one click",
"matchByEmail": "We match it to your hotel account by e-mail, so use the address on file:",
"lookupFailed": "We couldn't read your linked accounts right now. You can still connect below — your status will show once it's available.",
"statusUnavailable": "Not available on this hotel.",
"statusConnected": "Connected — sign in with this account.",
"statusNotConnected": "Not connected.",
"connected": "Connected",
"connectProvider": "Connect {provider}",
"unavailable": "Unavailable",
"footerNote": "Connecting takes you to the provider to authorise, then back here. If your social account's e-mail doesn't match a hotel account, you'll be returned to the login screen with a note."
},
"login": {
"title": "Sign in",
"subtitle": "Welcome back — log in to enter the hotel.",
"subtitle2fa": "Enter the 6-digit code from your authenticator.",
"usernamePlaceholder": "Username",
"passwordPlaceholder": "Password",
"codePlaceholder": "2FA code",
"pleaseWait": "Please wait…",
"verify": "Verify",
"signIn": "Sign in",
"or": "or",
"continueWithDiscord": "Continue with Discord",
"continueWithGoogle": "Continue with Google",
"noAccount": "No account?",
"createOne": "Create one",
"forgotPassword": "Forgot password?",
"errorInvalidCredentials": "Invalid username or password",
"errorInvalid2fa": "Invalid 2FA code"
},
"register": {
"title": "Create account",
"subtitle": "Join the hotel — it only takes a moment.",
"usernamePlaceholder": "Username",
"emailPlaceholder": "Email",
"passwordPlaceholder": "Password (min 6 chars)",
"register": "Register",
"alreadyHaveAccount": "Already have an account?",
"signIn": "Sign in"
},
"forgot": {
"title": "Reset password",
"subtitle": "We'll email you a secure link to set a new password.",
"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"
},
"reset": {
"title": "Set a new password",
"subtitle": "Choose a strong password you don't use elsewhere.",
"passwordPlaceholder": "New password (min 6 chars)",
"resetPassword": "Reset password",
"backToLogin": "Back to login"
},
"verify": {
"verifiedTitle": "You're all set",
"verifiedSubtitle": "Email verified",
"verifiedBody": "Your email address has been verified. You can now log in and play.",
"goToLogin": "Go to login",
"alreadyTitle": "Already verified",
"alreadySubtitle": "Nothing left to do",
"alreadyBody": "This email address has already been confirmed.",
"unavailableTitle": "Try again shortly",
"unavailableSubtitle": "Server unreachable",
"unavailableBody": "We couldn't reach the server to verify your email. Please retry the link in a moment.",
"invalidTitle": "Email verification",
"invalidSubtitle": "Invalid or expired link",
"invalidBody": "This verification link is not valid. Make sure you opened the full link from your email, or request a new one.",
"backToLogin": "Back to login"
},
"banned": {
"title": "You are banned",
"subtitle": "Account suspended",
"body": "Your account has been suspended from the hotel.",
"reasonLabel": "Reason:",
"permanent": "This ban is permanent.",
"expires": "Expires {date}.",
"contactStaff": "If you believe this is a mistake, contact the staff team."
},
"maintenance": {
"title": "{hotel} is under maintenance",
"subtitle": "We'll be back shortly",
"staffCanLogIn": "Staff can still log in."
}
}
}
+571
View File
@@ -35,5 +35,576 @@
"language": "Lingua",
"lightMode": "Tema chiaro",
"darkMode": "Tema scuro"
},
"pages": {
"staff": {
"title": "Staff",
"subtitle": "Il team dietro l'hotel",
"ranksTitle": "Ruoli",
"ranksSubtitle": "Di cosa si occupa ogni parte del team",
"membersTitle": "Membri del team",
"membersEmptySubtitle": "Nessuno da mostrare al momento",
"membersSubtitle": "{count, plural, one {# membro che tiene tutto in funzione} other {# membri che tengono tutto in funzione}}",
"emptyState": "Nessun membro dello staff da mostrare.",
"colUsername": "Nome utente",
"colRank": "Ruolo",
"colMotto": "Motto"
},
"leaderboard": {
"title": "Classifica",
"subtitle": "I 20 migliori giocatori per {currency}",
"tab_credits": "Crediti",
"tab_diamonds": "Diamanti",
"tab_duckets": "Duckets",
"emptyState": "Ancora nessuna classifica da mostrare.",
"colAvatar": "Avatar",
"colPlayer": "Giocatore"
},
"friends": {
"title": "Amici",
"emptySubtitle": "Non hai ancora aggiunto nessun amico",
"subtitle": "{count, plural, one {Hai # amico} other {Hai # amici}}",
"emptyState": "Aggiungi amici nell'hotel e compariranno qui.",
"noMotto": "Nessun motto"
},
"messages": {
"title": "Messaggi",
"subtitle": "Richieste di amicizia e messaggi offline in attesa per te",
"requestsTitle": "Richieste di amicizia",
"requestsEmptySubtitle": "Nessuno ti ha ancora chiesto l'amicizia",
"requestsSubtitle": "{count, plural, one {# richiesta in sospeso} other {# richieste in sospeso}}",
"requestsEmptyState": "Nessuna richiesta di amicizia in sospeso.",
"wantsToBeFriend": "vuole essere tuo amico.",
"accept": "Accetta",
"offlineTitle": "Messaggi offline",
"offlineEmptySubtitle": "La tua casella è vuota",
"offlineSubtitle": "{count, plural, one {# messaggio ricevuto} other {# messaggi ricevuti}}",
"offlineEmptyState": "Non hai messaggi offline.",
"unknownUser": "Utente #{id}"
},
"profile": {
"noMotto": "Nessun motto",
"statRank": "Ruolo",
"statCredits": "Crediti",
"statRegistered": "Registrato",
"badgesTitle": "Distintivi",
"badgesEmpty": "Ancora nessun distintivo.",
"photosTitle": "Foto",
"photosEmpty": "Ancora nessuna foto.",
"guestbookTitle": "Bacheca",
"guestbookSubtitle": "Messaggi sulla bacheca di {username}",
"leaveMessage": "Lascia un messaggio",
"guestbookPlaceholder": "Scrivi qualcosa sulla bacheca di {username}…",
"post": "Pubblica",
"loginToPost": "Accedi per lasciare un messaggio sulla bacheca.",
"guestbookEmpty": "Ancora nessun messaggio in bacheca.",
"unknownUser": "Utente #{id}"
},
"rankings": {
"title": "Classifica",
"subtitle": "I 12 migliori giocatori ordinati per crediti",
"emptyState": "Ancora nessun giocatore da classificare."
},
"home": {
"welcome": "Benvenuto su {hotelName}",
"welcomeSubtitle": "Il tuo hotel retrò, ora con tecnologia Next.js",
"welcomeBody": "Rilassati, colleziona furni e fai nuove amicizie.",
"enterHotel": "Entra nell'hotel",
"latestNews": "Ultime notizie",
"newsTitle": "Ultime notizie",
"newsSubtitle": "Appena arrivate dall'hotel",
"allNews": "Tutte le notizie →",
"noArticles": "Ancora nessun articolo."
},
"news": {
"title": "Notizie",
"subtitle": "Gli ultimi annunci, eventi e aggiornamenti dall'hotel",
"noArticles": "Ancora nessun articolo."
},
"article": {
"backToNews": "← Notizie",
"reactionsTitle": "Reazioni",
"reactionsSubtitle": "Dicci cosa ne pensi",
"reaction": {
"like": "Mi piace",
"love": "Adoro",
"wow": "Wow"
},
"removeReaction": "Clicca per rimuovere la tua reazione",
"reactWith": "Reagisci con {reaction}",
"noReactions": "Ancora nessuna reazione.",
"logIn": "Accedi",
"toReact": "per reagire.",
"commentsTitle": "Commenti",
"commentsSubtitle": "Partecipa alla conversazione",
"commentsCount": "{count} finora",
"noComments": "Ancora nessun commento. Scrivi il primo.",
"userNumber": "Utente #{id}",
"addComment": "Aggiungi un commento",
"commentPlaceholder": "Scrivi il tuo commento…",
"postComment": "Pubblica commento",
"toComment": "per lasciare un commento."
},
"photos": {
"title": "Foto",
"subtitle": "Gli ultimi scatti realizzati nell'hotel",
"noPhotos": "Ancora nessuna foto.",
"photoAlt": "Foto dell'utente #{id}",
"byUser": "dell'utente #{id}"
},
"badges": {
"title": "Distintivi",
"subtitle": "I distintivi che puoi ottenere e sfoggiare in giro per l'hotel",
"noBadges": "Ancora nessun distintivo disponibile."
},
"community": {
"title": "Community",
"subtitle": "Tutto ciò che accade nell'hotel in un unico posto",
"open": "Apri →",
"links": {
"rankings": {
"title": "Classifiche",
"text": "Scopri i giocatori più ricchi dell'hotel, ordinati per crediti."
},
"staff": {
"title": "Staff",
"text": "Conosci il team che ogni giorno fa funzionare l'hotel."
},
"news": {
"title": "Notizie",
"text": "Gli ultimi annunci, eventi e aggiornamenti."
},
"photos": {
"title": "Foto",
"text": "Scatti condivisi dalla community in giro per l'hotel."
},
"guilds": {
"title": "Gilde",
"text": "Esplora i gruppi creati e a cui si sono uniti i giocatori."
},
"leaderboards": {
"title": "Classifiche generali",
"text": "Chi è in testa questa stagione nelle statistiche dell'hotel."
}
}
},
"guilds": {
"title": "Gilde",
"subtitle": "Esplora i gruppi creati e frequentati dai giocatori",
"empty": "Ancora nessuna gilda.",
"unnamedGuild": "Gilda senza nome",
"noDescription": "Nessuna descrizione"
},
"guild": {
"allGuilds": "← Tutte le gilde",
"unnamedGuild": "Gilda senza nome",
"noDescription": "Nessuna descrizione",
"memberSingular": "Membro",
"memberPlural": "Membri",
"founded": "Fondata",
"forumLink": "Forum →",
"discussion": "Discussione",
"membersTitle": "Membri",
"memberLowerSingular": "membro",
"memberLowerPlural": "membri",
"noMembers": "Nessun membro.",
"owner": "Proprietario",
"noMotto": "Nessun motto"
},
"guildForum": {
"backToGuild": "← Torna alla gilda",
"unnamedGuild": "Gilda senza nome",
"forumTitle": "{guild} — Forum",
"threadSingular": "discussione",
"threadPlural": "discussioni",
"newThread": "+ Nuova discussione",
"empty": "Ancora nessuna discussione in questo forum.",
"colSubject": "Oggetto",
"colAuthor": "Autore",
"colPosts": "Messaggi",
"colDate": "Data",
"noSubject": "(senza oggetto)",
"pinned": "In evidenza",
"locked": "Bloccata",
"userNumber": "Utente #{id}",
"unknown": "Sconosciuto"
},
"guildForumNew": {
"backToForum": "← Torna al forum",
"unnamedGuild": "Gilda senza nome",
"title": "Nuova discussione",
"subtitle": "nel forum di {guild}",
"subjectLabel": "Oggetto",
"subjectPlaceholder": "Oggetto della discussione",
"messageLabel": "Messaggio",
"messagePlaceholder": "Scrivi il tuo primo messaggio…",
"postThread": "Pubblica discussione",
"cancel": "Annulla"
},
"shop": {
"title": "Negozio",
"subtitle": "Ricarica il tuo account e accaparrati pacchetti esclusivi, valute e distintivi.",
"browsingCategory": "Stai sfogliando i pacchetti {category}.",
"all": "Tutti",
"allPackages": "Tutti i pacchetti",
"packagesAvailable": "{count, plural, one {# pacchetto disponibile} other {# pacchetti disponibili}}",
"empty": "Al momento non ci sono pacchetti disponibili.",
"buy": "Acquista"
},
"topup": {
"title": "Ricarica con PayPal",
"subtitle": "Paga in sicurezza con PayPal e i tuoi crediti vengono aggiunti non appena il pagamento va a buon fine.",
"cancelled": "Il pagamento è stato annullato — non è stato addebitato nulla.",
"chooseAmount": "Scegli un importo",
"notConfiguredPre": "PayPal non è ancora configurato. Un amministratore deve impostare",
"notConfiguredAnd": "e",
"notConfiguredOptional": "(e facoltativamente",
"notConfiguredPost": "per la modalità sandbox o live).",
"balanceTitle": "Il tuo saldo",
"signedInAs": "Hai effettuato l'accesso come {username}",
"credits": "Crediti",
"creditsPerUnit": "Crediti per 1,00 {currency}",
"rateLine": "Ricevi <strong>{amount}</strong> crediti per 1,00 {currency}. I crediti compaiono nel gioco al tuo prossimo accesso."
},
"marketplace": {
"title": "Mercatino",
"subtitle": "Sfoglia mobili e rari messi in vendita dai giocatori. Le inserzioni vengono create nel gioco e si aggiornano in tempo reale — entra nell'hotel per fare un'offerta.",
"activeOffers": "Offerte attive",
"sellers": "Venditori",
"totalValue": "Valore totale",
"activeListings": "Inserzioni attive",
"mostRecentFirst": "Prima le più recenti",
"empty": "Al momento non ci sono offerte attive nel mercatino. Riprova più tardi.",
"colOffer": "Offerta",
"colItem": "Oggetto",
"colSeller": "Venditore",
"colPrice": "Prezzo",
"colListed": "Pubblicata",
"itemLabel": "Oggetto #{id}",
"userLabel": "Utente #{id}",
"justNow": "proprio ora",
"minutesAgo": "{count} min fa",
"hoursAgo": "{count} h fa",
"daysAgo": "{count} g fa"
},
"rares": {
"title": "Valori dei rari",
"subtitle": "Ottieni una panoramica di tutti i rari dell'hotel, raggruppati per categoria.",
"empty": "Al momento non abbiamo rari elencati qui.",
"rareCount": "{count, plural, one {# raro} other {# rari}}",
"viewRares": "Vedi i rari →"
},
"rareCategory": {
"rareCount": "{count, plural, one {# raro in questa categoria} other {# rari in questa categoria}}",
"allRares": "← Tutti i rari",
"empty": "Ancora nessun raro elencato in questa categoria.",
"colRare": "Raro",
"colCredits": "Crediti",
"colCurrency": "Valuta",
"creditsValue": "{value} crediti",
"duckets": "Duckets",
"diamonds": "Diamanti",
"credits": "Crediti"
},
"redeem": {
"title": "Riscatta un buono",
"subtitle": "Hai un codice buono? Inseriscilo qui sotto per aggiungere la ricompensa al tuo account.",
"enterCode": "Inserisci il tuo codice",
"oncePerAccount": "Ogni buono può essere riscattato una sola volta per account.",
"balanceTitle": "Il tuo saldo",
"signedInAs": "Hai effettuato l'accesso come {username}",
"credits": "Crediti",
"instantCredit": "Le ricompense riscattate vengono accreditate immediatamente e compaiono nel gioco al tuo prossimo accesso."
},
"help": {
"title": "Centro assistenza",
"subtitle": "Trova guide, argomenti di supporto e le regole dell'hotel: tutto ciò che ti serve per ricevere aiuto.",
"myTickets": "I miei ticket →",
"topicsTitle": "Argomenti di supporto",
"topicsSubtitle": "Sfoglia guide e risposte alle domande più comuni",
"topicsEmpty": "Ancora nessun argomento di aiuto.",
"rulesTitle": "Regole dell'hotel",
"rulesSubtitle": "Leggile prima di trascorrere del tempo nell'hotel",
"rulesEmpty": "Ancora nessuna regola pubblicata.",
"categoryEmpty": "Nessuna regola in questa categoria."
},
"helpCategory": {
"back": "← Centro assistenza",
"topicSubtitle": "Argomento del centro assistenza",
"moreTitle": "Altri argomenti di aiuto",
"moreSubtitle": "Passa a un altro argomento di supporto"
},
"helpTickets": {
"title": "Ticket di assistenza",
"subtitle": "Invia un ticket allo staff e tieni traccia delle tue richieste aperte.",
"statTotal": "Ticket totali",
"statOpen": "Aperti",
"statClosed": "Chiusi",
"newTitle": "Nuovo ticket",
"newSubtitle": "Descrivi il tuo problema e lo staff ti ricontatterà",
"subjectPlaceholder": "Oggetto",
"contentPlaceholder": "Descrivi il tuo problema…",
"submit": "Invia ticket",
"listTitle": "I tuoi ticket",
"listSubtitle": "Tutte le richieste che hai inviato allo staff",
"listEmpty": "Non hai ancora nessun ticket.",
"colId": "ID",
"colSubject": "Oggetto",
"colStatus": "Stato",
"colCreated": "Creato",
"statusOpen": "Aperto",
"statusClosed": "Chiuso"
},
"applyStaff": {
"title": "Candidati per lo staff di {hotel}",
"subtitle": "Apriamo le candidature per lo staff di tanto in tanto. Se trovi una posizione che senti perfetta per te, non esitare a candidarti.",
"noPositionsTitle": "Nessuna posizione aperta",
"noPositionsBody": "Al momento non ci sono posizioni aperte. Torna più tardi per verificare se nel frattempo ci sono nuove opportunità. Grazie per il tuo interesse.",
"noDeadline": "Nessuna scadenza impostata",
"deadline": "Scadenza candidatura: {date}",
"alreadyApplied": "Ti sei già candidato per {rank}",
"aboutYou": "Parlaci di te",
"aboutPlaceholder": "Raccontaci perché saresti un ottimo {rank}…",
"applyFor": "Candidati per {rank}"
},
"applyTeam": {
"title": "Candidati per il team di {hotel}",
"subtitle": "Apriamo le candidature per il team periodicamente. Se vedi un team adatto a te, non esitare a candidarti!",
"noPositionsTitle": "Nessuna posizione nel team aperta",
"noPositionsBody": "Al momento non ci sono posizioni aperte nel team. Torna più tardi per verificare se ci sono nuove opportunità. Grazie!",
"pending": "La tua candidatura è in attesa",
"aboutYou": "Parlaci di te",
"aboutPlaceholder": "Raccontaci perché saresti perfetto per {rank}…",
"applyFor": "Candidati per {rank}"
},
"radio": {
"title": "Radio",
"subtitle": "Sintonizzati sulla radio dell'hotel — set DJ in diretta, richieste e saluti.",
"nowPlaying": "In riproduzione",
"nothingPlaying": "Nessun brano in riproduzione al momento.",
"onAir": "In onda: {dj}",
"noDj": "Nessun DJ in onda.",
"audioUnsupported": "Il tuo browser non supporta l'elemento audio.",
"streamOffline": "Lo streaming è al momento offline.",
"exploreTitle": "Esplora la radio",
"exploreSubtitle": "Programmazione, saluti, richieste e altro",
"linkSchedule": "Programmazione",
"linkScheduleText": "La nostra programmazione settimanale di DJ e show.",
"linkShouts": "Saluti",
"linkShoutsText": "Saluti e richieste dalla community.",
"linkRequests": "Richieste",
"linkRequestsText": "Chiedi al DJ di mettere il tuo brano preferito.",
"linkApply": "Candidati come DJ",
"linkApplyText": "Unisciti al team e va' in onda.",
"linkLeaderboard": "Classifica",
"linkLeaderboardText": "I migliori ascoltatori in base ai punti guadagnati.",
"todayTitle": "Programmazione di oggi",
"todayTitleWithDay": "Programmazione di oggi · {day}",
"todaySubtitle": "Cosa c'è in onda oggi",
"fullWeek": "Settimana intera →",
"noShowsToday": "Nessuno show in programma per oggi.",
"colTime": "Orario",
"colShow": "Show",
"colDj": "DJ",
"untitledShow": "Show senza titolo",
"userNumber": "Utente #{id}"
},
"radioSchedule": {
"title": "Programmazione radio",
"subtitle": "La nostra programmazione settimanale di DJ e show",
"empty": "Nessuno show ancora in programma.",
"colDay": "Giorno",
"colTime": "Orario",
"colDj": "DJ",
"colShow": "Show",
"noShows": "Nessuno show"
},
"radioShouts": {
"title": "Saluti radio",
"subtitle": "Saluti e richieste dalla community",
"postTitle": "Pubblica un saluto",
"postSubtitle": "Invia un messaggio al DJ in onda",
"messageLabel": "Il tuo messaggio",
"messagePlaceholder": "Invia un saluto al DJ…",
"shoutButton": "Invia",
"loginToPost": "Accedi per pubblicare un saluto.",
"latestTitle": "Ultimi saluti",
"latestSubtitle": "I messaggi più recenti degli ascoltatori",
"empty": "Ancora nessun saluto. Sii il primo!"
},
"radioContests": {
"title": "Concorsi radio",
"subtitle": "Sintonizzati e partecipa ai nostri ultimi concorsi in onda",
"empty": "Ancora nessun concorso.",
"contestLabel": "Concorso #{id}",
"dateUnknown": "Data sconosciuta"
},
"radioGiveaways": {
"title": "Omaggi radio",
"subtitle": "Resta in ascolto per avere la possibilità di vincere ai nostri omaggi radio",
"empty": "Ancora nessun omaggio.",
"giveawayLabel": "Omaggio #{id}",
"dateUnknown": "Data sconosciuta"
},
"radioLeaderboard": {
"title": "Classifica ascoltatori radio",
"subtitle": "I 50 migliori ascoltatori per punti guadagnati sintonizzandosi sulla radio",
"empty": "Ancora nessun punto ascoltatore da mostrare.",
"colRank": "Posizione",
"colAvatar": "Avatar",
"colListener": "Ascoltatore",
"colPoints": "Punti"
},
"radioApply": {
"title": "Candidati come DJ radiofonico",
"subtitle": "Raccontaci di te e perché saresti perfetto per andare in onda",
"latestTitle": "La tua ultima candidatura",
"statusLabel": "Stato:",
"submittedOn": "· inviata il {date}",
"submitAgain": "Puoi inviare di nuovo qui sotto se i tuoi dati sono cambiati.",
"formTitle": "Modulo di candidatura",
"formSubtitle": "Tutti i campi contrassegnati come obbligatori devono essere compilati",
"realNameLabel": "Nome reale",
"realNamePlaceholder": "Il tuo nome completo",
"ageLabel": "Età",
"availabilityLabel": "Disponibilità",
"availabilityPlaceholder": "In quali giorni e orari puoi trasmettere?",
"musicStyleLabel": "Stile musicale",
"musicStylePlaceholder": "es. House, Pop, Hip-Hop",
"experienceLabel": "Esperienza",
"optional": "(facoltativo)",
"experiencePlaceholder": "Hai esperienze precedenti come DJ o conduttore?",
"motivationLabel": "Motivazione",
"motivationPlaceholder": "Perché vuoi entrare nel team della radio?",
"submitButton": "Invia candidatura"
},
"settings": {
"accountSettings": "Impostazioni account",
"accountSettingsSubtitle": "Gestisci il tuo profilo, la sicurezza e gli account collegati",
"publicProfile": "Il tuo profilo pubblico",
"noMotto": "Nessun motto",
"noEmail": "Nessuna e-mail registrata",
"changeMotto": "Cambia motto",
"changeMottoSubtitle": "Si aggiorna subito in gioco se sei online",
"mottoPlaceholder": "Il tuo motto",
"saveMotto": "Salva motto",
"securityTitle": "Sicurezza",
"securitySubtitle": "Autenticazione a due fattori",
"securityDescription": "Aggiungi un ulteriore livello di protezione al tuo account.",
"twoFactorLink": "Autenticazione a due fattori",
"connectionsTitle": "Account collegati",
"connectionsSubtitle": "Accedi con un clic",
"connectionsDescription": "Collega Discord o Google al tuo account dell'hotel.",
"manageConnections": "Gestisci collegamenti"
},
"settings2fa": {
"backToSettings": "← Impostazioni",
"title": "Autenticazione a due fattori",
"subtitle": "Aggiungi un livello di sicurezza in più con un'app di autenticazione",
"nowEnabled": "L'autenticazione a due fattori è ora attiva. 🔒",
"disabledNotice": "L'autenticazione a due fattori è stata disattivata.",
"badCode": "Codice non valido, riprova.",
"noAppKeyPrefix": "L'autenticazione a due fattori non è disponibile finché non è configurata",
"noAppKeyMiddle": "(la stessa",
"noAppKeySuffix": "Laravel del tuo AtomCMS, così i segreti esistenti restano leggibili).",
"isEnabled": "L'autenticazione a due fattori è attiva",
"onYourAccount": "sul tuo account.",
"disable": "Disattiva 2FA",
"scanOrEnter": "Scansiona o inserisci questa chiave",
"scanInstructions": "Aggiungila a Google Authenticator / Authy, poi inserisci il codice a 6 cifre per confermare.",
"manualKey": "Chiave manuale:",
"codePlaceholder": "Codice a 6 cifre",
"confirm": "Conferma",
"enableIntro": "Aggiungi un livello di sicurezza in più con un'app di autenticazione.",
"enable": "Attiva 2FA"
},
"connections": {
"backToSettings": "← Impostazioni",
"title": "Account collegati",
"subtitle": "Collega un account social per poter accedere con un clic",
"matchByEmail": "Lo abbiniamo al tuo account dell'hotel tramite e-mail, quindi usa l'indirizzo registrato:",
"lookupFailed": "Al momento non riusciamo a leggere i tuoi account collegati. Puoi comunque collegarne uno qui sotto: lo stato verrà mostrato non appena disponibile.",
"statusUnavailable": "Non disponibile su questo hotel.",
"statusConnected": "Collegato — accedi con questo account.",
"statusNotConnected": "Non collegato.",
"connected": "Collegato",
"connectProvider": "Collega {provider}",
"unavailable": "Non disponibile",
"footerNote": "Il collegamento ti porta al provider per l'autorizzazione, poi ti riporta qui. Se l'e-mail del tuo account social non corrisponde a un account dell'hotel, verrai riportato alla schermata di accesso con una nota."
},
"login": {
"title": "Accedi",
"subtitle": "Bentornato — accedi per entrare nell'hotel.",
"subtitle2fa": "Inserisci il codice a 6 cifre della tua app di autenticazione.",
"usernamePlaceholder": "Nome utente",
"passwordPlaceholder": "Password",
"codePlaceholder": "Codice 2FA",
"pleaseWait": "Attendi…",
"verify": "Verifica",
"signIn": "Accedi",
"or": "oppure",
"continueWithDiscord": "Continua con Discord",
"continueWithGoogle": "Continua con Google",
"noAccount": "Non hai un account?",
"createOne": "Creane uno",
"forgotPassword": "Password dimenticata?",
"errorInvalidCredentials": "Nome utente o password non validi",
"errorInvalid2fa": "Codice 2FA non valido"
},
"register": {
"title": "Crea un account",
"subtitle": "Entra nell'hotel — bastano pochi istanti.",
"usernamePlaceholder": "Nome utente",
"emailPlaceholder": "Email",
"passwordPlaceholder": "Password (min 6 caratteri)",
"register": "Registrati",
"alreadyHaveAccount": "Hai già un account?",
"signIn": "Accedi"
},
"forgot": {
"title": "Reimposta password",
"subtitle": "Ti invieremo via e-mail un link sicuro per impostare una nuova password.",
"sentNotice": "Se l'indirizzo è registrato, ti abbiamo inviato un link per il reset. Controlla la posta in arrivo.",
"emailPlaceholder": "La tua email",
"sendResetLink": "Invia link di reset",
"backToLogin": "Torna all'accesso"
},
"reset": {
"title": "Imposta una nuova password",
"subtitle": "Scegli una password robusta che non usi altrove.",
"passwordPlaceholder": "Nuova password (min 6 caratteri)",
"resetPassword": "Reimposta password",
"backToLogin": "Torna all'accesso"
},
"verify": {
"verifiedTitle": "È tutto pronto",
"verifiedSubtitle": "Email verificata",
"verifiedBody": "Il tuo indirizzo email è stato verificato. Ora puoi accedere e giocare.",
"goToLogin": "Vai all'accesso",
"alreadyTitle": "Già verificata",
"alreadySubtitle": "Niente da fare",
"alreadyBody": "Questo indirizzo email è già stato confermato.",
"unavailableTitle": "Riprova tra poco",
"unavailableSubtitle": "Server irraggiungibile",
"unavailableBody": "Non siamo riusciti a raggiungere il server per verificare la tua email. Riprova il link tra un momento.",
"invalidTitle": "Verifica email",
"invalidSubtitle": "Link non valido o scaduto",
"invalidBody": "Questo link di verifica non è valido. Assicurati di aver aperto il link completo della tua email, oppure richiedine uno nuovo.",
"backToLogin": "Torna all'accesso"
},
"banned": {
"title": "Sei stato bannato",
"subtitle": "Account sospeso",
"body": "Il tuo account è stato sospeso dall'hotel.",
"reasonLabel": "Motivo:",
"permanent": "Questo ban è permanente.",
"expires": "Scade il {date}.",
"contactStaff": "Se ritieni che si tratti di un errore, contatta lo staff."
},
"maintenance": {
"title": "{hotel} è in manutenzione",
"subtitle": "Torneremo a breve",
"staffCanLogIn": "Lo staff può comunque accedere."
}
}
}