mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 15:25:46 +00:00
2409a1fec8
Each src/locales/<lang>.ts (~1800 LOC) becomes a folder src/locales/<lang>/ with one module per i18n namespace (44 each) plus an index.ts barrel that reassembles <lang>Translation in the original key order. Mechanical, script-driven split with a JSON round-trip check: every locale object is byte-identical to its pre-split form. i18n.ts is unchanged — './locales/<lang>' now resolves to the folder index. The per-namespace settings.ts files land ~440-460 LOC; a single i18n namespace is the natural, non-arbitrary split unit for a flat string table, so they are intentionally left whole.
201 lines
14 KiB
TypeScript
201 lines
14 KiB
TypeScript
export const orbit = {
|
|
triggerLabel: 'Orbit',
|
|
triggerTooltip: 'Gemeinsame Hör-Session starten oder beitreten',
|
|
launchCreate: 'Session erstellen',
|
|
launchJoin: 'Session beitreten',
|
|
launchHelp: 'Wie funktioniert das?',
|
|
launchHelpSoon: 'Kommt bald',
|
|
joinModalTitle: 'Einer Orbit-Session beitreten',
|
|
joinModalSub: 'Füge den Einladungslink ein, den dir der Host geschickt hat.',
|
|
joinModalLinkLabel: 'Einladungslink',
|
|
joinModalLinkPlaceholder: 'psysonic2-…',
|
|
joinModalLinkHelper: 'Akzeptiert jeden gültigen Orbit-Link. Der Link muss zu dem Server gehören, auf dem du gerade angemeldet bist.',
|
|
joinModalPasteTooltip: 'Aus Zwischenablage einfügen',
|
|
joinModalSubmit: 'Beitreten',
|
|
joinModalBusy: 'Beitreten…',
|
|
joinErrEmpty: 'Bitte Einladungslink einfügen.',
|
|
joinErrInvalid: 'Das sieht nicht nach einem Orbit-Einladungslink aus.',
|
|
closeAria: 'Schließen',
|
|
heroTitlePrefix: 'Gemeinsam hören mit',
|
|
heroTitleBrand: 'Orbit',
|
|
heroSub: 'Starte eine Session — andere Nutzer auf {{server}} hören im Takt mit dir und können Songs vorschlagen.',
|
|
fallbackServer: 'diesem Server',
|
|
tipLan: 'Du bist aktuell mit einer Heimnetz-Adresse verbunden. Gäste außerhalb deines Heimnetzes können so nicht beitreten — wechsle vor dem Start in den Servereinstellungen zu einer öffentlichen Adresse.',
|
|
tipRemote: 'Damit Gäste außerhalb deines Heimnetzes beitreten können, muss deine Serveradresse öffentlich erreichbar sein. Ist dein Server nur intern verfügbar, wechsle vor dem Start zu einer öffentlichen Adresse.',
|
|
labelName: 'Sessionname',
|
|
namePlaceholder: 'Velvet Orbit',
|
|
reshuffleTooltip: 'Neuer Vorschlag',
|
|
reshuffleAria: 'Neuen Namen vorschlagen',
|
|
helperName: 'So taucht die Session für deine Gäste auf — Vorschlag übernehmen oder eigenen eintippen.',
|
|
labelMax: 'Maximale Gäste',
|
|
helperMax: 'Du zählst nicht mit — das ist nur die Obergrenze für beitretende Gäste.',
|
|
labelLink: 'Einladungslink',
|
|
tooltipCopied: 'Kopiert',
|
|
tooltipCopy: 'Kopieren',
|
|
ariaCopyLink: 'Link kopieren',
|
|
helperLink: 'Schicke diesen Link deinen Gästen. Sie fügen ihn mit Strg+V irgendwo in Psysonic ein.',
|
|
labelClearQueue: 'Eigene Warteschlange vorher leeren',
|
|
helperClearQueue: 'Mit leerer Warteschlange in die Session starten. Aus: bereits aufgereihte Titel bleiben und werden mit den Gästen geteilt.',
|
|
btnCancel: 'Abbrechen',
|
|
btnStarting: 'Starte…',
|
|
btnStart: 'Orbit starten',
|
|
btnCopyAndStart: 'Link kopieren & starten',
|
|
errNameRequired: 'Bitte gib deiner Session einen Namen.',
|
|
errStartFailed: 'Konnte nicht starten.',
|
|
hostLabel: 'Gastgeber: {{name}}',
|
|
participantsTooltip: 'Teilnehmer',
|
|
settingsTooltip: 'Session-Einstellungen',
|
|
shareTooltip: 'Einladungslink teilen',
|
|
shuffleLabel: 'Warteschlange wird neu gemischt in',
|
|
catchUpLabel: 'aufholen',
|
|
catchUpTooltip: 'Zur aktuellen Host-Position springen',
|
|
hostAway: 'Host offline',
|
|
hostOnline: 'Host online',
|
|
endTooltip: 'Session beenden',
|
|
leaveTooltip: 'Session verlassen',
|
|
helpTooltip: 'Wie Orbit funktioniert',
|
|
diag: {
|
|
openTooltip: 'Diagnose — kopierbares Ereignis-Log',
|
|
title: 'Orbit-Diagnose',
|
|
role: 'Rolle',
|
|
hostTrack: 'Host-Track-ID',
|
|
hostPos: 'Host-Position',
|
|
guestTrack: 'Meine Track-ID',
|
|
guestPos: 'Meine Position',
|
|
drift: 'Versatz',
|
|
stateAge: 'Zustand-Alter',
|
|
eventLog: 'Ereignis-Log ({{count}})',
|
|
copyLabel: 'Kopieren',
|
|
copyTooltip: 'Log in Zwischenablage kopieren',
|
|
clearLabel: 'Leeren',
|
|
clearTooltip: 'Puffer leeren',
|
|
empty: 'Noch keine Ereignisse — sie erscheinen sobald Orbit synchronisiert.',
|
|
hint: 'Vor dem Reproduzieren des Problems öffnen, dann Kopieren klicken und in den Bug-Report einfügen.',
|
|
copied: '{{count}} Zeilen kopiert',
|
|
copyFailed: 'Konnte nicht in Zwischenablage kopieren',
|
|
cleared: 'Puffer geleert',
|
|
},
|
|
helpTitle: 'Wie Orbit funktioniert',
|
|
helpIntro: 'Orbit macht aus Psysonic einen gemeinsamen Hörraum. Der Host bestimmt die Musik; Gäste hören synchron mit und können Songs vorschlagen.',
|
|
helpHostOnly: '(Host)',
|
|
helpSec1Title: 'Was ist Orbit?',
|
|
helpSec1Body: 'Ein „Listen together"-Modus — der Host steuert die Wiedergabe, die Gäste hören mit. Alles läuft über Playlists auf deinem eigenen Navidrome-Server; keine externe Infrastruktur.',
|
|
helpSec2Title: 'Host und Gäste',
|
|
helpSec2Body: 'Der Host steuert die Wiedergabe (Play / Pause / Skip / Seek) und entscheidet, wann die Session endet. Gäste folgen der Wiedergabe des Hosts, können Songs vorschlagen und jederzeit verlassen oder wieder beitreten. Nur der Host kann Teilnehmer kicken oder dauerhaft bannen.',
|
|
helpSec2WarnHead: 'Wichtig: getrennte Accounts.',
|
|
helpSec2WarnBody: 'Jeder Teilnehmer braucht einen eigenen Navidrome-Account. Benutzen Host und Gast denselben User, kollidieren ihre Einreichungen und der Host sieht keine Vorschläge vom Gast.',
|
|
helpSec3Title: 'Session starten und einladen',
|
|
helpSec3Body: 'Klick auf den „Orbit"-Button → Session erstellen → im Start-Modal siehst du einen fertigen Einladungslink und kannst optional die aktuelle Warteschlange leeren. Link teilen wie du magst. Während die Session läuft, kopiert der Share-Button in der Session-Leiste oben jederzeit den Link erneut.',
|
|
helpSec4Title: 'Beitreten',
|
|
helpSec4Body: 'Einladungslink irgendwo in Psysonic mit Ctrl+V / Cmd+V einfügen — der Beitritt-Dialog erscheint automatisch. Alternativ: „Orbit" → Session beitreten → Link ins Feld pasten. Wenn der Link auf einen Server zeigt, für den du einen Account hast, wechselt Psysonic automatisch. Bei mehreren Accounts auf demselben Server fragt ein kleiner Picker, welcher genutzt werden soll.',
|
|
helpSec5Title: 'Songs vorschlagen',
|
|
helpSec5Body: 'In jeder Song-Liste: Doppelklick auf eine Zeile, oder Rechtsklick → „Zur Orbit-Session hinzufügen". Ein einfacher Klick zeigt nur einen Hinweis, statt das ganze Album in die geteilte Queue zu werfen — das ist bewusst so. Explizite Bulk-Aktionen wie „Play All" oder „Play Album" fragen zuerst nach und hängen dann an (ersetzen nie).',
|
|
helpSec6Title: 'Die geteilte Warteschlange',
|
|
helpSec6Body: 'Die Queue zeigt die kommenden Titel des Hosts — für alle sichtbar. Neu hinzugefügte Bulk-Inhalte werden immer angehängt, damit Gast-Vorschläge nicht verloren gehen. Auto-Shuffle mischt die Queue periodisch neu (konfigurierbar: 1 / 5 / 10 / 15 / 30 Min.). Wenn deine Wiedergabe vom Host abweicht, bringt dich der „Aufholen"-Button in der Session-Leiste zurück zur Live-Position des Hosts.',
|
|
helpSec7Title: 'Freigaben',
|
|
helpSec7Body: 'Standardmäßig müssen Vorschläge von Gästen manuell freigegeben werden — sie erscheinen in einer „Freigabe"-Leiste oben im Queue-Panel mit Annehmen/Ablehnen-Buttons. In den Session-Einstellungen lässt sich Auto-Übernehmen aktivieren, dann landen alle Vorschläge direkt in der Queue.',
|
|
helpSec8Title: 'Teilnehmer und Einstellungen',
|
|
helpSec8Body: 'Das Einstellungs-Icon in der Session-Leiste öffnet Shuffle-Takt, Auto-Übernehmen und die „Jetzt mischen"-Abkürzung. Klick auf die Teilnehmerzahl zeigt wer gerade dabei ist — Kick (kann über den Link wieder beitreten) oder Bann (für die Session gesperrt). Gäste sehen die Teilnehmerliste ebenfalls, aber nur lesend.',
|
|
helpSec9Title: 'Session beenden',
|
|
helpSec9Body: 'Host-X → Bestätigungsdialog → Session endet für alle und die Server-Playlists werden automatisch aufgeräumt. Gast-X → der Gast verlässt, die Session läuft weiter. Wenn der Host 5 Minuten lang nichts mehr sendet, verlässt der Gast die Session automatisch mit einer Meldung; kürzere Reconnects innerhalb dieser Zeit bleiben unsichtbar.',
|
|
participantsInviteLabel: 'Einladungslink',
|
|
participantsCountLabel: '{{count}} in Session',
|
|
participantsHost: 'Gastgeber',
|
|
participantsEmpty: 'Noch keine Gäste',
|
|
participantsKickTooltip: 'Aus Session entfernen',
|
|
participantsKickAria: '{{user}} entfernen',
|
|
participantsRemoveTooltip: 'Aus Session entfernen',
|
|
participantsRemoveAria: '{{user}} aus dieser Session entfernen',
|
|
participantsBanTooltip: 'Permanent bannen',
|
|
participantsBanAria: '{{user}} permanent bannen',
|
|
participantsMuteTooltip: 'Vorschläge sperren',
|
|
participantsUnmuteTooltip: 'Vorschläge erlauben',
|
|
participantsMuteAria: 'Vorschläge von {{user}} sperren',
|
|
participantsUnmuteAria: 'Vorschläge von {{user}} wieder erlauben',
|
|
confirmRemoveTitle: 'Aus Session entfernen?',
|
|
confirmRemoveBody: '{{user}} wird aus der Session geworfen, kann aber jederzeit über deinen Einladungslink wieder beitreten.',
|
|
confirmRemoveConfirm: 'Entfernen',
|
|
confirmBanTitle: 'Permanent bannen?',
|
|
confirmBanBody: '{{user}} wird entfernt und kann dieser Session nicht wieder beitreten. Für die Lebensdauer der Session nicht rückgängig zu machen.',
|
|
confirmBanConfirm: 'Bannen',
|
|
confirmCancel: 'Abbrechen',
|
|
confirmJoinTitle: 'Orbit-Session beitreten?',
|
|
confirmJoinBody: '{{host}} lädt dich zu „{{name}}" ein. Möchtest du der Session beitreten?',
|
|
confirmJoinConfirm: 'Beitreten',
|
|
confirmLeaveTitle: 'Session verlassen?',
|
|
confirmLeaveBody: '„{{name}}" wirklich verlassen? Du kannst jederzeit über {{host}}s Einladungslink wieder beitreten.',
|
|
confirmLeaveConfirm: 'Verlassen',
|
|
confirmEndTitle: 'Session für alle beenden?',
|
|
confirmEndBody: '„{{name}}" wird für alle Teilnehmer geschlossen. Die Session-Playlists werden automatisch aufgeräumt.',
|
|
confirmEndConfirm: 'Session beenden',
|
|
invalidLinkTitle: 'Einladungslink ist nicht mehr gültig',
|
|
invalidLinkBody: 'Diese Orbit-Session existiert nicht mehr oder wurde bereits beendet. Bitte den Gastgeber um einen neuen Einladungslink.',
|
|
settingsTitle: 'Session-Einstellungen',
|
|
settingAutoApprove: 'Vorschläge automatisch übernehmen',
|
|
settingAutoApproveHint: 'Neue Gäste-Vorschläge landen sofort in deiner Warteschlange. Aus: sie bleiben in der Session-Liste, du musst sie später manuell übernehmen.',
|
|
settingAutoShuffle: 'Automatisch mischen',
|
|
settingAutoShuffleHint: 'Periodischer Fisher-Yates-Shuffle der kommenden Warteschlange. Aus: Reihenfolge wird nur verändert, wenn du selbst sortierst.',
|
|
settingShuffleInterval: 'Alle',
|
|
settingShuffleIntervalHint: 'Wie oft die kommende Warteschlange während der Session neu gemischt wird.',
|
|
suggestBlockedMuted: 'Der Host hat dich für diese Session gesperrt — keine Vorschläge möglich.',
|
|
settingShuffleIntervalValue_one: '{{count}} Min.',
|
|
settingShuffleIntervalValue_other: '{{count}} Min.',
|
|
settingShuffleNow: 'Jetzt mischen',
|
|
toastSuggested: '{{user}} hat „{{title}}" vorgeschlagen',
|
|
toastSuggestedMany: '{{count}} neue Vorschläge in der Warteschlange',
|
|
toastShuffled: 'Warteschlange gemischt',
|
|
toastJoined: 'Session beigetreten',
|
|
toastLoginFirst: 'Erst anmelden, um einer Session beizutreten',
|
|
toastSwitchServer: 'Wechsle erst zu {{url}} und füge den Link dann erneut ein',
|
|
toastNoAccountForServer: 'Du hast keinen Zugang zu {{url}}. Bitte den Host um einen Einladungslink.',
|
|
toastSwitchFailed: 'Wechsel zu {{url}} fehlgeschlagen',
|
|
accountPickerTitle: 'Welcher Account?',
|
|
accountPickerSub: 'Du hast mehrere Accounts für {{url}}. Wähle aus, mit welchem du der Session beitreten willst.',
|
|
toastJoinFail: 'Session konnte nicht beigetreten werden',
|
|
joinErrNotFound: 'Session nicht gefunden',
|
|
joinErrEnded: 'Session wurde beendet',
|
|
joinErrFull: 'Session ist voll',
|
|
joinErrKicked: 'Du kannst dieser Session nicht mehr beitreten',
|
|
joinErrNoUser: 'Kein aktiver Server',
|
|
joinErrServerError: 'Beitritt fehlgeschlagen',
|
|
ctxAddToSession: 'Zur Orbit-Session hinzufügen',
|
|
ctxSuggestedToast: 'An Session vorgeschlagen',
|
|
ctxSuggestFailed: 'Vorschlag fehlgeschlagen — nicht beigetreten',
|
|
ctxAddToSessionHost: 'Zur Orbit-Session hinzufügen',
|
|
ctxAddedHostToast: 'Zur Session hinzugefügt',
|
|
ctxAddHostFailed: 'Hinzufügen fehlgeschlagen',
|
|
bulkConfirmTitle: 'Wirklich alles in die Orbit-Queue?',
|
|
bulkConfirmBody: 'Das würde {{count}} Titel auf einmal in die geteilte Queue werfen. Für deine Gäste ist das eine Menge. Trotzdem hinzufügen?',
|
|
bulkConfirmYes: 'Alle hinzufügen',
|
|
bulkConfirmNo: 'Abbrechen',
|
|
guestLive: 'Live',
|
|
guestPlaying: 'Läuft gerade',
|
|
guestPaused: 'Pausiert',
|
|
guestLoading: 'Lade…',
|
|
guestSuggestions: 'Vorschläge',
|
|
guestUpNext: 'Als Nächstes',
|
|
guestUpNextEmpty: 'Nichts in der Warteschlange. Öffne bei einem Song das Kontextmenü und wähle „Zur Orbit-Session hinzufügen", um etwas vorzuschlagen.',
|
|
guestPendingTitle: 'Wartet auf Host',
|
|
guestPendingHint: 'Vorgeschlagen — taucht in der Warteschlange auf, sobald der Host sie übernimmt.',
|
|
approvalTitle: 'Zur Freigabe',
|
|
approvalFrom: 'Vorgeschlagen von {{user}}',
|
|
approvalAccept: 'Übernehmen',
|
|
approvalDecline: 'Ablehnen',
|
|
guestUpNextMore: '+ {{count}} weitere in der Host-Warteschlange',
|
|
guestSubmitter: 'von {{user}}',
|
|
queueAddedByHost: 'Vom Host hinzugefügt',
|
|
queueAddedByYou: 'Von dir hinzugefügt',
|
|
queueAddedByUser: 'Hinzugefügt von {{user}}',
|
|
guestEmpty: 'Noch keine Vorschläge. Öffne bei einem Song das Kontextmenü und wähle „Zur Orbit-Session hinzufügen".',
|
|
guestFooter: 'Die Wiedergabe wird vom Gastgeber gesteuert — du kannst die Liste nicht ändern.',
|
|
exitKickedTitle: 'Du wurdest aus der Session gebannt',
|
|
exitRemovedTitle: 'Du wurdest aus der Session entfernt',
|
|
exitEndedTitle: 'Der Gastgeber hat die Session beendet',
|
|
exitHostTimeoutTitle: 'Host nicht mehr erreichbar',
|
|
exitHostTimeoutBody: '{{host}} hat sich länger nicht mehr gemeldet — „{{name}}" wurde auf deiner Seite beendet. Über den Einladungslink kannst du jederzeit wieder beitreten.',
|
|
exitKickedBody: '{{host}} hat dich aus „{{name}}" gebannt. Beitritt nicht mehr möglich.',
|
|
exitRemovedBody: '{{host}} hat dich aus „{{name}}" entfernt. Du kannst jederzeit über den Einladungslink wieder beitreten.',
|
|
exitEndedBody: '„{{name}}" ist zu Ende. Hoffentlich war\'s schön.',
|
|
exitOk: 'OK',
|
|
};
|