mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-22 22:45:41 +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: '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-…',
|
|
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: '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',
|
|
diag: {
|
|
openTooltip: 'Diagnóstico — registro de eventos copiable',
|
|
title: 'Diagnóstico de Orbit',
|
|
role: 'Rol',
|
|
hostTrack: 'ID de pista del anfitrión',
|
|
hostPos: 'Posición del anfitrión',
|
|
guestTrack: 'Mi ID de pista',
|
|
guestPos: 'Mi posición',
|
|
drift: 'Desfase',
|
|
stateAge: 'Edad del estado',
|
|
eventLog: 'Registro de eventos ({{count}})',
|
|
copyLabel: 'Copiar',
|
|
copyTooltip: 'Copiar registro al portapapeles',
|
|
clearLabel: 'Borrar',
|
|
clearTooltip: 'Vaciar el búfer',
|
|
empty: 'Aún sin eventos — aparecen cuando Orbit sincroniza.',
|
|
hint: 'Abre esto antes de reproducir el problema, luego pulsa Copiar y pega en el reporte.',
|
|
copied: '{{count}} líneas copiadas',
|
|
copyFailed: 'No se pudo copiar al portapapeles',
|
|
cleared: 'Búfer vaciado',
|
|
},
|
|
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 "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: "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}}',
|
|
participantsMuteTooltip: 'Silenciar sugerencias',
|
|
participantsUnmuteTooltip: 'Permitir sugerencias',
|
|
participantsMuteAria: 'Silenciar las sugerencias de {{user}}',
|
|
participantsUnmuteAria: 'Volver a permitir las sugerencias de {{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.',
|
|
suggestBlockedMuted: 'El anfitrión te silenció en esta sesión — sugerencias desactivadas.',
|
|
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}}',
|
|
queueAddedByHost: 'Añadido por el anfitrión',
|
|
queueAddedByYou: 'Añadido por ti',
|
|
queueAddedByUser: 'Añadido por {{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',
|
|
};
|