mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-21 22:15:40 +00:00
i18n(orbit): translations for fr / nl / zh / nb / ru / es
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -178,6 +178,7 @@ export const esTranslation = {
|
||||
},
|
||||
albumDetail: {
|
||||
back: 'Volver',
|
||||
orbitDoubleClickHint: 'Doble clic para añadir esta canción a la cola Orbit',
|
||||
playAll: 'Reproducir Todo',
|
||||
shareAlbum: 'Compartir álbum',
|
||||
enqueue: 'Agregar a la Cola',
|
||||
@@ -1433,4 +1434,175 @@ export const esTranslation = {
|
||||
liveSearch: 'Live',
|
||||
randomAlbumsLabel: 'Álbumes aleatorios',
|
||||
},
|
||||
orbit: {
|
||||
triggerLabel: 'Psy Orbit',
|
||||
triggerTooltip: 'Iniciar o unirse a una sesión de escucha compartida',
|
||||
launchCreate: 'Crear una sesión',
|
||||
launchJoin: 'Unirse a una sesión',
|
||||
launchHelp: '¿Cómo funciona esto?',
|
||||
launchHelpSoon: 'Próximamente',
|
||||
joinModalTitle: 'Unirse a una sesión Orbit',
|
||||
joinModalSub: 'Pega el enlace de invitación que te envió tu anfitrión.',
|
||||
joinModalLinkLabel: 'Enlace de invitación',
|
||||
joinModalLinkPlaceholder: 'psysonic2://orbit/…',
|
||||
joinModalLinkHelper: 'Funciona con cualquier enlace Orbit válido. Debe apuntar al servidor al que estás conectado actualmente.',
|
||||
joinModalPasteTooltip: 'Pegar desde el portapapeles',
|
||||
joinModalSubmit: 'Unirse',
|
||||
joinModalBusy: 'Uniéndose…',
|
||||
joinErrEmpty: 'Pega un enlace de invitación.',
|
||||
joinErrInvalid: 'Eso no parece un enlace de invitación Orbit.',
|
||||
closeAria: 'Cerrar',
|
||||
heroTitlePrefix: 'Escucha junto con',
|
||||
heroTitleBrand: 'Psy Orbit',
|
||||
heroSub: 'Inicia una sesión — otros usuarios en {{server}} escucharán contigo y podrán sugerir canciones.',
|
||||
fallbackServer: 'este servidor',
|
||||
tipLan: 'Actualmente estás conectado mediante una dirección de red local. Los invitados fuera de tu red no pueden unirse — cambia a una dirección de servidor pública en los ajustes antes de empezar.',
|
||||
tipRemote: 'Para que los invitados fuera de tu red doméstica puedan unirse, la dirección de tu servidor debe ser accesible públicamente. Si tu servidor es solo interno, cambia antes de empezar.',
|
||||
labelName: 'Nombre de la sesión',
|
||||
namePlaceholder: 'Velvet Orbit',
|
||||
reshuffleTooltip: 'Nueva sugerencia',
|
||||
reshuffleAria: 'Sugerir un nuevo nombre',
|
||||
helperName: 'Cómo aparecerá la sesión a tus invitados — déjalo o escribe el tuyo.',
|
||||
labelMax: 'Invitados máx.',
|
||||
helperMax: 'Tú no cuentas — esto solo limita a los invitados entrantes.',
|
||||
labelLink: 'Enlace de invitación',
|
||||
tooltipCopied: 'Copiado',
|
||||
tooltipCopy: 'Copiar',
|
||||
ariaCopyLink: 'Copiar enlace de invitación',
|
||||
helperLink: 'Envía este enlace a tus invitados. Pueden pegarlo en cualquier parte de Psysonic con Ctrl+V.',
|
||||
labelClearQueue: 'Vaciar mi cola primero',
|
||||
helperClearQueue: 'Empieza la sesión con una cola vacía. Desactivado: las canciones ya en cola se mantienen y se comparten con los invitados.',
|
||||
btnCancel: 'Cancelar',
|
||||
btnStarting: 'Iniciando…',
|
||||
btnStart: 'Iniciar Orbit',
|
||||
btnCopyAndStart: 'Copiar enlace e iniciar',
|
||||
errNameRequired: 'Por favor, dale un nombre a tu sesión.',
|
||||
errStartFailed: 'No se pudo iniciar.',
|
||||
hostLabel: 'Anfitrión: {{name}}',
|
||||
participantsTooltip: 'Participantes',
|
||||
settingsTooltip: 'Ajustes de sesión',
|
||||
shareTooltip: 'Compartir enlace de invitación',
|
||||
shuffleLabel: 'Próximo mezclado en',
|
||||
catchUpLabel: 'alcanzar',
|
||||
catchUpTooltip: 'Saltar a la posición actual del anfitrión',
|
||||
hostAway: 'Anfitrión desconectado',
|
||||
hostOnline: 'Anfitrión en línea',
|
||||
endTooltip: 'Terminar sesión',
|
||||
leaveTooltip: 'Salir de la sesión',
|
||||
helpTooltip: 'Cómo funciona Orbit',
|
||||
helpTitle: 'Cómo funciona Orbit',
|
||||
helpIntro: 'Orbit convierte Psysonic en una sala de escucha compartida. Un anfitrión elige la música; los invitados escuchan en sincronía y pueden sugerir canciones.',
|
||||
helpHostOnly: '(anfitrión)',
|
||||
helpSec1Title: '¿Qué es Orbit?',
|
||||
helpSec1Body: 'Un modo de "escuchar juntos" — el anfitrión maneja la reproducción, los invitados se conectan. Todo pasa por playlists en tu propio servidor Navidrome; sin infraestructura externa.',
|
||||
helpSec2Title: 'Anfitrión e invitados',
|
||||
helpSec2Body: 'El anfitrión controla la reproducción (play / pause / skip / seek) y decide cuándo termina la sesión. Los invitados siguen la reproducción, pueden sugerir canciones y salir o volver a unirse en cualquier momento. Solo el anfitrión puede expulsar o banear permanentemente a un participante.',
|
||||
helpSec2WarnHead: 'Importante: cuentas separadas.',
|
||||
helpSec2WarnBody: 'Cada participante necesita su propia cuenta Navidrome. Si anfitrión e invitado inician sesión con el mismo usuario, sus envíos chocan y el anfitrión nunca ve las sugerencias del invitado.',
|
||||
helpSec3Title: 'Iniciar e invitar',
|
||||
helpSec3Body: 'Haz clic en el botón "Psy Orbit" → Crear una sesión → el modal muestra un enlace de invitación listo para copiar y te permite opcionalmente vaciar tu cola actual. Comparte el enlace como prefieras. Mientras una sesión está activa, el botón de compartir en la barra superior copia el enlace en cualquier momento.',
|
||||
helpSec4Title: 'Unirse',
|
||||
helpSec4Body: 'Pega el enlace de invitación en cualquier parte de Psysonic con Ctrl+V / Cmd+V — el aviso para unirse aparece automáticamente. Alternativa: "Psy Orbit" → Unirse a una sesión → pega en el campo. Si el enlace apunta a un servidor donde tienes una cuenta, Psysonic cambia automáticamente. Si tienes más de una cuenta en ese servidor, un pequeño selector pregunta cuál usar.',
|
||||
helpSec5Title: 'Sugerir canciones',
|
||||
helpSec5Body: 'En cualquier lista: doble clic en una fila, o clic derecho → "Añadir a la sesión Orbit". Un clic simple muestra una pista en lugar de tirar todo el álbum a la cola compartida — es intencional. Las acciones masivas explícitas como "Reproducir todo" o "Reproducir álbum" piden confirmación primero y luego añaden (nunca reemplazan).',
|
||||
helpSec6Title: 'La cola compartida',
|
||||
helpSec6Body: 'La cola muestra las próximas canciones del anfitrión — visible para todos. Las adiciones masivas siempre se añaden al final, para que las sugerencias de los invitados no se pierdan. El mezclado automático reordena la cola periódicamente (configurable: 1 / 5 / 10 / 15 / 30 min). Si tu reproducción se desvía del anfitrión, el botón "Alcanzar" en la barra te devuelve a la posición en vivo del anfitrión.',
|
||||
helpSec7Title: 'Aprobaciones',
|
||||
helpSec7Body: 'Por defecto, las sugerencias de los invitados necesitan aprobación manual — aparecen en una barra de "Aprobaciones" en la parte superior del panel con botones aceptar / rechazar. La aprobación automática puede activarse en los ajustes de sesión para que todo entre directamente.',
|
||||
helpSec8Title: 'Participantes y ajustes',
|
||||
helpSec8Body: 'Abre el icono de ajustes en la barra de sesión para la frecuencia de mezclado, la aprobación automática y el atajo "Mezclar ahora". Haz clic en el número de participantes para ver quién está conectado — expulsar (puede volver a unirse por el enlace) o banear (bloqueado para la sesión). Los invitados también ven la lista de participantes, pero solo de lectura.',
|
||||
helpSec9Title: 'Terminar la sesión',
|
||||
helpSec9Body: 'X del anfitrión → diálogo de confirmación → la sesión se cierra para todos y las playlists del servidor se limpian automáticamente. X del invitado → el invitado sale, la sesión sigue. Si el anfitrión queda en silencio 5 minutos, el invitado sale automáticamente con un aviso; las reconexiones cortas en esa ventana son invisibles.',
|
||||
participantsInviteLabel: 'Enlace de invitación',
|
||||
participantsCountLabel: '{{count}} en sesión',
|
||||
participantsHost: 'anfitrión',
|
||||
participantsEmpty: 'Aún no hay invitados',
|
||||
participantsKickTooltip: 'Quitar de la sesión',
|
||||
participantsKickAria: 'Quitar a {{user}}',
|
||||
participantsRemoveTooltip: 'Quitar de la sesión',
|
||||
participantsRemoveAria: 'Quitar a {{user}} de esta sesión',
|
||||
participantsBanTooltip: 'Banear permanentemente',
|
||||
participantsBanAria: 'Banear permanentemente a {{user}}',
|
||||
confirmRemoveTitle: '¿Quitar de la sesión?',
|
||||
confirmRemoveBody: '{{user}} será expulsado de la sesión, pero puede volver a unirse por tu enlace de invitación.',
|
||||
confirmRemoveConfirm: 'Quitar',
|
||||
confirmBanTitle: '¿Banear permanentemente?',
|
||||
confirmBanBody: '{{user}} será expulsado y bloqueado para volver a unirse a esta sesión. No se puede deshacer durante la sesión.',
|
||||
confirmBanConfirm: 'Banear',
|
||||
confirmCancel: 'Cancelar',
|
||||
confirmJoinTitle: '¿Unirse a la sesión Orbit?',
|
||||
confirmJoinBody: '{{host}} te ha invitado a "{{name}}". ¿Unirse a la sesión?',
|
||||
confirmJoinConfirm: 'Unirse',
|
||||
confirmLeaveTitle: '¿Salir de la sesión?',
|
||||
confirmLeaveBody: '¿Salir de "{{name}}"? Puedes volver a unirte en cualquier momento por el enlace de invitación de {{host}}.',
|
||||
confirmLeaveConfirm: 'Salir',
|
||||
confirmEndTitle: '¿Terminar la sesión para todos?',
|
||||
confirmEndBody: '"{{name}}" se cerrará para todos los participantes. Las playlists de la sesión se limpian automáticamente.',
|
||||
confirmEndConfirm: 'Terminar sesión',
|
||||
invalidLinkTitle: 'El enlace de invitación ya no es válido',
|
||||
invalidLinkBody: 'Esta sesión Orbit ya no existe o ya ha terminado. Pide al anfitrión un nuevo enlace de invitación.',
|
||||
settingsTitle: 'Ajustes de sesión',
|
||||
settingAutoApprove: 'Aprobar sugerencias automáticamente',
|
||||
settingAutoApproveHint: 'Las sugerencias de los invitados entran instantáneamente en tu cola. Desactivado: se quedan en la lista de sesión para revisión posterior.',
|
||||
settingAutoShuffle: 'Mezclado automático',
|
||||
settingAutoShuffleHint: 'Mezclado Fisher-Yates periódico de la cola próxima. Desactivado: el orden solo cambia cuando lo reorganizas.',
|
||||
settingShuffleInterval: 'Remezclar cada',
|
||||
settingShuffleIntervalHint: 'Con qué frecuencia se remezcla la cola próxima durante la sesión.',
|
||||
settingShuffleIntervalValue_one: '{{count}} min',
|
||||
settingShuffleIntervalValue_other: '{{count}} min',
|
||||
settingShuffleNow: 'Mezclar ahora',
|
||||
toastSuggested: '{{user}} sugirió "{{title}}"',
|
||||
toastSuggestedMany: '{{count}} nuevas sugerencias en la cola',
|
||||
toastShuffled: 'Cola mezclada',
|
||||
toastJoined: 'Te has unido a la sesión',
|
||||
toastLoginFirst: 'Inicia sesión antes de unirte a una sesión',
|
||||
toastSwitchServer: 'Cambia primero a {{url}}, luego pega de nuevo',
|
||||
toastNoAccountForServer: 'No tienes acceso a {{url}}. Pide al anfitrión una invitación.',
|
||||
toastSwitchFailed: 'No se pudo cambiar a {{url}}',
|
||||
accountPickerTitle: '¿Qué cuenta?',
|
||||
accountPickerSub: 'Tienes más de una cuenta para {{url}}. Elige con cuál unirte a la sesión.',
|
||||
toastJoinFail: 'No se pudo unir a la sesión',
|
||||
joinErrNotFound: 'Sesión no encontrada',
|
||||
joinErrEnded: 'La sesión ha terminado',
|
||||
joinErrFull: 'La sesión está llena',
|
||||
joinErrKicked: 'No puedes volver a unirte a esta sesión',
|
||||
joinErrNoUser: 'Sin servidor activo',
|
||||
joinErrServerError: 'No se pudo unir',
|
||||
ctxAddToSession: 'Añadir a la sesión Orbit',
|
||||
ctxSuggestedToast: 'Sugerido a la sesión',
|
||||
ctxSuggestFailed: 'No se pudo sugerir — no unido',
|
||||
ctxAddToSessionHost: 'Añadir a la sesión Orbit',
|
||||
ctxAddedHostToast: 'Añadido a la sesión',
|
||||
ctxAddHostFailed: 'No se pudo añadir a la sesión',
|
||||
bulkConfirmTitle: '¿Añadir todo esto a la cola Orbit?',
|
||||
bulkConfirmBody: 'Esto lanzaría {{count}} canciones a la cola compartida de una vez. Es mucho para tus invitados. ¿Continuar?',
|
||||
bulkConfirmYes: 'Añadir todas',
|
||||
bulkConfirmNo: 'Cancelar',
|
||||
guestLive: 'En vivo',
|
||||
guestPlaying: 'Reproduciendo ahora',
|
||||
guestPaused: 'En pausa',
|
||||
guestLoading: 'Cargando…',
|
||||
guestSuggestions: 'Sugerencias',
|
||||
guestUpNext: 'A continuación',
|
||||
guestUpNextEmpty: 'Nada en cola. Abre el menú contextual de una canción y elige "Añadir a la sesión Orbit" para sugerir una.',
|
||||
guestPendingTitle: 'Esperando al anfitrión',
|
||||
guestPendingHint: 'Sugerido — aparecerá en la cola cuando el anfitrión lo acepte.',
|
||||
approvalTitle: 'Pendiente de aprobación',
|
||||
approvalFrom: 'Sugerido por {{user}}',
|
||||
approvalAccept: 'Aceptar',
|
||||
approvalDecline: 'Rechazar',
|
||||
guestUpNextMore: '+ {{count}} más en la cola del anfitrión',
|
||||
guestSubmitter: 'de {{user}}',
|
||||
guestEmpty: 'Aún no hay sugerencias. Abre el menú contextual de una canción y elige "Añadir a la sesión Orbit".',
|
||||
guestFooter: 'El anfitrión controla la reproducción — no puedes cambiar la lista.',
|
||||
exitKickedTitle: 'Has sido baneado de la sesión',
|
||||
exitRemovedTitle: 'Has sido quitado de la sesión',
|
||||
exitEndedTitle: 'El anfitrión ha terminado la sesión',
|
||||
exitHostTimeoutTitle: 'Anfitrión en silencio',
|
||||
exitHostTimeoutBody: '{{host}} no ha enviado una actualización durante un rato, así que "{{name}}" se cerró en tu lado. Puedes volver a unirte en cualquier momento con el enlace de invitación.',
|
||||
exitKickedBody: '{{host}} te ha baneado de "{{name}}". No puedes volver a unirte.',
|
||||
exitRemovedBody: '{{host}} te ha quitado de "{{name}}". Puedes volver a unirte en cualquier momento por el enlace.',
|
||||
exitEndedBody: '"{{name}}" ha terminado. Espero que te hayas divertido.',
|
||||
exitOk: 'OK',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -177,6 +177,7 @@ export const frTranslation = {
|
||||
},
|
||||
albumDetail: {
|
||||
back: 'Retour',
|
||||
orbitDoubleClickHint: 'Double-clic pour ajouter ce morceau à la file Orbit',
|
||||
playAll: 'Tout lire',
|
||||
shareAlbum: 'Partager l\'album',
|
||||
enqueue: 'Mettre en file',
|
||||
@@ -1428,4 +1429,175 @@ export const frTranslation = {
|
||||
liveSearch: 'Live',
|
||||
randomAlbumsLabel: 'Albums aléatoires',
|
||||
},
|
||||
orbit: {
|
||||
triggerLabel: 'Psy Orbit',
|
||||
triggerTooltip: 'Démarrer ou rejoindre une session d\'écoute partagée',
|
||||
launchCreate: 'Créer une session',
|
||||
launchJoin: 'Rejoindre une session',
|
||||
launchHelp: 'Comment ça marche ?',
|
||||
launchHelpSoon: 'Bientôt disponible',
|
||||
joinModalTitle: 'Rejoindre une session Orbit',
|
||||
joinModalSub: 'Colle le lien d\'invitation que ton hôte t\'a envoyé.',
|
||||
joinModalLinkLabel: 'Lien d\'invitation',
|
||||
joinModalLinkPlaceholder: 'psysonic2://orbit/…',
|
||||
joinModalLinkHelper: 'Fonctionne avec tout lien Orbit valide. Doit pointer vers le serveur auquel tu es actuellement connecté.',
|
||||
joinModalPasteTooltip: 'Coller depuis le presse-papiers',
|
||||
joinModalSubmit: 'Rejoindre',
|
||||
joinModalBusy: 'Connexion…',
|
||||
joinErrEmpty: 'Veuillez coller un lien d\'invitation.',
|
||||
joinErrInvalid: 'Cela ne ressemble pas à un lien d\'invitation Orbit.',
|
||||
closeAria: 'Fermer',
|
||||
heroTitlePrefix: 'Écoute ensemble avec',
|
||||
heroTitleBrand: 'Psy Orbit',
|
||||
heroSub: 'Démarre une session — les autres utilisateurs de {{server}} écouteront en même temps et pourront suggérer des morceaux.',
|
||||
fallbackServer: 'ce serveur',
|
||||
tipLan: 'Tu es actuellement connecté via une adresse de réseau local. Les invités hors de ton réseau ne peuvent pas rejoindre — bascule vers une adresse publique dans les paramètres avant de démarrer.',
|
||||
tipRemote: 'Pour que des invités hors de ton réseau domestique puissent rejoindre, l\'adresse de ton serveur doit être publiquement accessible. Si ton serveur est interne, bascule avant de démarrer.',
|
||||
labelName: 'Nom de la session',
|
||||
namePlaceholder: 'Velvet Orbit',
|
||||
reshuffleTooltip: 'Nouvelle suggestion',
|
||||
reshuffleAria: 'Suggérer un nouveau nom',
|
||||
helperName: 'Comment la session apparaîtra à tes invités — garde-le ou saisis le tien.',
|
||||
labelMax: 'Invités max.',
|
||||
helperMax: 'Tu ne comptes pas — ceci limite uniquement les invités entrants.',
|
||||
labelLink: 'Lien d\'invitation',
|
||||
tooltipCopied: 'Copié',
|
||||
tooltipCopy: 'Copier',
|
||||
ariaCopyLink: 'Copier le lien d\'invitation',
|
||||
helperLink: 'Envoie ce lien à tes invités. Ils peuvent le coller n\'importe où dans Psysonic avec Ctrl+V.',
|
||||
labelClearQueue: 'Vider ma file d\'attente d\'abord',
|
||||
helperClearQueue: 'Démarre la session avec une file d\'attente vide. Désactivé : les titres déjà en file restent et sont partagés avec les invités.',
|
||||
btnCancel: 'Annuler',
|
||||
btnStarting: 'Démarrage…',
|
||||
btnStart: 'Démarrer Orbit',
|
||||
btnCopyAndStart: 'Copier le lien & démarrer',
|
||||
errNameRequired: 'Veuillez donner un nom à ta session.',
|
||||
errStartFailed: 'Impossible de démarrer.',
|
||||
hostLabel: 'Hôte : {{name}}',
|
||||
participantsTooltip: 'Participants',
|
||||
settingsTooltip: 'Paramètres de session',
|
||||
shareTooltip: 'Partager le lien d\'invitation',
|
||||
shuffleLabel: 'Prochain mélange dans',
|
||||
catchUpLabel: 'rattraper',
|
||||
catchUpTooltip: 'Sauter à la position actuelle de l\'hôte',
|
||||
hostAway: 'Hôte hors ligne',
|
||||
hostOnline: 'Hôte en ligne',
|
||||
endTooltip: 'Terminer la session',
|
||||
leaveTooltip: 'Quitter la session',
|
||||
helpTooltip: 'Fonctionnement d\'Orbit',
|
||||
helpTitle: 'Fonctionnement d\'Orbit',
|
||||
helpIntro: 'Orbit transforme Psysonic en salle d\'écoute partagée. Un hôte choisit la musique ; les invités écoutent en synchro et peuvent suggérer des morceaux.',
|
||||
helpHostOnly: '(hôte)',
|
||||
helpSec1Title: 'Qu\'est-ce qu\'Orbit ?',
|
||||
helpSec1Body: 'Un mode « écouter ensemble » — l\'hôte dirige la lecture, les invités écoutent. Tout passe par des playlists sur ton propre serveur Navidrome ; aucune infrastructure externe.',
|
||||
helpSec2Title: 'Hôte et invités',
|
||||
helpSec2Body: 'L\'hôte contrôle la lecture (play / pause / skip / seek) et décide quand la session se termine. Les invités suivent la lecture, peuvent suggérer des morceaux et quitter ou rejoindre à tout moment. Seul l\'hôte peut exclure ou bannir un participant.',
|
||||
helpSec2WarnHead: 'Important : comptes séparés.',
|
||||
helpSec2WarnBody: 'Chaque participant a besoin de son propre compte Navidrome. Si l\'hôte et l\'invité utilisent le même utilisateur, leurs soumissions entrent en conflit et l\'hôte ne voit jamais les suggestions de l\'invité.',
|
||||
helpSec3Title: 'Démarrer et inviter',
|
||||
helpSec3Body: 'Clique sur le bouton « Psy Orbit » → Créer une session → le modal affiche un lien d\'invitation prêt à copier et permet optionnellement de vider ta file actuelle. Partage le lien comme tu veux. Pendant qu\'une session est active, le bouton de partage dans la barre en haut copie le lien à tout moment.',
|
||||
helpSec4Title: 'Rejoindre',
|
||||
helpSec4Body: 'Colle le lien d\'invitation n\'importe où dans Psysonic avec Ctrl+V / Cmd+V — l\'invite apparaît automatiquement. Alternative : « Psy Orbit » → Rejoindre une session → colle dans le champ. Si le lien pointe vers un serveur où tu as un compte, Psysonic bascule automatiquement. Si tu as plusieurs comptes sur ce serveur, un sélecteur demande lequel utiliser.',
|
||||
helpSec5Title: 'Suggérer des morceaux',
|
||||
helpSec5Body: 'Dans n\'importe quelle liste : double-clic sur une ligne, ou clic droit → « Ajouter à la session Orbit ». Un simple clic affiche un indice au lieu de jeter tout l\'album dans la file partagée — c\'est intentionnel. Les actions groupées explicites comme « Tout lire » ou « Lire l\'album » demandent d\'abord confirmation puis ajoutent (ne remplacent jamais).',
|
||||
helpSec6Title: 'La file d\'attente partagée',
|
||||
helpSec6Body: 'La file affiche les morceaux à venir de l\'hôte — visible par tous. Les ajouts groupés sont toujours ajoutés à la fin, pour ne pas perdre les suggestions des invités. Le mélange automatique réorganise la file périodiquement (configurable : 1 / 5 / 10 / 15 / 30 min). Si ta lecture dévie, le bouton « Rattraper » dans la barre te ramène à la position en direct de l\'hôte.',
|
||||
helpSec7Title: 'Approbations',
|
||||
helpSec7Body: 'Par défaut, les suggestions des invités nécessitent une approbation manuelle — elles apparaissent dans une bande « Approbations » en haut du panneau avec des boutons accepter / refuser. L\'approbation automatique peut être activée dans les paramètres.',
|
||||
helpSec8Title: 'Participants et paramètres',
|
||||
helpSec8Body: 'Ouvre l\'icône des paramètres dans la barre pour la cadence de mélange, l\'approbation automatique et le raccourci « Mélanger maintenant ». Clique sur le nombre de participants pour voir qui est connecté — exclure (peut rejoindre via le lien) ou bannir (exclu pour la session). Les invités voient la liste en lecture seule.',
|
||||
helpSec9Title: 'Terminer la session',
|
||||
helpSec9Body: 'X de l\'hôte → dialogue de confirmation → la session se ferme pour tout le monde, les playlists serveur sont nettoyées automatiquement. X de l\'invité → l\'invité part, la session continue. Si l\'hôte reste silencieux 5 minutes, l\'invité part automatiquement avec un avis ; les reconnexions courtes dans ce laps sont invisibles.',
|
||||
participantsInviteLabel: 'Lien d\'invitation',
|
||||
participantsCountLabel: '{{count}} en session',
|
||||
participantsHost: 'hôte',
|
||||
participantsEmpty: 'Pas encore d\'invités',
|
||||
participantsKickTooltip: 'Retirer de la session',
|
||||
participantsKickAria: 'Retirer {{user}}',
|
||||
participantsRemoveTooltip: 'Retirer de la session',
|
||||
participantsRemoveAria: 'Retirer {{user}} de cette session',
|
||||
participantsBanTooltip: 'Bannir définitivement',
|
||||
participantsBanAria: 'Bannir définitivement {{user}}',
|
||||
confirmRemoveTitle: 'Retirer de la session ?',
|
||||
confirmRemoveBody: '{{user}} sera retiré de la session mais peut rejoindre via ton lien d\'invitation.',
|
||||
confirmRemoveConfirm: 'Retirer',
|
||||
confirmBanTitle: 'Bannir définitivement ?',
|
||||
confirmBanBody: '{{user}} sera retiré et empêché de rejoindre cette session. Irréversible pour la durée de la session.',
|
||||
confirmBanConfirm: 'Bannir',
|
||||
confirmCancel: 'Annuler',
|
||||
confirmJoinTitle: 'Rejoindre la session Orbit ?',
|
||||
confirmJoinBody: '{{host}} t\'a invité à « {{name}} ». Rejoindre la session ?',
|
||||
confirmJoinConfirm: 'Rejoindre',
|
||||
confirmLeaveTitle: 'Quitter la session ?',
|
||||
confirmLeaveBody: 'Quitter « {{name}} » ? Tu peux rejoindre à tout moment via le lien d\'invitation de {{host}}.',
|
||||
confirmLeaveConfirm: 'Quitter',
|
||||
confirmEndTitle: 'Terminer la session pour tout le monde ?',
|
||||
confirmEndBody: '« {{name}} » se fermera pour tous les participants. Les playlists de session sont nettoyées automatiquement.',
|
||||
confirmEndConfirm: 'Terminer la session',
|
||||
invalidLinkTitle: 'Le lien d\'invitation n\'est plus valide',
|
||||
invalidLinkBody: 'Cette session Orbit n\'existe plus ou est déjà terminée. Demande à l\'hôte un nouveau lien.',
|
||||
settingsTitle: 'Paramètres de session',
|
||||
settingAutoApprove: 'Approuver automatiquement les suggestions',
|
||||
settingAutoApproveHint: 'Les suggestions arrivent instantanément dans ta file. Désactivé : elles restent dans la liste de session pour révision.',
|
||||
settingAutoShuffle: 'Mélange automatique',
|
||||
settingAutoShuffleHint: 'Mélange Fisher-Yates périodique de la file à venir. Désactivé : l\'ordre ne change que lorsque tu le réorganises.',
|
||||
settingShuffleInterval: 'Remélanger toutes les',
|
||||
settingShuffleIntervalHint: 'Fréquence de remélange de la file pendant la session.',
|
||||
settingShuffleIntervalValue_one: '{{count}} min',
|
||||
settingShuffleIntervalValue_other: '{{count}} min',
|
||||
settingShuffleNow: 'Mélanger maintenant',
|
||||
toastSuggested: '{{user}} a suggéré « {{title}} »',
|
||||
toastSuggestedMany: '{{count}} nouvelles suggestions dans la file',
|
||||
toastShuffled: 'File mélangée',
|
||||
toastJoined: 'Session rejointe',
|
||||
toastLoginFirst: 'Connecte-toi avant de rejoindre une session',
|
||||
toastSwitchServer: 'Bascule d\'abord vers {{url}}, puis colle à nouveau',
|
||||
toastNoAccountForServer: 'Tu n\'as pas accès à {{url}}. Demande à l\'hôte une invitation.',
|
||||
toastSwitchFailed: 'Impossible de basculer vers {{url}}',
|
||||
accountPickerTitle: 'Quel compte ?',
|
||||
accountPickerSub: 'Tu as plusieurs comptes pour {{url}}. Choisis celui avec lequel rejoindre la session.',
|
||||
toastJoinFail: 'Impossible de rejoindre la session',
|
||||
joinErrNotFound: 'Session introuvable',
|
||||
joinErrEnded: 'La session est terminée',
|
||||
joinErrFull: 'La session est pleine',
|
||||
joinErrKicked: 'Tu ne peux pas rejoindre cette session',
|
||||
joinErrNoUser: 'Aucun serveur actif',
|
||||
joinErrServerError: 'Impossible de rejoindre',
|
||||
ctxAddToSession: 'Ajouter à la session Orbit',
|
||||
ctxSuggestedToast: 'Suggéré à la session',
|
||||
ctxSuggestFailed: 'Impossible de suggérer — pas rejoint',
|
||||
ctxAddToSessionHost: 'Ajouter à la session Orbit',
|
||||
ctxAddedHostToast: 'Ajouté à la session',
|
||||
ctxAddHostFailed: 'Impossible d\'ajouter à la session',
|
||||
bulkConfirmTitle: 'Tout ajouter à la file Orbit ?',
|
||||
bulkConfirmBody: 'Cela ajouterait {{count}} morceaux en une fois. C\'est beaucoup pour tes invités. Continuer ?',
|
||||
bulkConfirmYes: 'Tout ajouter',
|
||||
bulkConfirmNo: 'Annuler',
|
||||
guestLive: 'Direct',
|
||||
guestPlaying: 'En cours de lecture',
|
||||
guestPaused: 'En pause',
|
||||
guestLoading: 'Chargement…',
|
||||
guestSuggestions: 'Suggestions',
|
||||
guestUpNext: 'À suivre',
|
||||
guestUpNextEmpty: 'Rien en file. Ouvre le menu contextuel d\'un morceau et choisis « Ajouter à la session Orbit ».',
|
||||
guestPendingTitle: 'En attente de l\'hôte',
|
||||
guestPendingHint: 'Suggéré — apparaîtra dans la file quand l\'hôte l\'acceptera.',
|
||||
approvalTitle: 'Approbations en attente',
|
||||
approvalFrom: 'Suggéré par {{user}}',
|
||||
approvalAccept: 'Accepter',
|
||||
approvalDecline: 'Refuser',
|
||||
guestUpNextMore: '+ {{count}} autres dans la file de l\'hôte',
|
||||
guestSubmitter: 'par {{user}}',
|
||||
guestEmpty: 'Aucune suggestion. Ouvre le menu contextuel d\'un morceau et choisis « Ajouter à la session Orbit ».',
|
||||
guestFooter: 'L\'hôte contrôle la lecture — tu ne peux pas modifier la liste.',
|
||||
exitKickedTitle: 'Tu as été banni de la session',
|
||||
exitRemovedTitle: 'Tu as été retiré de la session',
|
||||
exitEndedTitle: 'L\'hôte a terminé la session',
|
||||
exitHostTimeoutTitle: 'L\'hôte ne répond plus',
|
||||
exitHostTimeoutBody: '{{host}} n\'a pas envoyé de mise à jour depuis un moment, donc « {{name}} » a été fermée de ton côté. Tu peux rejoindre à tout moment avec le lien.',
|
||||
exitKickedBody: '{{host}} t\'a banni de « {{name}} ». Tu ne peux pas rejoindre.',
|
||||
exitRemovedBody: '{{host}} t\'a retiré de « {{name}} ». Tu peux rejoindre via le lien à tout moment.',
|
||||
exitEndedBody: '« {{name}} » est terminée. J\'espère que tu t\'es bien amusé.',
|
||||
exitOk: 'OK',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -177,6 +177,7 @@ export const nbTranslation = {
|
||||
},
|
||||
albumDetail: {
|
||||
back: 'Tilbake',
|
||||
orbitDoubleClickHint: 'Dobbeltklikk for å legge dette sporet til Orbit-køen',
|
||||
playAll: 'Spill alt',
|
||||
shareAlbum: 'Del album',
|
||||
enqueue: 'Legg i kø',
|
||||
@@ -1427,4 +1428,175 @@ export const nbTranslation = {
|
||||
liveSearch: 'Live',
|
||||
randomAlbumsLabel: 'Tilfeldige album',
|
||||
},
|
||||
orbit: {
|
||||
triggerLabel: 'Psy Orbit',
|
||||
triggerTooltip: 'Start eller bli med i en delt lytteøkt',
|
||||
launchCreate: 'Opprett en økt',
|
||||
launchJoin: 'Bli med i en økt',
|
||||
launchHelp: 'Hvordan fungerer dette?',
|
||||
launchHelpSoon: 'Kommer snart',
|
||||
joinModalTitle: 'Bli med i en Orbit-økt',
|
||||
joinModalSub: 'Lim inn invitasjonslenken verten sendte deg.',
|
||||
joinModalLinkLabel: 'Invitasjonslenke',
|
||||
joinModalLinkPlaceholder: 'psysonic2://orbit/…',
|
||||
joinModalLinkHelper: 'Fungerer med enhver gyldig Orbit-lenke. Må peke til serveren du er innlogget på.',
|
||||
joinModalPasteTooltip: 'Lim inn fra utklippstavlen',
|
||||
joinModalSubmit: 'Bli med',
|
||||
joinModalBusy: 'Blir med…',
|
||||
joinErrEmpty: 'Lim inn en invitasjonslenke.',
|
||||
joinErrInvalid: 'Dette ser ikke ut som en Orbit-invitasjonslenke.',
|
||||
closeAria: 'Lukk',
|
||||
heroTitlePrefix: 'Lytt sammen med',
|
||||
heroTitleBrand: 'Psy Orbit',
|
||||
heroSub: 'Start en økt — andre brukere på {{server}} lytter med og kan foreslå spor.',
|
||||
fallbackServer: 'denne serveren',
|
||||
tipLan: 'Du er for øyeblikket koblet til via en hjemmenettverksadresse. Gjester utenfor nettverket kan ikke bli med — bytt til en offentlig serveradresse i innstillingene før du starter.',
|
||||
tipRemote: 'For at gjester utenfor hjemmenettverket skal kunne bli med, må serveradressen være offentlig tilgjengelig. Hvis serveren din bare er intern, bytt før du starter.',
|
||||
labelName: 'Øktnavn',
|
||||
namePlaceholder: 'Velvet Orbit',
|
||||
reshuffleTooltip: 'Nytt forslag',
|
||||
reshuffleAria: 'Foreslå et nytt navn',
|
||||
helperName: 'Slik vises økten for gjestene — behold den eller skriv din egen.',
|
||||
labelMax: 'Maks gjester',
|
||||
helperMax: 'Du telles ikke — dette begrenser bare innkommende gjester.',
|
||||
labelLink: 'Invitasjonslenke',
|
||||
tooltipCopied: 'Kopiert',
|
||||
tooltipCopy: 'Kopier',
|
||||
ariaCopyLink: 'Kopier invitasjonslenke',
|
||||
helperLink: 'Send denne lenken til gjestene dine. De kan lime den inn hvor som helst i Psysonic med Ctrl+V.',
|
||||
labelClearQueue: 'Tøm min kø først',
|
||||
helperClearQueue: 'Start økten med en tom kø. Av: eksisterende spor beholdes og deles med gjester.',
|
||||
btnCancel: 'Avbryt',
|
||||
btnStarting: 'Starter…',
|
||||
btnStart: 'Start Orbit',
|
||||
btnCopyAndStart: 'Kopier lenke & start',
|
||||
errNameRequired: 'Gi økten din et navn.',
|
||||
errStartFailed: 'Kunne ikke starte.',
|
||||
hostLabel: 'Vert: {{name}}',
|
||||
participantsTooltip: 'Deltakere',
|
||||
settingsTooltip: 'Øktinnstillinger',
|
||||
shareTooltip: 'Del invitasjonslenke',
|
||||
shuffleLabel: 'Kø stokkes på nytt om',
|
||||
catchUpLabel: 'ta igjen',
|
||||
catchUpTooltip: 'Hopp til vertens nåværende posisjon',
|
||||
hostAway: 'Vert offline',
|
||||
hostOnline: 'Vert online',
|
||||
endTooltip: 'Avslutt økt',
|
||||
leaveTooltip: 'Forlat økt',
|
||||
helpTooltip: 'Hvordan Orbit fungerer',
|
||||
helpTitle: 'Hvordan Orbit fungerer',
|
||||
helpIntro: 'Orbit gjør Psysonic til et delt lytterom. En vert velger musikken; gjester lytter synkronisert og kan foreslå spor.',
|
||||
helpHostOnly: '(vert)',
|
||||
helpSec1Title: 'Hva er Orbit?',
|
||||
helpSec1Body: 'En "lytte sammen"-modus — verten driver avspillingen, gjester blir med. Alt går via spillelister på din egen Navidrome-server; ingen ekstern infrastruktur.',
|
||||
helpSec2Title: 'Vert og gjester',
|
||||
helpSec2Body: 'Verten kontrollerer avspillingen (spill / pause / hopp / søk) og bestemmer når økten avsluttes. Gjester følger vertens avspilling, kan foreslå spor og forlate eller bli med igjen når som helst. Bare verten kan utvise eller permanent utestenge en deltaker.',
|
||||
helpSec2WarnHead: 'Viktig: separate kontoer.',
|
||||
helpSec2WarnBody: 'Hver deltaker trenger sin egen Navidrome-konto. Hvis vert og gjest logger inn med samme bruker kolliderer innsendingene, og verten ser aldri gjestens forslag.',
|
||||
helpSec3Title: 'Starte og invitere',
|
||||
helpSec3Body: 'Klikk på "Psy Orbit"-knappen → Opprett en økt → startmodalen viser en klar-til-kopiering invitasjonslenke og lar deg eventuelt tømme gjeldende kø. Del lenken som du vil. Mens en økt kjører, kopierer delknappen i øktlinjen øverst lenken når som helst.',
|
||||
helpSec4Title: 'Bli med',
|
||||
helpSec4Body: 'Lim inn invitasjonslenken hvor som helst i Psysonic med Ctrl+V / Cmd+V — bli-med-spørsmålet dukker opp automatisk. Alternativt: "Psy Orbit" → Bli med i en økt → lim inn i feltet. Hvis lenken peker til en server du har konto på, bytter Psysonic for deg. Ved flere kontoer på den serveren spør en liten velger hvilken som skal brukes.',
|
||||
helpSec5Title: 'Foreslå spor',
|
||||
helpSec5Body: 'I enhver sporliste: dobbeltklikk en rad, eller høyreklikk → "Legg til i Orbit-økt". Et enkelt klikk viser et hint i stedet for å dumpe hele albumet i den delte køen — det er bevisst. Eksplisitte bulk-handlinger som "Spill alt" eller "Spill album" ber først om bekreftelse og legger deretter til (erstatter aldri).',
|
||||
helpSec6Title: 'Den delte køen',
|
||||
helpSec6Body: 'Køen viser vertens kommende spor — synlig for alle. Innkommende bulk-tillegg legges alltid til bakerst, så gjesteforslag går ikke tapt. Auto-stokking omorganiserer køen periodisk (konfigurerbar: 1 / 5 / 10 / 15 / 30 min). Hvis avspillingen din avviker fra verten, bringer "Ta igjen"-knappen i øktlinjen deg tilbake til vertens liveposisjon.',
|
||||
helpSec7Title: 'Godkjenninger',
|
||||
helpSec7Body: 'Som standard trenger gjesteforslag manuell godkjenning — de vises i en "Godkjenninger"-stripe øverst i køpanelet med godta / avvis-knapper. Auto-godkjenning kan slås på i øktinnstillingene slik at alt lander direkte.',
|
||||
helpSec8Title: 'Deltakere og innstillinger',
|
||||
helpSec8Body: 'Åpne innstillingsikonet i øktlinjen for stokkingsfrekvens, auto-godkjenning og "Stokk nå"-snarveien. Klikk på deltakerantallet for å se hvem som er koblet til — utvis (kan bli med igjen via lenken) eller utesteng (utelåst for økten). Gjester ser også deltakerlisten, men bare-lesing.',
|
||||
helpSec9Title: 'Avslutte økten',
|
||||
helpSec9Body: 'Vert X → bekreftelsesdialog → økten lukkes for alle og serverspillelistene ryddes opp automatisk. Gjest X → gjesten forlater, økten fortsetter. Hvis verten er stille i 5 minutter, forlater gjesten automatisk med en melding; korte gjentilkoblinger innenfor tiden er usynlige.',
|
||||
participantsInviteLabel: 'Invitasjonslenke',
|
||||
participantsCountLabel: '{{count}} i økten',
|
||||
participantsHost: 'vert',
|
||||
participantsEmpty: 'Ingen gjester ennå',
|
||||
participantsKickTooltip: 'Fjern fra økten',
|
||||
participantsKickAria: 'Fjern {{user}}',
|
||||
participantsRemoveTooltip: 'Fjern fra økten',
|
||||
participantsRemoveAria: 'Fjern {{user}} fra denne økten',
|
||||
participantsBanTooltip: 'Uteste permanent',
|
||||
participantsBanAria: 'Uteste {{user}} permanent',
|
||||
confirmRemoveTitle: 'Fjerne fra økten?',
|
||||
confirmRemoveBody: '{{user}} fjernes fra økten, men kan bli med igjen via invitasjonslenken din.',
|
||||
confirmRemoveConfirm: 'Fjern',
|
||||
confirmBanTitle: 'Uteste permanent?',
|
||||
confirmBanBody: '{{user}} fjernes og hindres i å bli med i denne økten igjen. Kan ikke angres i løpet av økten.',
|
||||
confirmBanConfirm: 'Uteste',
|
||||
confirmCancel: 'Avbryt',
|
||||
confirmJoinTitle: 'Bli med i Orbit-økt?',
|
||||
confirmJoinBody: '{{host}} inviterte deg til "{{name}}". Bli med i økten?',
|
||||
confirmJoinConfirm: 'Bli med',
|
||||
confirmLeaveTitle: 'Forlate økten?',
|
||||
confirmLeaveBody: 'Forlate "{{name}}"? Du kan bli med igjen når som helst via {{host}}s invitasjonslenke.',
|
||||
confirmLeaveConfirm: 'Forlat',
|
||||
confirmEndTitle: 'Avslutte økten for alle?',
|
||||
confirmEndBody: '"{{name}}" lukkes for alle deltakere. Øktens spillelister ryddes opp automatisk.',
|
||||
confirmEndConfirm: 'Avslutt økt',
|
||||
invalidLinkTitle: 'Invitasjonslenken er ikke lenger gyldig',
|
||||
invalidLinkBody: 'Denne Orbit-økten finnes ikke lenger eller er allerede avsluttet. Be verten om en ny invitasjonslenke.',
|
||||
settingsTitle: 'Øktinnstillinger',
|
||||
settingAutoApprove: 'Godkjenn forslag automatisk',
|
||||
settingAutoApproveHint: 'Gjesteforslag lander umiddelbart i køen din. Av: de blir værende i øktlisten for senere gjennomgang.',
|
||||
settingAutoShuffle: 'Automatisk stokking',
|
||||
settingAutoShuffleHint: 'Periodisk Fisher-Yates-stokking av kommende kø. Av: rekkefølgen endres bare når du omorganiserer den.',
|
||||
settingShuffleInterval: 'Stokk på nytt hver',
|
||||
settingShuffleIntervalHint: 'Hvor ofte kommende kø stokkes på nytt mens økten kjører.',
|
||||
settingShuffleIntervalValue_one: '{{count}} min',
|
||||
settingShuffleIntervalValue_other: '{{count}} min',
|
||||
settingShuffleNow: 'Stokk nå',
|
||||
toastSuggested: '{{user}} foreslo "{{title}}"',
|
||||
toastSuggestedMany: '{{count}} nye forslag i køen',
|
||||
toastShuffled: 'Kø stokket',
|
||||
toastJoined: 'Ble med i økt',
|
||||
toastLoginFirst: 'Logg inn før du blir med i en økt',
|
||||
toastSwitchServer: 'Bytt til {{url}} først, og lim inn igjen',
|
||||
toastNoAccountForServer: 'Du har ikke tilgang til {{url}}. Be verten om en invitasjon.',
|
||||
toastSwitchFailed: 'Kunne ikke bytte til {{url}}',
|
||||
accountPickerTitle: 'Hvilken konto?',
|
||||
accountPickerSub: 'Du har mer enn én konto for {{url}}. Velg den du vil bli med i økten med.',
|
||||
toastJoinFail: 'Kunne ikke bli med i økten',
|
||||
joinErrNotFound: 'Økt ikke funnet',
|
||||
joinErrEnded: 'Økten er avsluttet',
|
||||
joinErrFull: 'Økten er full',
|
||||
joinErrKicked: 'Du kan ikke bli med i denne økten igjen',
|
||||
joinErrNoUser: 'Ingen aktiv server',
|
||||
joinErrServerError: 'Kunne ikke bli med',
|
||||
ctxAddToSession: 'Legg til i Orbit-økt',
|
||||
ctxSuggestedToast: 'Foreslått til økten',
|
||||
ctxSuggestFailed: 'Kunne ikke foreslå — ikke blitt med',
|
||||
ctxAddToSessionHost: 'Legg til i Orbit-økt',
|
||||
ctxAddedHostToast: 'Lagt til i økten',
|
||||
ctxAddHostFailed: 'Kunne ikke legge til i økten',
|
||||
bulkConfirmTitle: 'Legg alt til i Orbit-køen?',
|
||||
bulkConfirmBody: 'Dette vil slippe {{count}} spor i den delte køen på én gang. Det er mye for gjestene dine. Fortsette?',
|
||||
bulkConfirmYes: 'Legg til alle',
|
||||
bulkConfirmNo: 'Avbryt',
|
||||
guestLive: 'Live',
|
||||
guestPlaying: 'Spiller nå',
|
||||
guestPaused: 'Pauset',
|
||||
guestLoading: 'Laster…',
|
||||
guestSuggestions: 'Forslag',
|
||||
guestUpNext: 'Neste',
|
||||
guestUpNextEmpty: 'Ingenting i kø. Åpne et spors kontekstmeny og velg "Legg til i Orbit-økt" for å foreslå ett.',
|
||||
guestPendingTitle: 'Venter på vert',
|
||||
guestPendingHint: 'Foreslått — dukker opp i køen når verten tar det.',
|
||||
approvalTitle: 'Venter på godkjenning',
|
||||
approvalFrom: 'Foreslått av {{user}}',
|
||||
approvalAccept: 'Godta',
|
||||
approvalDecline: 'Avvis',
|
||||
guestUpNextMore: '+ {{count}} flere i vertens kø',
|
||||
guestSubmitter: 'av {{user}}',
|
||||
guestEmpty: 'Ingen forslag ennå. Åpne et spors kontekstmeny og velg "Legg til i Orbit-økt".',
|
||||
guestFooter: 'Verten kontrollerer avspillingen — du kan ikke endre listen.',
|
||||
exitKickedTitle: 'Du ble utestengt fra økten',
|
||||
exitRemovedTitle: 'Du ble fjernet fra økten',
|
||||
exitEndedTitle: 'Verten avsluttet økten',
|
||||
exitHostTimeoutTitle: 'Vert ikke tilgjengelig',
|
||||
exitHostTimeoutBody: '{{host}} har ikke sendt en oppdatering på en stund, så "{{name}}" ble lukket på din side. Du kan bli med igjen når som helst med invitasjonslenken.',
|
||||
exitKickedBody: '{{host}} utestengte deg fra "{{name}}". Du kan ikke bli med igjen.',
|
||||
exitRemovedBody: '{{host}} fjernet deg fra "{{name}}". Du kan bli med igjen når som helst via invitasjonslenken.',
|
||||
exitEndedBody: '"{{name}}" er avsluttet. Håper du hadde det gøy.',
|
||||
exitOk: 'OK',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -176,6 +176,7 @@ export const nlTranslation = {
|
||||
},
|
||||
albumDetail: {
|
||||
back: 'Terug',
|
||||
orbitDoubleClickHint: 'Dubbelklik om dit nummer aan de Orbit-wachtrij toe te voegen',
|
||||
playAll: 'Alles afspelen',
|
||||
shareAlbum: 'Album delen',
|
||||
enqueue: 'In wachtrij',
|
||||
@@ -1427,4 +1428,175 @@ export const nlTranslation = {
|
||||
liveSearch: 'Live',
|
||||
randomAlbumsLabel: 'Willekeurige albums',
|
||||
},
|
||||
orbit: {
|
||||
triggerLabel: 'Psy Orbit',
|
||||
triggerTooltip: 'Een gedeelde luistersessie starten of eraan deelnemen',
|
||||
launchCreate: 'Sessie aanmaken',
|
||||
launchJoin: 'Deelnemen aan sessie',
|
||||
launchHelp: 'Hoe werkt dit?',
|
||||
launchHelpSoon: 'Binnenkort beschikbaar',
|
||||
joinModalTitle: 'Deelnemen aan een Orbit-sessie',
|
||||
joinModalSub: 'Plak de uitnodigingslink die je host je gestuurd heeft.',
|
||||
joinModalLinkLabel: 'Uitnodigingslink',
|
||||
joinModalLinkPlaceholder: 'psysonic2://orbit/…',
|
||||
joinModalLinkHelper: 'Werkt met elke geldige Orbit-link. Moet verwijzen naar de server waarop je nu bent aangemeld.',
|
||||
joinModalPasteTooltip: 'Plakken vanaf klembord',
|
||||
joinModalSubmit: 'Deelnemen',
|
||||
joinModalBusy: 'Deelnemen…',
|
||||
joinErrEmpty: 'Plak een uitnodigingslink.',
|
||||
joinErrInvalid: 'Dat lijkt geen Orbit-uitnodigingslink.',
|
||||
closeAria: 'Sluiten',
|
||||
heroTitlePrefix: 'Luister samen met',
|
||||
heroTitleBrand: 'Psy Orbit',
|
||||
heroSub: 'Start een sessie — andere gebruikers op {{server}} luisteren mee en kunnen nummers voorstellen.',
|
||||
fallbackServer: 'deze server',
|
||||
tipLan: 'Je bent momenteel verbonden via een thuisnetwerkadres. Gasten van buiten je netwerk kunnen niet deelnemen — schakel over naar een openbaar serveradres in de instellingen voordat je start.',
|
||||
tipRemote: 'Zodat gasten van buiten je thuisnetwerk kunnen deelnemen, moet je serveradres publiek bereikbaar zijn. Als je server alleen intern is, schakel om voordat je start.',
|
||||
labelName: 'Sessienaam',
|
||||
namePlaceholder: 'Velvet Orbit',
|
||||
reshuffleTooltip: 'Nieuwe suggestie',
|
||||
reshuffleAria: 'Een nieuwe naam voorstellen',
|
||||
helperName: 'Hoe de sessie voor je gasten verschijnt — laat staan of typ je eigen naam.',
|
||||
labelMax: 'Max. gasten',
|
||||
helperMax: 'Jij telt niet mee — dit beperkt alleen binnenkomende gasten.',
|
||||
labelLink: 'Uitnodigingslink',
|
||||
tooltipCopied: 'Gekopieerd',
|
||||
tooltipCopy: 'Kopiëren',
|
||||
ariaCopyLink: 'Uitnodigingslink kopiëren',
|
||||
helperLink: 'Stuur deze link naar je gasten. Ze kunnen hem overal in Psysonic plakken met Ctrl+V.',
|
||||
labelClearQueue: 'Eerst mijn wachtrij legen',
|
||||
helperClearQueue: 'Begin de sessie met een lege wachtrij. Uit: bestaande nummers blijven en worden met gasten gedeeld.',
|
||||
btnCancel: 'Annuleren',
|
||||
btnStarting: 'Starten…',
|
||||
btnStart: 'Orbit starten',
|
||||
btnCopyAndStart: 'Link kopiëren & starten',
|
||||
errNameRequired: 'Geef je sessie een naam.',
|
||||
errStartFailed: 'Kon niet starten.',
|
||||
hostLabel: 'Host: {{name}}',
|
||||
participantsTooltip: 'Deelnemers',
|
||||
settingsTooltip: 'Sessie-instellingen',
|
||||
shareTooltip: 'Uitnodigingslink delen',
|
||||
shuffleLabel: 'Volgende shuffle in',
|
||||
catchUpLabel: 'inhalen',
|
||||
catchUpTooltip: 'Spring naar de huidige positie van de host',
|
||||
hostAway: 'Host offline',
|
||||
hostOnline: 'Host online',
|
||||
endTooltip: 'Sessie beëindigen',
|
||||
leaveTooltip: 'Sessie verlaten',
|
||||
helpTooltip: 'Hoe Orbit werkt',
|
||||
helpTitle: 'Hoe Orbit werkt',
|
||||
helpIntro: 'Orbit maakt van Psysonic een gedeelde luisterruimte. Een host kiest de muziek; gasten luisteren synchroon mee en kunnen nummers voorstellen.',
|
||||
helpHostOnly: '(host)',
|
||||
helpSec1Title: 'Wat is Orbit?',
|
||||
helpSec1Body: 'Een "samen luisteren"-modus — de host stuurt de weergave, gasten sluiten aan. Alles loopt via playlists op je eigen Navidrome-server; geen externe infrastructuur.',
|
||||
helpSec2Title: 'Host en gasten',
|
||||
helpSec2Body: 'De host bedient de weergave (play / pause / skip / seek) en beslist wanneer de sessie eindigt. Gasten volgen de weergave, kunnen nummers voorstellen en elk moment verlaten of opnieuw deelnemen. Alleen de host kan deelnemers kicken of permanent bannen.',
|
||||
helpSec2WarnHead: 'Belangrijk: aparte accounts.',
|
||||
helpSec2WarnBody: 'Elke deelnemer heeft een eigen Navidrome-account nodig. Als host en gast met dezelfde gebruiker inloggen botsen hun inzendingen en de host ziet nooit de suggesties van de gast.',
|
||||
helpSec3Title: 'Starten en uitnodigen',
|
||||
helpSec3Body: 'Klik op de "Psy Orbit"-knop → Sessie aanmaken → het startmodal toont een kopieerklare uitnodigingslink en laat je optioneel je huidige wachtrij legen. Deel de link hoe je wilt. Terwijl een sessie draait, kopieert de deelknop in de sessiebalk de link op elk moment opnieuw.',
|
||||
helpSec4Title: 'Deelnemen',
|
||||
helpSec4Body: 'Plak de uitnodigingslink ergens in Psysonic met Ctrl+V / Cmd+V — de deelprompt verschijnt automatisch. Alternatief: "Psy Orbit" → Deelnemen aan sessie → plak in het veld. Als de link naar een server verwijst waar je een account hebt, schakelt Psysonic voor je. Bij meerdere accounts op die server vraagt een kleine kiezer welke te gebruiken.',
|
||||
helpSec5Title: 'Nummers voorstellen',
|
||||
helpSec5Body: 'In elke lijst: dubbelklik op een rij, of rechtermuisknop → "Toevoegen aan Orbit-sessie". Een enkele klik toont een hint in plaats van het hele album in de gedeelde wachtrij te gooien — dat is bewust. Expliciete bulkacties zoals "Alles afspelen" of "Album afspelen" vragen eerst om bevestiging en voegen dan toe (vervangen nooit).',
|
||||
helpSec6Title: 'De gedeelde wachtrij',
|
||||
helpSec6Body: 'De wachtrij toont de komende nummers van de host — voor iedereen zichtbaar. Inkomende bulktoevoegingen worden altijd achteraan geplaatst, zodat suggesties van gasten niet verloren gaan. Auto-shuffle hergroepeert de wachtrij periodiek (instelbaar: 1 / 5 / 10 / 15 / 30 min). Als je weergave afwijkt van de host, brengt de "Inhalen"-knop in de sessiebalk je terug naar de live positie van de host.',
|
||||
helpSec7Title: 'Goedkeuringen',
|
||||
helpSec7Body: 'Standaard hebben gast-suggesties handmatige goedkeuring nodig — ze verschijnen in een "Goedkeuringen"-strook bovenaan het wachtrijpaneel met accepteer- / afwijsknoppen. Auto-goedkeuring kan in de sessie-instellingen aan, zodat alles direct doorgaat.',
|
||||
helpSec8Title: 'Deelnemers en instellingen',
|
||||
helpSec8Body: 'Open het instellingen-icoon in de sessiebalk voor shuffle-cadans, auto-goedkeuring en de "Nu shufflen"-sneltoets. Klik op het deelnemersaantal om te zien wie verbonden is — kicken (kan via de link opnieuw deelnemen) of bannen (voor de sessie uitgesloten). Gasten zien de deelnemerslijst ook, maar alleen-lezen.',
|
||||
helpSec9Title: 'De sessie beëindigen',
|
||||
helpSec9Body: 'Host-X → bevestigingsdialoog → de sessie sluit voor iedereen en de server-playlists worden automatisch opgeruimd. Gast-X → de gast verlaat, de sessie gaat door. Als de host 5 minuten stil blijft, verlaat de gast automatisch met een melding; korte reconnects binnen die tijd zijn onzichtbaar.',
|
||||
participantsInviteLabel: 'Uitnodigingslink',
|
||||
participantsCountLabel: '{{count}} in sessie',
|
||||
participantsHost: 'host',
|
||||
participantsEmpty: 'Nog geen gasten',
|
||||
participantsKickTooltip: 'Uit sessie verwijderen',
|
||||
participantsKickAria: '{{user}} verwijderen',
|
||||
participantsRemoveTooltip: 'Uit sessie verwijderen',
|
||||
participantsRemoveAria: '{{user}} uit deze sessie verwijderen',
|
||||
participantsBanTooltip: 'Permanent bannen',
|
||||
participantsBanAria: '{{user}} permanent bannen',
|
||||
confirmRemoveTitle: 'Uit sessie verwijderen?',
|
||||
confirmRemoveBody: '{{user}} wordt uit de sessie verwijderd, maar kan opnieuw deelnemen via je uitnodigingslink.',
|
||||
confirmRemoveConfirm: 'Verwijderen',
|
||||
confirmBanTitle: 'Permanent bannen?',
|
||||
confirmBanBody: '{{user}} wordt verwijderd en kan niet meer aan deze sessie deelnemen. Onomkeerbaar voor de duur van de sessie.',
|
||||
confirmBanConfirm: 'Bannen',
|
||||
confirmCancel: 'Annuleren',
|
||||
confirmJoinTitle: 'Deelnemen aan Orbit-sessie?',
|
||||
confirmJoinBody: '{{host}} heeft je uitgenodigd voor "{{name}}". Aan de sessie deelnemen?',
|
||||
confirmJoinConfirm: 'Deelnemen',
|
||||
confirmLeaveTitle: 'Sessie verlaten?',
|
||||
confirmLeaveBody: 'Wil je "{{name}}" verlaten? Je kunt altijd opnieuw deelnemen via de uitnodigingslink van {{host}}.',
|
||||
confirmLeaveConfirm: 'Verlaten',
|
||||
confirmEndTitle: 'Sessie voor iedereen beëindigen?',
|
||||
confirmEndBody: '"{{name}}" wordt voor alle deelnemers gesloten. De sessie-playlists worden automatisch opgeruimd.',
|
||||
confirmEndConfirm: 'Sessie beëindigen',
|
||||
invalidLinkTitle: 'Uitnodigingslink is niet meer geldig',
|
||||
invalidLinkBody: 'Deze Orbit-sessie bestaat niet meer of is al beëindigd. Vraag de host om een nieuwe uitnodigingslink.',
|
||||
settingsTitle: 'Sessie-instellingen',
|
||||
settingAutoApprove: 'Suggesties automatisch goedkeuren',
|
||||
settingAutoApproveHint: 'Gast-suggesties komen direct in je wachtrij. Uit: ze blijven in de sessielijst voor latere beoordeling.',
|
||||
settingAutoShuffle: 'Automatisch shufflen',
|
||||
settingAutoShuffleHint: 'Periodieke Fisher-Yates-shuffle van de komende wachtrij. Uit: de volgorde verandert alleen wanneer je zelf herschikt.',
|
||||
settingShuffleInterval: 'Opnieuw shufflen elke',
|
||||
settingShuffleIntervalHint: 'Hoe vaak de komende wachtrij tijdens de sessie opnieuw wordt geshuffled.',
|
||||
settingShuffleIntervalValue_one: '{{count}} min',
|
||||
settingShuffleIntervalValue_other: '{{count}} min',
|
||||
settingShuffleNow: 'Nu shufflen',
|
||||
toastSuggested: '{{user}} stelde "{{title}}" voor',
|
||||
toastSuggestedMany: '{{count}} nieuwe suggesties in de wachtrij',
|
||||
toastShuffled: 'Wachtrij geshuffled',
|
||||
toastJoined: 'Deelgenomen aan sessie',
|
||||
toastLoginFirst: 'Log eerst in voordat je aan een sessie deelneemt',
|
||||
toastSwitchServer: 'Schakel eerst naar {{url}} en plak opnieuw',
|
||||
toastNoAccountForServer: 'Je hebt geen toegang tot {{url}}. Vraag de host om een uitnodiging.',
|
||||
toastSwitchFailed: 'Kon niet schakelen naar {{url}}',
|
||||
accountPickerTitle: 'Welk account?',
|
||||
accountPickerSub: 'Je hebt meer dan één account voor {{url}}. Kies waarmee je wilt deelnemen.',
|
||||
toastJoinFail: 'Kon niet deelnemen aan sessie',
|
||||
joinErrNotFound: 'Sessie niet gevonden',
|
||||
joinErrEnded: 'De sessie is beëindigd',
|
||||
joinErrFull: 'De sessie is vol',
|
||||
joinErrKicked: 'Je kunt niet opnieuw deelnemen aan deze sessie',
|
||||
joinErrNoUser: 'Geen actieve server',
|
||||
joinErrServerError: 'Kon niet deelnemen',
|
||||
ctxAddToSession: 'Aan Orbit-sessie toevoegen',
|
||||
ctxSuggestedToast: 'Aan sessie voorgesteld',
|
||||
ctxSuggestFailed: 'Kon niet voorstellen — niet deelgenomen',
|
||||
ctxAddToSessionHost: 'Aan Orbit-sessie toevoegen',
|
||||
ctxAddedHostToast: 'Aan sessie toegevoegd',
|
||||
ctxAddHostFailed: 'Kon niet toevoegen aan sessie',
|
||||
bulkConfirmTitle: 'Alles aan de Orbit-wachtrij toevoegen?',
|
||||
bulkConfirmBody: 'Dit zou {{count}} nummers in één keer in de gedeelde wachtrij plaatsen. Dat is veel voor je gasten. Doorgaan?',
|
||||
bulkConfirmYes: 'Alles toevoegen',
|
||||
bulkConfirmNo: 'Annuleren',
|
||||
guestLive: 'Live',
|
||||
guestPlaying: 'Speelt nu',
|
||||
guestPaused: 'Gepauzeerd',
|
||||
guestLoading: 'Laden…',
|
||||
guestSuggestions: 'Suggesties',
|
||||
guestUpNext: 'Volgende',
|
||||
guestUpNextEmpty: 'Niets in de wachtrij. Open het contextmenu van een nummer en kies "Aan Orbit-sessie toevoegen".',
|
||||
guestPendingTitle: 'Wacht op host',
|
||||
guestPendingHint: 'Voorgesteld — verschijnt in de wachtrij zodra de host het oppakt.',
|
||||
approvalTitle: 'Wacht op goedkeuring',
|
||||
approvalFrom: 'Voorgesteld door {{user}}',
|
||||
approvalAccept: 'Accepteren',
|
||||
approvalDecline: 'Weigeren',
|
||||
guestUpNextMore: '+ {{count}} meer in de wachtrij van de host',
|
||||
guestSubmitter: 'door {{user}}',
|
||||
guestEmpty: 'Nog geen suggesties. Open het contextmenu van een nummer en kies "Aan Orbit-sessie toevoegen".',
|
||||
guestFooter: 'De host bedient de weergave — je kunt de lijst niet wijzigen.',
|
||||
exitKickedTitle: 'Je bent uit de sessie gebannen',
|
||||
exitRemovedTitle: 'Je bent uit de sessie verwijderd',
|
||||
exitEndedTitle: 'De host heeft de sessie beëindigd',
|
||||
exitHostTimeoutTitle: 'Host niet bereikbaar',
|
||||
exitHostTimeoutBody: '{{host}} heeft al een tijd geen update meer verstuurd, dus "{{name}}" is aan jouw kant gesloten. Je kunt altijd opnieuw deelnemen via de link.',
|
||||
exitKickedBody: '{{host}} heeft je uit "{{name}}" gebannen. Je kunt niet opnieuw deelnemen.',
|
||||
exitRemovedBody: '{{host}} heeft je uit "{{name}}" verwijderd. Je kunt altijd opnieuw deelnemen via de link.',
|
||||
exitEndedBody: '"{{name}}" is beëindigd. Hopelijk had je plezier.',
|
||||
exitOk: 'OK',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -186,6 +186,7 @@ export const ruTranslation = {
|
||||
},
|
||||
albumDetail: {
|
||||
back: 'Назад',
|
||||
orbitDoubleClickHint: 'Двойной клик, чтобы добавить этот трек в очередь Orbit',
|
||||
playAll: 'Воспроизвести всё',
|
||||
shareAlbum: 'Поделиться альбомом',
|
||||
enqueue: 'В очередь',
|
||||
@@ -1506,4 +1507,177 @@ export const ruTranslation = {
|
||||
liveSearch: 'Live',
|
||||
randomAlbumsLabel: 'Случайные альбомы',
|
||||
},
|
||||
orbit: {
|
||||
triggerLabel: 'Psy Orbit',
|
||||
triggerTooltip: 'Начать или присоединиться к совместной сессии прослушивания',
|
||||
launchCreate: 'Создать сессию',
|
||||
launchJoin: 'Присоединиться к сессии',
|
||||
launchHelp: 'Как это работает?',
|
||||
launchHelpSoon: 'Скоро будет',
|
||||
joinModalTitle: 'Присоединиться к сессии Orbit',
|
||||
joinModalSub: 'Вставь ссылку-приглашение от хоста.',
|
||||
joinModalLinkLabel: 'Ссылка-приглашение',
|
||||
joinModalLinkPlaceholder: 'psysonic2://orbit/…',
|
||||
joinModalLinkHelper: 'Работает с любой действительной ссылкой Orbit. Должна указывать на сервер, на котором ты сейчас авторизован.',
|
||||
joinModalPasteTooltip: 'Вставить из буфера обмена',
|
||||
joinModalSubmit: 'Присоединиться',
|
||||
joinModalBusy: 'Подключение…',
|
||||
joinErrEmpty: 'Вставь ссылку-приглашение.',
|
||||
joinErrInvalid: 'Это не похоже на ссылку-приглашение Orbit.',
|
||||
closeAria: 'Закрыть',
|
||||
heroTitlePrefix: 'Слушай вместе с',
|
||||
heroTitleBrand: 'Psy Orbit',
|
||||
heroSub: 'Начни сессию — другие пользователи на {{server}} будут слушать вместе и смогут предлагать треки.',
|
||||
fallbackServer: 'этот сервер',
|
||||
tipLan: 'Ты сейчас подключён через адрес домашней сети. Гости вне твоей сети не смогут присоединиться — переключись на публичный адрес сервера в настройках перед стартом.',
|
||||
tipRemote: 'Чтобы гости вне домашней сети могли присоединиться, адрес сервера должен быть публично доступен. Если сервер только внутренний, переключись перед стартом.',
|
||||
labelName: 'Название сессии',
|
||||
namePlaceholder: 'Velvet Orbit',
|
||||
reshuffleTooltip: 'Новое предложение',
|
||||
reshuffleAria: 'Предложить новое название',
|
||||
helperName: 'Как сессия будет отображаться у гостей — оставь или введи своё.',
|
||||
labelMax: 'Макс. гостей',
|
||||
helperMax: 'Ты не считаешься — это только ограничивает входящих гостей.',
|
||||
labelLink: 'Ссылка-приглашение',
|
||||
tooltipCopied: 'Скопировано',
|
||||
tooltipCopy: 'Копировать',
|
||||
ariaCopyLink: 'Копировать ссылку-приглашение',
|
||||
helperLink: 'Отправь эту ссылку гостям. Они могут вставить её в Psysonic в любом месте с помощью Ctrl+V.',
|
||||
labelClearQueue: 'Сначала очистить мою очередь',
|
||||
helperClearQueue: 'Начать сессию с пустой очередью. Выкл.: уже поставленные треки остаются и делятся с гостями.',
|
||||
btnCancel: 'Отмена',
|
||||
btnStarting: 'Запуск…',
|
||||
btnStart: 'Запустить Orbit',
|
||||
btnCopyAndStart: 'Копировать ссылку и запустить',
|
||||
errNameRequired: 'Пожалуйста, дай сессии название.',
|
||||
errStartFailed: 'Не удалось запустить.',
|
||||
hostLabel: 'Хост: {{name}}',
|
||||
participantsTooltip: 'Участники',
|
||||
settingsTooltip: 'Настройки сессии',
|
||||
shareTooltip: 'Поделиться ссылкой-приглашением',
|
||||
shuffleLabel: 'Следующее перемешивание через',
|
||||
catchUpLabel: 'догнать',
|
||||
catchUpTooltip: 'Перейти к текущей позиции хоста',
|
||||
hostAway: 'Хост оффлайн',
|
||||
hostOnline: 'Хост онлайн',
|
||||
endTooltip: 'Завершить сессию',
|
||||
leaveTooltip: 'Покинуть сессию',
|
||||
helpTooltip: 'Как работает Orbit',
|
||||
helpTitle: 'Как работает Orbit',
|
||||
helpIntro: 'Orbit превращает Psysonic в общую комнату прослушивания. Хост выбирает музыку; гости слушают синхронно и могут предлагать треки.',
|
||||
helpHostOnly: '(хост)',
|
||||
helpSec1Title: 'Что такое Orbit?',
|
||||
helpSec1Body: 'Режим «слушать вместе» — хост управляет воспроизведением, гости подключаются. Всё идёт через плейлисты на твоём собственном сервере Navidrome; никакой внешней инфраструктуры.',
|
||||
helpSec2Title: 'Хост и гости',
|
||||
helpSec2Body: 'Хост управляет воспроизведением (play / pause / skip / seek) и решает, когда завершить сессию. Гости следуют за воспроизведением хоста, могут предлагать треки и выходить или присоединяться в любое время. Только хост может исключать или навсегда банить участников.',
|
||||
helpSec2WarnHead: 'Важно: отдельные аккаунты.',
|
||||
helpSec2WarnBody: 'У каждого участника должен быть свой аккаунт Navidrome. Если хост и гость входят под одним и тем же пользователем, их отправки конфликтуют, и хост никогда не увидит предложения гостя.',
|
||||
helpSec3Title: 'Запуск и приглашение',
|
||||
helpSec3Body: 'Нажми кнопку «Psy Orbit» → Создать сессию → стартовое окно покажет готовую ссылку для копирования и опционально позволит очистить текущую очередь. Делись ссылкой как угодно. Пока сессия активна, кнопка «Поделиться» в верхней панели сессии копирует ссылку в любой момент.',
|
||||
helpSec4Title: 'Присоединение',
|
||||
helpSec4Body: 'Вставь ссылку-приглашение в любом месте Psysonic с помощью Ctrl+V / Cmd+V — запрос на присоединение появится автоматически. Альтернатива: «Psy Orbit» → Присоединиться к сессии → вставь в поле. Если ссылка указывает на сервер, где у тебя есть аккаунт, Psysonic переключит тебя автоматически. Если у тебя несколько аккаунтов на этом сервере, небольшой выбор спросит, какой использовать.',
|
||||
helpSec5Title: 'Предложение треков',
|
||||
helpSec5Body: 'В любом списке треков: двойной клик по строке или правый клик → «Добавить в сессию Orbit». Одиночный клик показывает подсказку вместо того, чтобы забрасывать весь альбом в общую очередь — это намеренно. Явные массовые действия вроде «Воспроизвести всё» или «Воспроизвести альбом» сначала запрашивают подтверждение, потом добавляют (никогда не заменяют).',
|
||||
helpSec6Title: 'Общая очередь',
|
||||
helpSec6Body: 'Очередь показывает предстоящие треки хоста — видно всем. Входящие массовые добавления всегда идут в конец, чтобы не потерять предложения гостей. Автоперемешивание периодически переупорядочивает очередь (настраивается: 1 / 5 / 10 / 15 / 30 мин). Если твоё воспроизведение отклоняется от хоста, кнопка «Догнать» в панели сессии возвращает тебя к live-позиции хоста.',
|
||||
helpSec7Title: 'Подтверждения',
|
||||
helpSec7Body: 'По умолчанию предложения гостей требуют ручного подтверждения — они появляются в полосе «Подтверждения» вверху панели очереди с кнопками принять / отклонить. В настройках сессии можно включить автоматическое подтверждение, и всё будет попадать сразу.',
|
||||
helpSec8Title: 'Участники и настройки',
|
||||
helpSec8Body: 'Открой иконку настроек в панели сессии для частоты перемешивания, автоподтверждения и быстрого «Перемешать сейчас». Нажми на количество участников, чтобы увидеть, кто подключён — исключить (может присоединиться снова по ссылке) или забанить (заблокирован для этой сессии). Гости тоже видят список участников, но только для чтения.',
|
||||
helpSec9Title: 'Завершение сессии',
|
||||
helpSec9Body: 'X хоста → диалог подтверждения → сессия закрывается для всех, серверные плейлисты очищаются автоматически. X гостя → гость выходит, сессия продолжается. Если хост молчит 5 минут, гость автоматически выходит с уведомлением; короткие переподключения в этом окне невидимы.',
|
||||
participantsInviteLabel: 'Ссылка-приглашение',
|
||||
participantsCountLabel: '{{count}} в сессии',
|
||||
participantsHost: 'хост',
|
||||
participantsEmpty: 'Пока нет гостей',
|
||||
participantsKickTooltip: 'Удалить из сессии',
|
||||
participantsKickAria: 'Удалить {{user}}',
|
||||
participantsRemoveTooltip: 'Удалить из сессии',
|
||||
participantsRemoveAria: 'Удалить {{user}} из этой сессии',
|
||||
participantsBanTooltip: 'Забанить навсегда',
|
||||
participantsBanAria: 'Забанить {{user}} навсегда',
|
||||
confirmRemoveTitle: 'Удалить из сессии?',
|
||||
confirmRemoveBody: '{{user}} будет удалён из сессии, но может присоединиться снова по твоей ссылке-приглашению.',
|
||||
confirmRemoveConfirm: 'Удалить',
|
||||
confirmBanTitle: 'Забанить навсегда?',
|
||||
confirmBanBody: '{{user}} будет удалён и заблокирован от повторного присоединения к этой сессии. Отменить нельзя на время сессии.',
|
||||
confirmBanConfirm: 'Забанить',
|
||||
confirmCancel: 'Отмена',
|
||||
confirmJoinTitle: 'Присоединиться к сессии Orbit?',
|
||||
confirmJoinBody: '{{host}} пригласил тебя в «{{name}}». Присоединиться к сессии?',
|
||||
confirmJoinConfirm: 'Присоединиться',
|
||||
confirmLeaveTitle: 'Покинуть сессию?',
|
||||
confirmLeaveBody: 'Покинуть «{{name}}»? Ты можешь присоединиться снова в любое время по ссылке-приглашению от {{host}}.',
|
||||
confirmLeaveConfirm: 'Покинуть',
|
||||
confirmEndTitle: 'Завершить сессию для всех?',
|
||||
confirmEndBody: '«{{name}}» закроется для всех участников. Плейлисты сессии очищаются автоматически.',
|
||||
confirmEndConfirm: 'Завершить сессию',
|
||||
invalidLinkTitle: 'Ссылка-приглашение больше недействительна',
|
||||
invalidLinkBody: 'Эта сессия Orbit больше не существует или уже завершена. Попроси хоста прислать новую ссылку.',
|
||||
settingsTitle: 'Настройки сессии',
|
||||
settingAutoApprove: 'Автоматически принимать предложения',
|
||||
settingAutoApproveHint: 'Предложения гостей сразу попадают в твою очередь. Выкл.: они остаются в списке сессии для последующего просмотра.',
|
||||
settingAutoShuffle: 'Автоперемешивание',
|
||||
settingAutoShuffleHint: 'Периодическое Fisher-Yates перемешивание предстоящей очереди. Выкл.: порядок меняется только при ручной перестановке.',
|
||||
settingShuffleInterval: 'Перемешивать каждые',
|
||||
settingShuffleIntervalHint: 'Как часто предстоящая очередь перемешивается во время сессии.',
|
||||
settingShuffleIntervalValue_one: '{{count}} мин',
|
||||
settingShuffleIntervalValue_few: '{{count}} мин',
|
||||
settingShuffleIntervalValue_many: '{{count}} мин',
|
||||
settingShuffleIntervalValue_other: '{{count}} мин',
|
||||
settingShuffleNow: 'Перемешать сейчас',
|
||||
toastSuggested: '{{user}} предложил «{{title}}»',
|
||||
toastSuggestedMany: '{{count}} новых предложений в очереди',
|
||||
toastShuffled: 'Очередь перемешана',
|
||||
toastJoined: 'Присоединился к сессии',
|
||||
toastLoginFirst: 'Войди, прежде чем присоединяться к сессии',
|
||||
toastSwitchServer: 'Сначала переключись на {{url}}, потом вставь снова',
|
||||
toastNoAccountForServer: 'У тебя нет доступа к {{url}}. Попроси хоста прислать приглашение.',
|
||||
toastSwitchFailed: 'Не удалось переключиться на {{url}}',
|
||||
accountPickerTitle: 'Какой аккаунт?',
|
||||
accountPickerSub: 'У тебя несколько аккаунтов для {{url}}. Выбери тот, под которым хочешь присоединиться.',
|
||||
toastJoinFail: 'Не удалось присоединиться к сессии',
|
||||
joinErrNotFound: 'Сессия не найдена',
|
||||
joinErrEnded: 'Сессия завершена',
|
||||
joinErrFull: 'Сессия заполнена',
|
||||
joinErrKicked: 'Ты не можешь присоединиться к этой сессии',
|
||||
joinErrNoUser: 'Нет активного сервера',
|
||||
joinErrServerError: 'Не удалось присоединиться',
|
||||
ctxAddToSession: 'Добавить в сессию Orbit',
|
||||
ctxSuggestedToast: 'Предложено в сессию',
|
||||
ctxSuggestFailed: 'Не удалось предложить — не присоединён',
|
||||
ctxAddToSessionHost: 'Добавить в сессию Orbit',
|
||||
ctxAddedHostToast: 'Добавлено в сессию',
|
||||
ctxAddHostFailed: 'Не удалось добавить в сессию',
|
||||
bulkConfirmTitle: 'Добавить всё в очередь Orbit?',
|
||||
bulkConfirmBody: 'Это сбросит {{count}} треков в общую очередь за раз. Это много для твоих гостей. Продолжить?',
|
||||
bulkConfirmYes: 'Добавить всё',
|
||||
bulkConfirmNo: 'Отмена',
|
||||
guestLive: 'Live',
|
||||
guestPlaying: 'Сейчас играет',
|
||||
guestPaused: 'Пауза',
|
||||
guestLoading: 'Загрузка…',
|
||||
guestSuggestions: 'Предложения',
|
||||
guestUpNext: 'Далее',
|
||||
guestUpNextEmpty: 'В очереди пусто. Открой контекстное меню трека и выбери «Добавить в сессию Orbit», чтобы предложить что-то.',
|
||||
guestPendingTitle: 'Ожидание хоста',
|
||||
guestPendingHint: 'Предложено — появится в очереди, когда хост примет.',
|
||||
approvalTitle: 'Ожидают подтверждения',
|
||||
approvalFrom: 'Предложено {{user}}',
|
||||
approvalAccept: 'Принять',
|
||||
approvalDecline: 'Отклонить',
|
||||
guestUpNextMore: '+ ещё {{count}} в очереди хоста',
|
||||
guestSubmitter: 'от {{user}}',
|
||||
guestEmpty: 'Предложений пока нет. Открой контекстное меню трека и выбери «Добавить в сессию Orbit».',
|
||||
guestFooter: 'Хост управляет воспроизведением — ты не можешь изменять список.',
|
||||
exitKickedTitle: 'Тебя забанили в сессии',
|
||||
exitRemovedTitle: 'Тебя удалили из сессии',
|
||||
exitEndedTitle: 'Хост завершил сессию',
|
||||
exitHostTimeoutTitle: 'Хост недоступен',
|
||||
exitHostTimeoutBody: '{{host}} давно не присылал обновления, поэтому «{{name}}» закрыта на твоей стороне. Ты можешь присоединиться снова в любое время по ссылке.',
|
||||
exitKickedBody: '{{host}} забанил тебя в «{{name}}». Ты не можешь присоединиться снова.',
|
||||
exitRemovedBody: '{{host}} удалил тебя из «{{name}}». Ты можешь присоединиться снова в любое время по ссылке.',
|
||||
exitEndedBody: '«{{name}}» завершена. Надеюсь, тебе понравилось.',
|
||||
exitOk: 'ОК',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -175,6 +175,7 @@ export const zhTranslation = {
|
||||
},
|
||||
albumDetail: {
|
||||
back: '返回',
|
||||
orbitDoubleClickHint: '双击将此曲目添加到 Orbit 队列',
|
||||
playAll: '全部播放',
|
||||
shareAlbum: '分享专辑',
|
||||
enqueue: '加入队列',
|
||||
@@ -1420,4 +1421,175 @@ export const zhTranslation = {
|
||||
liveSearch: '实时',
|
||||
randomAlbumsLabel: '随机专辑',
|
||||
},
|
||||
orbit: {
|
||||
triggerLabel: 'Psy Orbit',
|
||||
triggerTooltip: '开始或加入共享收听会话',
|
||||
launchCreate: '创建会话',
|
||||
launchJoin: '加入会话',
|
||||
launchHelp: '这是怎么工作的?',
|
||||
launchHelpSoon: '即将推出',
|
||||
joinModalTitle: '加入 Orbit 会话',
|
||||
joinModalSub: '粘贴主持人发给你的邀请链接。',
|
||||
joinModalLinkLabel: '邀请链接',
|
||||
joinModalLinkPlaceholder: 'psysonic2://orbit/…',
|
||||
joinModalLinkHelper: '适用于任何有效的 Orbit 链接。必须指向你当前登录的服务器。',
|
||||
joinModalPasteTooltip: '从剪贴板粘贴',
|
||||
joinModalSubmit: '加入',
|
||||
joinModalBusy: '加入中…',
|
||||
joinErrEmpty: '请粘贴一个邀请链接。',
|
||||
joinErrInvalid: '这看起来不像 Orbit 邀请链接。',
|
||||
closeAria: '关闭',
|
||||
heroTitlePrefix: '一起听音乐 —',
|
||||
heroTitleBrand: 'Psy Orbit',
|
||||
heroSub: '开始会话 — {{server}} 上的其他用户将一起收听并可以推荐曲目。',
|
||||
fallbackServer: '此服务器',
|
||||
tipLan: '你当前通过本地网络地址连接。网络外的访客无法加入 — 请在启动前切换到公共服务器地址。',
|
||||
tipRemote: '为了让家庭网络外的访客能够加入,你的服务器地址必须公开可达。如果你的服务器仅限内部使用,请在启动前切换。',
|
||||
labelName: '会话名称',
|
||||
namePlaceholder: 'Velvet Orbit',
|
||||
reshuffleTooltip: '新建议',
|
||||
reshuffleAria: '建议新名称',
|
||||
helperName: '会话对访客的显示方式 — 保留或输入自己的名称。',
|
||||
labelMax: '最大访客数',
|
||||
helperMax: '你不计算在内 — 这仅限制加入的访客。',
|
||||
labelLink: '邀请链接',
|
||||
tooltipCopied: '已复制',
|
||||
tooltipCopy: '复制',
|
||||
ariaCopyLink: '复制邀请链接',
|
||||
helperLink: '将此链接发送给你的访客。他们可以在 Psysonic 的任何位置使用 Ctrl+V 粘贴。',
|
||||
labelClearQueue: '先清空我的队列',
|
||||
helperClearQueue: '以空队列启动会话。关闭:你已排队的曲目保留并与访客共享。',
|
||||
btnCancel: '取消',
|
||||
btnStarting: '启动中…',
|
||||
btnStart: '启动 Orbit',
|
||||
btnCopyAndStart: '复制链接并启动',
|
||||
errNameRequired: '请为你的会话命名。',
|
||||
errStartFailed: '无法启动。',
|
||||
hostLabel: '主持人:{{name}}',
|
||||
participantsTooltip: '参与者',
|
||||
settingsTooltip: '会话设置',
|
||||
shareTooltip: '分享邀请链接',
|
||||
shuffleLabel: '下次洗牌',
|
||||
catchUpLabel: '跟上',
|
||||
catchUpTooltip: '跳到主持人当前位置',
|
||||
hostAway: '主持人离线',
|
||||
hostOnline: '主持人在线',
|
||||
endTooltip: '结束会话',
|
||||
leaveTooltip: '离开会话',
|
||||
helpTooltip: 'Orbit 的工作原理',
|
||||
helpTitle: 'Orbit 的工作原理',
|
||||
helpIntro: 'Orbit 将 Psysonic 变成一个共享的收听空间。主持人选择音乐;访客同步收听并可以推荐曲目。',
|
||||
helpHostOnly: '(主持人)',
|
||||
helpSec1Title: '什么是 Orbit?',
|
||||
helpSec1Body: '"一起听"模式 — 主持人驱动播放,访客加入收听。一切都通过你自己的 Navidrome 服务器上的播放列表进行;没有外部基础设施。',
|
||||
helpSec2Title: '主持人和访客',
|
||||
helpSec2Body: '主持人控制播放(播放 / 暂停 / 跳过 / 跳转),并决定会话何时结束。访客跟随主持人的播放,可以推荐曲目,随时离开或重新加入。只有主持人可以踢出或永久封禁参与者。',
|
||||
helpSec2WarnHead: '重要:使用独立账户。',
|
||||
helpSec2WarnBody: '每个参与者都需要自己的 Navidrome 账户。如果主持人和访客使用同一用户登录,他们的提交会冲突,主持人将永远看不到访客的建议。',
|
||||
helpSec3Title: '启动和邀请',
|
||||
helpSec3Body: '点击"Psy Orbit"按钮 → 创建会话 → 启动弹窗显示可复制的邀请链接,并可选清空你当前的队列。以任何方式分享该链接。会话运行时,顶部会话栏中的分享按钮可随时再次复制链接。',
|
||||
helpSec4Title: '加入',
|
||||
helpSec4Body: '使用 Ctrl+V / Cmd+V 在 Psysonic 的任何位置粘贴邀请链接 — 加入提示会自动弹出。或者:「Psy Orbit」→ 加入会话 → 粘贴到字段中。如果链接指向你有账户的服务器,Psysonic 会为你切换。当你在该服务器上有多个账户时,小型选择器会询问使用哪个。',
|
||||
helpSec5Title: '推荐曲目',
|
||||
helpSec5Body: '在任何曲目列表中:双击一行,或右键 → "添加到 Orbit 会话"。单击会显示提示而不是将整张专辑扔进共享队列 — 这是有意的。明确的批量操作(如"全部播放"或"播放专辑")先要求确认然后追加(永不替换)。',
|
||||
helpSec6Title: '共享队列',
|
||||
helpSec6Body: '队列显示主持人即将播放的曲目 — 所有人可见。批量添加总是追加到末尾,因此访客的建议不会丢失。自动洗牌定期重新排序队列(可配置:1 / 5 / 10 / 15 / 30 分钟)。如果你的播放偏离主持人,会话栏中的"跟上"按钮会让你回到主持人的实时位置。',
|
||||
helpSec7Title: '审批',
|
||||
helpSec7Body: '默认情况下,访客建议需要手动审批 — 它们出现在队列面板顶部的"审批"栏中,带有接受 / 拒绝按钮。可以在会话设置中打开自动审批,使所有建议直接生效。',
|
||||
helpSec8Title: '参与者和设置',
|
||||
helpSec8Body: '打开会话栏中的设置图标以配置洗牌频率、自动审批和"立即洗牌"快捷方式。点击参与者数量查看谁已连接 — 踢出(可通过链接重新加入)或封禁(在该会话中被锁定)。访客也可以看到参与者列表,但仅为只读。',
|
||||
helpSec9Title: '结束会话',
|
||||
helpSec9Body: '主持人 X → 确认对话框 → 会话对所有人关闭,服务器播放列表会自动清理。访客 X → 访客离开,会话继续运行。如果主持人保持静默 5 分钟,访客会自动退出并收到通知;该窗口内的短时间重连不可见。',
|
||||
participantsInviteLabel: '邀请链接',
|
||||
participantsCountLabel: '{{count}} 人在会话中',
|
||||
participantsHost: '主持人',
|
||||
participantsEmpty: '还没有访客',
|
||||
participantsKickTooltip: '从会话中移除',
|
||||
participantsKickAria: '移除 {{user}}',
|
||||
participantsRemoveTooltip: '从会话中移除',
|
||||
participantsRemoveAria: '从此会话中移除 {{user}}',
|
||||
participantsBanTooltip: '永久封禁',
|
||||
participantsBanAria: '永久封禁 {{user}}',
|
||||
confirmRemoveTitle: '从会话中移除?',
|
||||
confirmRemoveBody: '{{user}} 将从会话中移除,但可以通过你的邀请链接重新加入。',
|
||||
confirmRemoveConfirm: '移除',
|
||||
confirmBanTitle: '永久封禁?',
|
||||
confirmBanBody: '{{user}} 将被移除并被阻止重新加入此会话。在会话存在期间无法撤销。',
|
||||
confirmBanConfirm: '封禁',
|
||||
confirmCancel: '取消',
|
||||
confirmJoinTitle: '加入 Orbit 会话?',
|
||||
confirmJoinBody: '{{host}} 邀请你加入"{{name}}"。加入会话?',
|
||||
confirmJoinConfirm: '加入',
|
||||
confirmLeaveTitle: '离开会话?',
|
||||
confirmLeaveBody: '离开"{{name}}"?你可以随时通过 {{host}} 的邀请链接重新加入。',
|
||||
confirmLeaveConfirm: '离开',
|
||||
confirmEndTitle: '为所有人结束会话?',
|
||||
confirmEndBody: '"{{name}}"将对所有参与者关闭。会话的播放列表会自动清理。',
|
||||
confirmEndConfirm: '结束会话',
|
||||
invalidLinkTitle: '邀请链接已失效',
|
||||
invalidLinkBody: '此 Orbit 会话不再存在或已结束。请主持人提供新的邀请链接。',
|
||||
settingsTitle: '会话设置',
|
||||
settingAutoApprove: '自动批准建议',
|
||||
settingAutoApproveHint: '访客建议立即进入你的队列。关闭:它们保留在会话列表中供稍后审查。',
|
||||
settingAutoShuffle: '自动洗牌',
|
||||
settingAutoShuffleHint: '即将播放队列的定期 Fisher-Yates 洗牌。关闭:顺序仅在你手动重新排列时改变。',
|
||||
settingShuffleInterval: '洗牌间隔',
|
||||
settingShuffleIntervalHint: '会话运行时即将播放队列的重新洗牌频率。',
|
||||
settingShuffleIntervalValue_one: '{{count}} 分钟',
|
||||
settingShuffleIntervalValue_other: '{{count}} 分钟',
|
||||
settingShuffleNow: '立即洗牌',
|
||||
toastSuggested: '{{user}} 推荐了"{{title}}"',
|
||||
toastSuggestedMany: '队列中有 {{count}} 个新建议',
|
||||
toastShuffled: '队列已洗牌',
|
||||
toastJoined: '已加入会话',
|
||||
toastLoginFirst: '加入会话前请先登录',
|
||||
toastSwitchServer: '请先切换到 {{url}},然后再次粘贴',
|
||||
toastNoAccountForServer: '你没有 {{url}} 的访问权限。请主持人发送邀请。',
|
||||
toastSwitchFailed: '无法切换到 {{url}}',
|
||||
accountPickerTitle: '使用哪个账户?',
|
||||
accountPickerSub: '你在 {{url}} 上有多个账户。选择用于加入会话的账户。',
|
||||
toastJoinFail: '无法加入会话',
|
||||
joinErrNotFound: '未找到会话',
|
||||
joinErrEnded: '会话已结束',
|
||||
joinErrFull: '会话已满',
|
||||
joinErrKicked: '你无法重新加入此会话',
|
||||
joinErrNoUser: '没有活动服务器',
|
||||
joinErrServerError: '无法加入',
|
||||
ctxAddToSession: '添加到 Orbit 会话',
|
||||
ctxSuggestedToast: '已推荐到会话',
|
||||
ctxSuggestFailed: '无法推荐 — 未加入',
|
||||
ctxAddToSessionHost: '添加到 Orbit 会话',
|
||||
ctxAddedHostToast: '已添加到会话',
|
||||
ctxAddHostFailed: '无法添加到会话',
|
||||
bulkConfirmTitle: '全部添加到 Orbit 队列?',
|
||||
bulkConfirmBody: '这将一次性把 {{count}} 首曲目放入共享队列。对你的访客来说信息量很大。继续?',
|
||||
bulkConfirmYes: '全部添加',
|
||||
bulkConfirmNo: '取消',
|
||||
guestLive: '直播',
|
||||
guestPlaying: '正在播放',
|
||||
guestPaused: '已暂停',
|
||||
guestLoading: '加载中…',
|
||||
guestSuggestions: '建议',
|
||||
guestUpNext: '接下来',
|
||||
guestUpNextEmpty: '队列为空。打开曲目的上下文菜单并选择"添加到 Orbit 会话"来推荐一首。',
|
||||
guestPendingTitle: '等待主持人',
|
||||
guestPendingHint: '已推荐 — 主持人接受后会出现在队列中。',
|
||||
approvalTitle: '待批准',
|
||||
approvalFrom: '由 {{user}} 推荐',
|
||||
approvalAccept: '接受',
|
||||
approvalDecline: '拒绝',
|
||||
guestUpNextMore: '+ 主持人队列中还有 {{count}} 首',
|
||||
guestSubmitter: '来自 {{user}}',
|
||||
guestEmpty: '还没有建议。打开曲目的上下文菜单并选择"添加到 Orbit 会话"。',
|
||||
guestFooter: '主持人控制播放 — 你无法更改列表。',
|
||||
exitKickedTitle: '你已被会话封禁',
|
||||
exitRemovedTitle: '你已从会话中移除',
|
||||
exitEndedTitle: '主持人已结束会话',
|
||||
exitHostTimeoutTitle: '主持人无响应',
|
||||
exitHostTimeoutBody: '{{host}} 有一段时间没有发送更新了,所以"{{name}}"在你这边已关闭。你可以随时通过邀请链接重新加入。',
|
||||
exitKickedBody: '{{host}} 已将你从"{{name}}"封禁。你无法重新加入。',
|
||||
exitRemovedBody: '{{host}} 已将你从"{{name}}"移除。你可以随时通过邀请链接重新加入。',
|
||||
exitEndedBody: '"{{name}}"已结束。希望你玩得开心。',
|
||||
exitOk: '好的',
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user