Files
d4rkbot/frontend/src/locales/en.js
T
D4rkst3randClaude Opus 5 5073e7bcf4
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled
Jede Idee bekommt ihre eigene Seite mit der Unterhaltung aus dem Thread
Vorbild windrose.support: Klick auf eine Idee, und man sieht sie ganz — Stand,
Begruendung, wer sie eingereicht hat, und darunter, was dazu geschrieben wurde.

Der Unterschied bleibt, wo geschrieben wird. Die Beitraege sind aus dem
Discord-Thread gespiegelt, nicht hier getippt. Deshalb fuehrt der einzige
Knopf am Ende in den Thread und nicht in ein Formular. Ein zweiter Ort fuer
dieselbe Unterhaltung waere genau das, was ich beim Konzept als das Falsche
bezeichnet habe.

Bisher wurde nur mitgezaehlt. Jetzt landen die Beitraege in einer eigenen
Tabelle — mit Bearbeiten und Loeschen, sonst stuende auf der Webseite fuer
immer, was in Discord laengst zurueckgenommen wurde. Reine Bild-Posts ohne Text
bleiben draussen, die haetten hier nichts zu sagen.

Der Kommentar-Zaehler wird jetzt aus der Tabelle gezaehlt statt in einer Spalte
mitgefuehrt. Eine Wahrheit statt zwei, die auseinanderlaufen koennen — dieselbe
Ueberlegung wie beim Zuspruch.

Nebenbei geprueft, weil es haette schiefgehen koennen: /api/wishes/suche und
/api/wishes/:id liegen auf derselben Ebene. Der Router bevorzugt die feste
Route vor der mit Platzhalter — nachgestellt mit find-my-way, nicht aus dem
Gedaechtnis behauptet.

Geprueft: im Browser die Seite mit drei Beitraegen und die ohne (kein Thread,
keine Begruendung, Hinweis statt Liste), der Weg von der Roadmap dorthin ohne
Neuladen, Migration erneut durchgespielt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 00:05:27 +02:00

397 lines
22 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// English texts for the public pages. Mirrors de.js key for key — a missing
// key here falls back to the German string, never to a bare key.
export default {
// ── Navigation & chrome ───────────────────────────
'nav.devlog': 'Devlog',
'nav.roadmap': 'Roadmap',
'nav.server': 'Servers',
'nav.community': 'Community',
'nav.gallery': 'Gallery',
'nav.level': 'Levels',
'nav.events': 'Events',
'nav.changelog': 'Changelog',
'nav.config': 'Config',
'nav.profile': 'Profile',
'nav.commits': 'Commits',
'nav.login': 'Log in',
'nav.loginDiscord': 'Log in with Discord',
'nav.logout': 'Log out',
'nav.features': 'Features',
'nav.commands': 'Commands',
'nav.dashboard': 'Dashboard',
'nav.signIn': 'Sign in',
'nav.signOut': 'Sign out',
'nav.menu': 'Menu',
'footer.source': 'Source',
'footer.status': 'Status',
'footer.imprint': 'Imprint',
'footer.privacy': 'Privacy',
'gate.text': 'Logging in is for members of the Discord server — join the server first, then log in again.',
'gate.join': 'Join Discord',
'gate.hide': 'Hide',
// ── Shared ────────────────────────────────────────
'common.loading': 'Loading …',
'common.newer': 'Newer',
'common.older': 'Older',
'common.readDevlogs': 'Read devlogs',
'common.toRoadmap': 'To the roadmap',
'common.today': 'today',
'common.yesterday': 'yesterday',
'common.daysAgo': '%s days ago',
'common.monthAgo': '1 month ago',
'common.monthsAgo': '%s months ago',
// ── Home (hub) ────────────────────────────────────
'home.tag': '// Community hub',
'home.welcome': 'Welcome',
'home.at': 'to',
'home.subtitle': 'Devlogs, roadmap, server status and everything from the community — in one place, straight out of Discord.',
'home.discord': 'Join Discord',
'home.readDevlogs': 'Read devlogs',
'home.members': 'members on Discord',
'home.serversOnline': 'servers online',
'home.playersNow': 'players right now',
'home.services': '// Services',
'home.latestDevlog': '// Latest devlog',
'home.more': 'Read more',
'home.tile.devlog': 'Development updates, fresh from the editor',
'home.tile.roadmap': 'Milestones plus community wishes to vote on',
'home.tile.server': 'Live status of every game server, with history',
'home.tile.gallery': 'Screenshots from the community',
'home.tile.level': 'XP leaderboard — who talks the most?',
'home.tile.events': 'Playtests, streams and whatever else is coming up',
'nav.status': 'Status',
'status.tag': '// Operational status',
'status.subtitle': 'Reachability of services and game servers — refreshed every 60 seconds.',
'status.error': 'The status could not be loaded.',
'status.allOk': 'All systems operational',
'status.partial': 'Partially degraded',
'status.majorOutage': 'Major outage',
'status.waiting': 'Checking',
'status.nothing': 'Nothing set up',
'status.services': '// Services',
'status.gameservers': '// Game servers',
'status.incidents': '// Incidents in the last 90 days',
'status.noIncidents': 'No incidents recorded.',
'status.ok': 'operational',
'status.down': 'down',
'status.ongoing': 'ongoing',
'status.minutes': '%s min',
'status.days90': '90 days ago',
// ── Devlogs ───────────────────────────────────────
'devlogs.tag': '// Archive',
'devlogs.subtitle': 'Development updates, fresh from the editor — archived automatically.',
'devlogs.all': 'All',
'devlogs.search': 'Search devlogs …',
'devlogs.hits': '%s results',
'devlogs.error': 'Devlogs could not be loaded.',
'devlogs.noHits': 'No results for “%s”.',
'devlogs.noneForProject': 'No devlogs for %s yet.',
'devlogs.none': 'No devlogs archived yet.',
'devlogs.permalink': 'Direct link to this devlog',
'devlogs.delete': 'Remove from the archive',
'devlogs.confirmDelete': 'Remove this devlog from the archive?',
'devlogs.deleteFailed': 'Deleting failed.',
'devlogs.screenshot': 'Devlog screenshot',
// ── Devlog permalink ──────────────────────────────
'devlog.tag': '// Devlog',
'devlog.project': 'Project: %s',
'devlog.notFound': 'Devlog not found —',
'devlog.backToArchive': 'back to the archive',
'devlog.allDevlogs': 'All devlogs',
'devlog.copyLink': 'Copy link',
'devlog.linkCopied': 'Link copied',
// ── Roadmap ───────────────────────────────────────
'roadmap.tag': '// Where this is heading',
'roadmap.subtitle': 'Milestones straight from development — live from the issue tracker.',
'roadmap.error': 'The roadmap could not be loaded.',
'roadmap.noMilestones': 'No milestones yet.',
'roadmap.active': '// In progress',
'roadmap.planned': '// Planned',
'roadmap.done': '// Done',
'roadmap.nothingActive': 'Nothing in progress right now.',
'roadmap.due': 'Due: %s',
'roadmap.tasks': '%s / %s tasks',
'roadmap.activity': '// Activity — %s commits in 12 months',
'roadmap.commitsOn': '%s: %s commits',
'roadmap.commitOn': '%s: 1 commit',
'roadmap.sort': 'Sort',
'roadmap.sortTop': 'Top',
'roadmap.sortTrend': 'Trending',
'roadmap.sortNew': 'New',
'roadmap.status': 'Status',
'roadmap.area': 'Area',
'roadmap.areaPick': '— Area —',
'wunsch.tag': '// Idea',
'wunsch.back': 'Back to the roadmap',
'wunsch.notFound': 'This idea does not exist (any more).',
'wunsch.by': 'by %s',
'wunsch.teamSays': 'From the team',
'wunsch.comments': '// %s comments',
'wunsch.oneComment': '// 1 comment',
'wunsch.noComments': 'Nothing said about this yet — start it off in the thread.',
'wunsch.joinThread': 'Join the thread on Discord',
'wish.alle': 'All',
'wish.offen': 'Under review',
'wish.geplant': 'Planned',
'wish.inArbeit': 'In progress',
'wish.umgesetzt': 'Shipped',
'wish.abgelehnt': 'Not planned',
'roadmap.noneInFilter': 'Nothing here right now.',
'roadmap.alreadyThere': 'Already suggested — vote for it instead:',
'roadmap.wishes': '// Community wishes',
'roadmap.unvote': 'Take back your vote',
'roadmap.vote': 'Vote for this',
'roadmap.ideaPlaceholder': 'Your idea for the server …',
'roadmap.submit': 'Submit',
'roadmap.hint': 'Got an idea? Use %s on Discord — or log in here and vote right away.',
'roadmap.voteMembersOnly': '✗ Only Discord members can vote.',
'roadmap.tooShort': '✗ A little more text, please.',
'roadmap.submitted': '✓ Wish submitted — it is up for a vote on Discord too!',
'roadmap.submitMembersOnly': '✗ Only Discord members can submit.',
'roadmap.submitFailed': '✗ Could not submit the wish.',
// ── Servers ───────────────────────────────────────
'server.tag': '// Live status',
'server.subtitle': 'Every game server at a glance — refreshed every 2 minutes.',
'server.error': 'The server status could not be loaded.',
'server.none': 'No servers added yet.',
'server.online': 'Online',
'server.offline': 'Offline',
'server.waiting': 'Waiting for check',
'server.players24h': 'Player count · last 24h',
'server.peak': 'Peak',
'server.uptime': 'Uptime',
'server.measuredSince': 'measuring since %s',
'server.days7': '7 days ago',
'server.now': 'now',
'server.noData': 'no reading',
'server.connect': 'Connect',
'server.copyAddress': 'Copy address',
'server.copied': 'Copied!',
'server.checkedAt': 'Last checked: %s',
'server.serversOnline': 'servers online',
'server.playersNow': 'players right now',
// ── Gallery ───────────────────────────────────────
'gallery.tag': '// Community',
'gallery.subtitle': 'Screenshots from the community — straight out of Discord.',
'gallery.error': 'The gallery could not be loaded.',
'gallery.emptyTitle': 'No screenshots yet',
'gallery.emptyText': 'Anything posted in the screenshot channel shows up here automatically — name and date included.',
'gallery.shotBy': 'Screenshot by %s',
// ── Levels ────────────────────────────────────────
'level.tag': '// Leaderboard',
'level.subtitle': 'XP comes from joining the conversation on Discord — here are the most active. %s shows your rank.',
'level.error': 'The leaderboard could not be loaded.',
'level.emptyTitle': 'No XP awarded yet',
'level.emptyText': 'XP comes from joining the conversation on Discord. As soon as people start writing, the leaderboard fills itself.',
'level.lv': 'Lv. %s',
'level.activity': '// Server activity — %s messages in 30 days · %s members',
'level.barTitle': '%s: %s messages · +%s/%s members',
// ── Events ────────────────────────────────────────
'events.tag': '// Dates',
'events.subtitle': 'Playtests, streams & community nights — straight out of Discord.',
'events.error': 'Events could not be loaded.',
'events.emptyTitle': 'No events planned yet',
'events.emptyText': 'We announce playtests, streams and community rounds here — and Discord will remind you.',
'events.tbd': 'Date to be announced',
'events.interested': '%s interested',
'events.viewInDiscord': 'View on Discord',
// ── Changelog ─────────────────────────────────────
'changelog.tag': '// Releases',
'changelog.subtitle': 'Every version and its release notes.',
'changelog.error': 'The changelog could not be loaded.',
'changelog.emptyTitle': 'No releases yet',
'changelog.emptyText': 'As soon as a version ships, it shows up here with all its changes. Until then, the devlog has the progress.',
'changelog.prerelease': 'Pre-release',
'changelog.noNotes': '*No release notes.*',
'changelog.viewInGitea': 'View release on Gitea',
// ── Bot product page: landing ─────────────────────
'bot.tag': '// Self-built, no paywall',
'bot.title1': 'A Discord bot',
'bot.title2': 'that does it all',
'bot.subtitle': 'Devlogs, levels, moderation, server monitoring, giveaways, tickets — what usually takes three subscription bots runs here in one, with its own web interface.',
'bot.allFeatures': 'All features',
'bot.viewCommands': 'View commands',
'bot.statFeatures': 'features, each one switchable',
'bot.statCommands': 'slash commands',
'bot.statGames': 'games in the monitor',
'bot.statCost': 'cost, no premium tiers',
'bot.whatItDoes': '// What it does',
'bot.forDevs': '// For developers',
'bot.runsFor': 'The bot runs for the D4RKST3R community',
'bot.runsForWith': 'The bot runs for the D4RKST3R community with %s members',
'bot.toHub': 'to the community hub',
'bot.hl.devlogs': 'Devlogs & feeds',
'bot.hl.devlogs.text': 'Development reports land in Discord as a branded embed and get archived searchably at the same time. Commits and releases from Gitea, too.',
'bot.hl.monitor': 'Server monitor',
'bot.hl.monitor.text': 'Over 300 games via gamedig, plus FiveM and plain reachability checks. One live embed per server, an alert when one goes down, player count in the bot presence.',
'bot.hl.level': 'Levels & activity',
'bot.hl.level.text': 'XP for joining the conversation with role rewards, a public leaderboard and activity stats for the server.',
'bot.hl.roles': 'Role menus',
'bot.hl.roles.text': 'Self-service at the press of a button — on Discord and in the browser. A colour per button, exclusive if you want.',
'bot.hl.support': 'Support & contact',
'bot.hl.support.text': 'Tickets as private threads with a transcript, plus modmail: a DM to the bot reaches the team.',
'bot.hl.mod': 'Moderation',
'bot.hl.mod.text': 'Warnings with history, timeouts, cleanup — all in the mod log, plus a record of joins, name changes and role changes.',
'bot.hl.giveaway': 'Giveaways',
'bot.hl.giveaway.text': 'Enter with a button, automatic draw, reroll when nobody answers.',
'bot.hl.birthday': 'Birthdays',
'bot.hl.birthday.text': 'Add your day if you like — the bot congratulates you in the morning and hands out a role for the day.',
'bot.hl.welcome': 'Welcome cards',
'bot.hl.welcome.text': 'New members get a rendered image with their avatar and member number.',
'bot.dev.api': 'API & single sign-on',
'bot.dev.api.text': 'Your own scripts post through API v1 with bearer keys and scoped permissions. Other services reuse the bots Discord login and get the roles delivered with it.',
'bot.dev.host': 'Runs anywhere',
'bot.dev.host.text': 'Node and SQLite in one container, one volume for the data. Nightly backups included — of the database and every repository.',
// ── Bot product page: features ────────────────────
'features.tag': '// Everything included, nothing behind a paywall',
'features.title': 'Features',
'features.subtitleN': '%s features — each one switchable, each one configurable in the browser.',
'features.subtitle': 'Every feature switchable on its own, every one configurable in the browser.',
'features.extras': '// Around it',
'features.outro': 'Built because three bots with three subscriptions for one community is neither tidy nor cheap. The source is open, running it costs one container.',
'features.overview': 'Back to the overview',
'features.x.brand': 'Web interface in your own look',
'features.x.brand.text': 'Every feature is set in the browser — no config file, no restart. Colours, bot avatar and banner included, and other services can share the same look.',
'features.x.texts': 'Write the texts yourself',
'features.x.texts.text': 'Welcome message, level announcement, ticket texts — everything the bot says out loud can be changed in the panel, with placeholders for name, number and link.',
'features.x.api': 'API & single sign-on',
'features.x.api.text': 'Your own scripts post through API v1 with bearer keys and scoped permissions. Other services reuse the Discord login and get the roles delivered with it.',
'features.x.pages': 'Your own pages',
'features.x.pages.text': 'Rules, about us, FAQ — written in Markdown, published with one click and added to the menu automatically.',
'features.x.team': 'Permissions for the team',
'features.x.team.text': 'Team members get targeted access to individual areas. Who changed what is in the log.',
'features.x.host': 'Runs anywhere',
'features.x.host.text': 'Node and SQLite in one container, one volume for the data. Nightly backups included — of the database and every repository.',
// ── Module names for the features page ────────────
// Keyed by module id from src/modules.js. Anything missing here keeps the
// German text the server sends, so a new module never vanishes.
'fgroup.inhalte': 'Content & feeds',
'fgroup.community': 'Community',
'fgroup.moderation': 'Moderation & support',
'fgroup.server': 'Server & tech',
'feat.devlogs': 'Devlogs',
'feat.devlogs.desc': 'Post development reports as a branded embed and archive them searchably.',
'feat.commit_feed': 'Commit feed',
'feat.commit_feed.desc': 'Pushes from Gitea land in the channel as an embed. Archiving happens regardless.',
'feat.releases': 'Release announcements',
'feat.releases.desc': 'New releases get announced and land in the public changelog.',
'feat.weekly_recap': 'Weekly recap',
'feat.weekly_recap.desc': 'A summary of the week, Sundays at 8 pm.',
'feat.devlog_threads': 'Devlog threads',
'feat.devlog_threads.desc': 'A discussion thread opens under every devlog.',
'feat.social': 'Twitch & YouTube',
'feat.social.desc': 'Announces live streams and new videos.',
'feat.levels': 'Level system',
'feat.levels.desc': 'XP for joining the conversation, role rewards and a public leaderboard.',
'feat.starboard': 'Starboard',
'feat.starboard.desc': 'Messages with enough stars land in a best-of channel.',
'feat.gallery': 'Screenshot gallery',
'feat.gallery.desc': 'Images from one channel show up in the public gallery.',
'feat.voting': 'Feature wishes',
'feat.voting.desc': 'Submit wishes and vote on them — on Discord and on the roadmap.',
'feat.polls': 'Polls',
'feat.polls.desc': 'Quick votes as a native Discord poll — /umfrage.',
'feat.giveaways': 'Giveaways',
'feat.giveaways.desc': 'Enter with a button, automatic draw, reroll available.',
'feat.birthdays': 'Birthdays',
'feat.birthdays.desc': 'Congratulations on the big day, with a role for the day if you like.',
'feat.events': 'Event announcements',
'feat.events.desc': 'New Discord events get announced and show up on the events page.',
'feat.playtester': 'Playtester programme',
'feat.playtester.desc': 'Application button, role and participant list.',
'feat.alpha_keys': 'Alpha keys',
'feat.alpha_keys.desc': 'A pool of keys handed out by direct message.',
'feat.role_menus': 'Role menus',
'feat.role_menus.desc': 'Self-service roles at the press of a button — on Discord and in the profile.',
'feat.linked_roles': 'Linked roles',
'feat.linked_roles.desc': 'Roles tied to verified numbers — level, playtester, how long someone has been around.',
'feat.applications': 'Applications',
'feat.applications.desc': 'Forms as input dialogs, review with accept and reject.',
'feat.moderation': 'Moderation',
'feat.moderation.desc': 'Warnings, timeouts, cleanup — with history and a log.',
'feat.anti_raid': 'Raid protection',
'feat.anti_raid.desc': 'Spots waves of joins and locks the server down for a while.',
'feat.automod': 'AutoMod log',
'feat.automod.desc': "Hits from Discord's own filter land in the log; rules can be switched here.",
'feat.modlog': 'Audit log',
'feat.modlog.desc': 'Deleted and edited messages, joins, name and role changes.',
'feat.modmail': 'Modmail',
'feat.modmail.desc': 'Direct messages to the bot reach the team as a thread.',
'feat.tickets': 'Tickets',
'feat.tickets.desc': 'Private threads at the press of a button, with a transcript on close.',
'feat.welcome': 'Welcome cards',
'feat.welcome.desc': 'New members are greeted with a rendered image.',
'feat.autorole': 'Auto role',
'feat.autorole.desc': 'New members automatically get a starting role.',
'feat.sticky_roles': 'Sticky roles',
'feat.sticky_roles.desc': 'Leave the server and come back — your roles come back with you.',
'feat.bug_reports': 'Bug reports',
'feat.bug_reports.desc': 'Reports become issues in the repository, with a reply when they close.',
'feat.server_monitor': 'Server monitor',
'feat.server_monitor.desc': 'Live status of the game servers with history and downtime alerts.',
'feat.watchdog': 'Reachability watchdog',
'feat.watchdog.desc': 'Checks the addresses you enter and reports outages by direct message.',
'feat.temp_voice': 'Temporary voice channels',
'feat.temp_voice.desc': 'Joining the hub creates your own channel with a control panel.',
'feat.triggers': 'Auto replies',
'feat.triggers.desc': 'The bot answers to keywords you set.',
'feat.reminders': 'Reminders',
'feat.reminders.desc': 'Members can have themselves reminded by direct message.',
'feat.scheduled_posts': 'Scheduled posts',
'feat.scheduled_posts.desc': 'Messages at fixed times, once or recurring.',
'feat.tags': 'Text snippets',
'feat.tags.desc': 'Call up saved texts with a command.',
'feat.backups': 'Database backup',
'feat.backups.desc': 'A nightly backup kept for 14 days.',
'feat.repo_backups': 'Repository backup',
'feat.repo_backups.desc': 'Back up every Gitea repository as a bundle.',
'feat.member_gate': 'Members-only login',
'feat.member_gate.desc': 'Only people on the Discord server can sign in on the web.',
// ── Bot product page: commands ────────────────────
'commands.tag': '// Reference',
'commands.title': 'Commands',
'commands.subtitle': 'Every slash command at a glance. A lot also runs through buttons right inside the messages.',
'commands.note': 'Moderation and setup commands are reserved for members with the matching Discord permissions.',
'commands.g.everyone': 'For everyone',
'commands.g.mod': 'Moderation',
'commands.g.setup': 'Setup',
'commands.rank': 'Shows your rank, your XP and the progress to the next level.',
'commands.wunsch': 'Submits a feature wish — lands in the voting channel and on the roadmap.',
'commands.bug': 'Reports a bug as an issue in the repository. When it is closed, you get a message.',
'commands.bdaySet': 'Saves your birthday. The bot congratulates you in the morning and hands out a role for the day.',
'commands.bdayDel': 'Removes it again.',
'commands.remind': 'Reminds you by direct message — something like “2h” or “30m”.',
'commands.tag': 'Fetches a saved text snippet, with suggestions as you type.',
'commands.ping': 'A sign of life from the bot.',
'commands.umfrage': 'Starts a vote with up to four answers — Discord does the counting.',
'commands.warn': 'Warns someone, sends them a message and writes it to the log.',
'commands.warns': 'Shows the warning history.',
'commands.timeout': 'Puts someone in timeout.',
'commands.purge': 'Deletes several messages at once.',
'commands.raid': 'Shows the raid lockdown, sets it by hand or lifts it right away.',
'commands.giveaway': 'Starts a giveaway with an entry button and an automatic draw.',
'commands.ticketSetup': 'Posts the button that turns support tickets into private threads.',
'commands.playtesterSetup': 'Posts the application button for the playtester programme.',
'commands.devlogBackfill': 'Pulls older devlog messages into the archive after the fact.',
'commands.galerieBackfill': 'The same for the screenshot channel.',
};