@audiofool/moondog 0.1.0 → 0.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +156 -68
- package/contracts/v1/definitions.schema.json +1 -169
- package/package.json +7 -23
- package/scripts/contract-lib.mjs +0 -7
- package/scripts/contract-semantics.mjs +0 -1904
- package/scripts/moondog.mjs +285 -74
- package/src/core/apple-library-source-status.mjs +0 -16
- package/src/core/apple-projection-domain-services.mjs +253 -53
- package/src/core/application-update.mjs +320 -0
- package/src/core/capability-catalog.mjs +290 -55
- package/src/core/listener-avoids.mjs +101 -0
- package/src/core/listening-now.mjs +108 -0
- package/src/core/listening-profile-domain-services.mjs +189 -41
- package/src/core/listening-upkeep.mjs +31 -0
- package/src/core/moondog-application.mjs +2115 -107
- package/src/core/playback-preferences.mjs +97 -0
- package/src/core/spotify-listening-intent.mjs +124 -0
- package/src/core/synthetic-domain-services.mjs +24 -3
- package/src/core/track-title.mjs +107 -0
- package/src/demo/moondog-demo.mjs +4 -22
- package/src/i18n/index.mjs +285 -0
- package/src/i18n/messages/de.mjs +135 -0
- package/src/i18n/messages/en.mjs +136 -0
- package/src/i18n/messages/es.mjs +135 -0
- package/src/i18n/messages/fr.mjs +135 -0
- package/src/i18n/messages/it.mjs +135 -0
- package/src/i18n/messages/ja.mjs +135 -0
- package/src/i18n/messages/ko.mjs +135 -0
- package/src/i18n/messages/pt.mjs +135 -0
- package/src/i18n/messages/zh-Hant.mjs +135 -0
- package/src/i18n/messages/zh.mjs +135 -0
- package/src/i18n/preferences.mjs +34 -0
- package/src/i18n/screen/es.mjs +967 -0
- package/src/i18n/screen/ja.mjs +967 -0
- package/src/i18n/screen/pt.mjs +967 -0
- package/src/i18n/screen/zh.mjs +967 -0
- package/src/importers/apple-music-library/index.mjs +0 -16
- package/src/importers/apple-music-library/sqlite-projection.mjs +51 -9
- package/src/integrations/apple-music/catalog.mjs +166 -14
- package/src/integrations/apple-music/music-app.mjs +232 -0
- package/src/integrations/apple-music/storefront.mjs +28 -0
- package/src/integrations/apple-music/terminal-preview-player.mjs +221 -0
- package/src/integrations/lastfm/history.mjs +221 -0
- package/src/integrations/lastfm/settings.mjs +75 -0
- package/src/integrations/netease/ncm-cli-player.mjs +328 -0
- package/src/integrations/open-music-similarity/artist-radio.mjs +26 -18
- package/src/integrations/public-playlists.mjs +2 -1
- package/src/integrations/spotify/account-data-profile.mjs +14 -6
- package/src/integrations/spotify/authentication.mjs +149 -15
- package/src/integrations/spotify/catalog-resolver.mjs +9 -6
- package/src/integrations/spotify/connection.mjs +2 -1
- package/src/integrations/spotify/credential-store.mjs +4 -0
- package/src/integrations/spotify/extended-streaming-history.mjs +11 -11
- package/src/integrations/spotify/history-archive.mjs +1 -1
- package/src/integrations/spotify/library-snapshot.mjs +227 -0
- package/src/integrations/spotify/recent-activity.mjs +2 -0
- package/src/integrations/spotify/service.mjs +873 -69
- package/src/integrations/spotify/web-api-client.mjs +410 -127
- package/src/integrations/web/brave-web.mjs +45 -0
- package/src/integrations/web/codex-web.mjs +15 -82
- package/src/integrations/web/deepseek-web.mjs +81 -0
- package/src/integrations/web/web-research.mjs +119 -0
- package/src/integrations/web/web-result.mjs +215 -0
- package/src/integrations/youtube-music/takeout.mjs +3 -1
- package/src/memory/local-memory-store.mjs +542 -57
- package/src/profile/history-import.mjs +42 -6
- package/src/profile/listener-corrections.mjs +22 -0
- package/src/profile/listener-profile-build.mjs +461 -0
- package/src/profile/listener-profile-store.mjs +130 -0
- package/src/profile/listener-profile-verification.mjs +68 -0
- package/src/profile/listener-profile-worker.mjs +179 -0
- package/src/profile/listening-history-store.mjs +640 -17
- package/src/profile/listening-profile-projection.mjs +454 -86
- package/src/profile/local-music-data.mjs +1 -1
- package/src/profile/moondog-suggestions.mjs +184 -0
- package/src/profile/music-providers.mjs +11 -7
- package/src/profile/profile-exploration.mjs +92 -0
- package/src/profile/recorded-measures.mjs +24 -0
- package/src/profile/spotify-archive-taste.mjs +0 -4
- package/src/runtime/pi/agent-runtime.mjs +2536 -692
- package/src/runtime/pi/authentication.mjs +34 -1
- package/src/runtime/pi/configured-runtime.mjs +22 -6
- package/src/runtime/pi/conversation-name.mjs +53 -0
- package/src/runtime/pi/memory-agent-runtime.mjs +2 -2
- package/src/runtime/pi/model-catalog.mjs +28 -5
- package/src/runtime/pi/model-settings.mjs +202 -0
- package/src/runtime/pi/model-transport.mjs +10 -0
- package/src/runtime/pi/persistent-credential-store.mjs +67 -31
- package/src/runtime/pi/profile-build-runtime.mjs +161 -0
- package/src/runtime/pi/public-model-catalog.mjs +288 -0
- package/src/runtime/pi/runtime-settings.mjs +10 -2
- package/src/runtime/pi/skills/listener-profile/SKILL.md +48 -0
- package/src/runtime/pi/tool-trace.mjs +37 -0
- package/src/surfaces/cli/auth-command.mjs +12 -4
- package/src/surfaces/cli/brand-components.mjs +310 -132
- package/src/surfaces/cli/brand-theme.mjs +51 -28
- package/src/surfaces/cli/command-completions.mjs +58 -42
- package/src/surfaces/cli/format-output.mjs +199 -388
- package/src/surfaces/cli/history-import-view.mjs +292 -139
- package/src/surfaces/cli/import-guides.mjs +2 -0
- package/src/surfaces/cli/listener-profile-command.mjs +92 -0
- package/src/surfaces/cli/listening-menu.mjs +7 -4
- package/src/surfaces/cli/profile-command.mjs +30 -21
- package/src/surfaces/cli/seasons-chart.mjs +87 -0
- package/src/surfaces/cli/spotify-command.mjs +54 -6
- package/src/surfaces/cli/taste-profile-model.mjs +78 -79
- package/src/surfaces/cli/taste-profile-view.mjs +33 -26
- package/src/surfaces/cli/terminal-art.mjs +140 -35
- package/src/surfaces/cli/tui.mjs +1066 -357
- package/src/surfaces/cli/update-command.mjs +32 -0
- package/src/surfaces/cli/web-command.mjs +53 -14
- package/src/surfaces/html/tasteprint.mjs +43 -70
- package/contracts/v1/capability-policy.schema.json +0 -572
- package/contracts/v1/profile-evidence.schema.json +0 -237
- package/contracts/v1/tool-invocation.schema.json +0 -318
- package/contracts/v1/tool-receipt.schema.json +0 -1066
- package/scripts/demo-studio.mjs +0 -58
- package/src/core/apple-data-migration.mjs +0 -50
- package/src/demo/moondog-interactive-tasteprint-demo.mjs +0 -293
- package/src/demo/moondog-tasteprint-demo.mjs +0 -631
- package/src/integrations/spotify/index.mjs +0 -80
- package/src/surfaces/web/showcase.mjs +0 -272
- package/src/surfaces/web/studio-page.mjs +0 -4148
- package/src/surfaces/web/studio.mjs +0 -2288
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Español neutro, tuteo. Keys match messages/en.mjs; a missing key falls back to English.
|
|
2
|
+
export default {
|
|
3
|
+
"discovery.reason.listenbrainz": ({ adjacent, seed, release }) => `Los datos de escucha de ListenBrainz relacionan a ${adjacent} con ${seed}; del álbum "${release}".`,
|
|
4
|
+
"discovery.reason.appleMusic": ({ queries, release, genre }) => `${queries ? `Coincidencia del catálogo de Apple Music para ${queries}` : "Candidato del catálogo de Apple Music"}; del álbum "${release}"${genre ? `, género en el catálogo: ${genre}` : ""}.`,
|
|
5
|
+
"discovery.reason.external": ({ release }) => `Del catálogo externo consultado, en "${release}".`,
|
|
6
|
+
"discovery.order": ({ path }) => `Escúchalas en este orden: ${path}.`,
|
|
7
|
+
"discovery.unavailable": "No pude conectar con los servicios de descubrimiento musical, así que esta petición no dio recomendaciones. Vuelve a enviarla para intentarlo de nuevo.",
|
|
8
|
+
|
|
9
|
+
"citations.heading": "Fuentes musicales públicas (aparte de tu historial de escucha personal):",
|
|
10
|
+
"citations.item": ({ label, url, storefront, date }) => `- [${label}](<${url}>) - tienda ${storefront}, consultada el ${date}.`,
|
|
11
|
+
"citations.scope": "Alcance: estas páginas públicas del catálogo no demuestran tus gustos personales, tu historial completo ni la disponibilidad en otras plataformas.",
|
|
12
|
+
"web.sources.heading": ({ providers }) => `Fuentes web públicas (${providers})`,
|
|
13
|
+
"web.sources.headingUnnamed": "Fuentes web públicas",
|
|
14
|
+
"web.sources.published": ({ date }) => `fecha de la fuente: ${date}`,
|
|
15
|
+
"web.sources.retrieved": ({ date }) => `consultado: ${date}`,
|
|
16
|
+
|
|
17
|
+
"external.neighbors": ({ seed }) => seed ? `oyentes afines a ${seed} en ListenBrainz` : "oyentes afines en ListenBrainz",
|
|
18
|
+
"external.listenbrainz": ({ neighbor, date }) => `${neighbor} (identidad de Wikidata, CC0, consultado el ${date}; esto no es similitud de sonido)`,
|
|
19
|
+
"external.appleMusic": ({ date }) => `coincidencias de título en Apple Music US (consultado el ${date})`,
|
|
20
|
+
"external.limit": "Solo se excluye lo que coincide en título y artista con tu biblioteca importada, así que no significa que nunca las hayas escuchado. Son sugerencias para escuchar.",
|
|
21
|
+
"external.from": ({ parts, limit }) => `A partir de ${parts.join(" y ")}. ${limit}`,
|
|
22
|
+
|
|
23
|
+
"failure.deviceList": ({ noMatch, names, code }) => `El nombre del dispositivo ${noMatch ? "no coincide con ninguno" : "coincide con varios dispositivos"}. Spotify muestra ahora: ${names}. Di "ponla en" seguido del nombre que aparece; la canción elegida se conserva. No se envió ninguna petición de reproducción. (${code})`,
|
|
24
|
+
"failure.networkRead": ({ notSent, code }) => `Un error de red impidió leer el estado de los dispositivos o de la reproducción de Spotify; la preparación se detuvo.${notSent ? " No se envió la petición de reproducción." : ""} Revisa la conexión con Spotify y vuelve a intentarlo. (${code})`,
|
|
25
|
+
"failure.readiness.spotify_device_selection_required": "La canción elegida se conserva, pero falta decidir el dispositivo. Di cuál quieres usar; no se usará el anterior en su lugar.",
|
|
26
|
+
"failure.readiness.spotify_device_not_found": "Spotify no ve el dispositivo elegido. Abre Spotify en él y vuelve a pedir la canción; no se usó otro dispositivo en su lugar.",
|
|
27
|
+
"failure.readiness.spotify_device_ambiguous": "Puede haber varios dispositivos de Spotify disponibles. Di el nombre del que quieres usar.",
|
|
28
|
+
"failure.readiness.spotify_device_restricted": "El dispositivo elegido no confirma que se pueda controlar desde la API web de Spotify. Elige otro dispositivo disponible.",
|
|
29
|
+
"failure.readiness.spotify_device_changed": "Se activó otro dispositivo de Spotify. Elige el dispositivo que quieres; la reproducción no se movió automáticamente.",
|
|
30
|
+
"failure.readiness.spotify_device_state_unconfirmed": "El estado de los dispositivos o de la reproducción de Spotify está incompleto o no cuadra. Revisa el dispositivo actual en Spotify antes de volver a intentarlo.",
|
|
31
|
+
"failure.readiness.spotify_device_not_ready": "El dispositivo no estuvo listo dentro del tiempo de espera. Abre Spotify en él y vuelve a pedir la misma canción.",
|
|
32
|
+
"failure.readiness.spotify_playback_restricted": "Ahora mismo Spotify no permite reanudar la reproducción. Revisa el dispositivo.",
|
|
33
|
+
"failure.songNotSent": " No se envió la petición de reproducción.",
|
|
34
|
+
"failure.preparationStopped": ({ evidence }) => `Las comprobaciones del dispositivo no terminaron (${evidence}); no se envió ninguna petición de reproducción. Revisa el estado del dispositivo en Spotify antes de volver a intentarlo.`,
|
|
35
|
+
"failure.queueRequestRequired": "No se añadió ninguna canción: no pude relacionar esta respuesta con una petición para la cola. Para seguir, pide de forma explícita añadir música a la cola.",
|
|
36
|
+
"failure.notSent": ({ code }) => `No envié nada a Spotify: no pude relacionarlo con las canciones que encontré (${code}). Vuelve a pedirlo con el nombre de la canción o del artista y la busco de nuevo.`,
|
|
37
|
+
"failure.avoided": "No envié nada a Spotify: me pediste dejar fuera a ese artista o esa canción. Dime cuando quieras cambiarlo.",
|
|
38
|
+
"failure.outcome.lookup": "La búsqueda en Spotify no terminó",
|
|
39
|
+
"failure.outcome.unknown": "No se sabe con certeza el resultado de la acción en Spotify",
|
|
40
|
+
"failure.outcome.unconfirmed": "Spotify no confirmó la acción de reproducción",
|
|
41
|
+
"failure.reason": ({ reason }) => `Spotify indicó: ${reason}.`,
|
|
42
|
+
"failure.reasonUnknown": "La causa concreta no está confirmada.",
|
|
43
|
+
"failure.lookup": ({ outcome, evidence, reason }) => `${outcome} (${evidence}). ${reason} No se envió ninguna acción de reproducción ni de cola.`,
|
|
44
|
+
"failure.general": ({ targets, outcome, evidence, reason, playbackNotSent, recovered }) =>
|
|
45
|
+
`${targets ? `Objetivo: ${targets}.\n` : ""}${outcome} (${evidence}). ${reason}${playbackNotSent ? " No se envió la petición de reproducción." : ""} ${recovered ? "Terminó un intento acotado de recuperar el dispositivo; no se volvió a intentar." : "La acción no se volvió a intentar."} Consulta el estado de la reproducción y los dispositivos disponibles para saber más.`,
|
|
46
|
+
|
|
47
|
+
"queue.unverified": ({ one }) => `Spotify ${one ? "la aceptó" : "las aceptó"}, pero no pude leer tu cola para comprobarlo.`,
|
|
48
|
+
"queue.confirmedPlaying": ({ one }) => one ? "Confirmado: está sonando en Spotify." : "Confirmado en Spotify: la primera está sonando y el resto están en tu cola.",
|
|
49
|
+
"queue.confirmed": ({ count }) => count === 1 ? "Confirmado en tu cola de Spotify." : `Confirmadas en tu cola de Spotify: las ${count}.`,
|
|
50
|
+
"queue.partlyVisible": ({ accepted, confirmed, truncated }) => `Spotify aceptó ${accepted}; ahora mismo se ven ${confirmed} en tu cola${truncated ? " (Spotify solo muestra parte de una cola larga)" : ""}.`,
|
|
51
|
+
"queue.noPlayback": "Spotify no tiene ninguna canción sonando que sirva de punto de partida; no se añadió nada.",
|
|
52
|
+
"queue.noCandidates": "Después de filtrar no quedó ninguna candidata; no se añadió nada.",
|
|
53
|
+
"queue.requested": ({ requested, accepted, shortfall }) => `Pediste ${requested}; Spotify aceptó ${accepted}${shortfall ? `, faltan ${shortfall}` : ""}.`,
|
|
54
|
+
"queue.similarSeed": ({ artist }) => `Artistas afines a ${artist} según otros oyentes:`,
|
|
55
|
+
"queue.cancelled": "Dejé de añadir canciones tras la cancelación; las que ya se aceptaron siguen en la cola.",
|
|
56
|
+
"queue.stopped": ({ count, title, artist }) => `Añadí ${count} a la cola de Spotify y me detuve en "${title}" - ${artist}.`,
|
|
57
|
+
"queue.queued": ({ count }) => `Añadí ${count} a la cola de Spotify:`,
|
|
58
|
+
"queue.queuedSome": ({ count, unmatched }) => `Añadí ${count} de ${count + unmatched} a la cola de Spotify:`,
|
|
59
|
+
"queue.outcomeUnknown": "Spotify no confirmó si se añadió la canción en la que me detuve. Revisa la cola antes de volver a intentarlo; no la reenvié.",
|
|
60
|
+
"queue.started": ({ title, device, more }) => `No sonaba nada, así que puse "${title}"${device ? ` en ${device}` : ""}${more ? " y dejé el resto en la cola" : ""}.`,
|
|
61
|
+
"queue.unmatchedHeading": "No encontradas en Spotify:",
|
|
62
|
+
"queue.skippedDuplicates": ({ count }) => `Omití ${count} canciones repetidas.`,
|
|
63
|
+
"queue.skippedUncertain": ({ count }) => `Omití ${count} canciones cuyo resultado anterior en la cola no estaba claro, para no repetirlas; revisa la cola de Spotify.`,
|
|
64
|
+
"queue.skippedAvoided": ({ count }) => `Omití ${count} canciones que marcaste para evitar.`,
|
|
65
|
+
"plan.avoidedLeftOut": ({ titles }) => `Dejé fuera lo que me pediste evitar: ${titles}.`,
|
|
66
|
+
"queue.skippedKnown": ({ count }) => `Omití ${count} canciones que ya aparecen en tu historial, como pediste.`,
|
|
67
|
+
"queue.mix": ({ familiar = 0, returning = 0, heard = 0, known_artist: knownArtist = 0, new: fresh = 0 }) =>
|
|
68
|
+
`Según tu historial: ${[familiar && `${familiar} que conoces bien`, returning && `${returning} ${returning === 1 ? "que vuelve" : "que vuelven"} después de un tiempo`, heard && `${heard} que has oído una o dos veces`, knownArtist && `${knownArtist} ${knownArtist === 1 ? "nueva de un artista" : "nuevas de artistas"} que conoces`, fresh && `${fresh} ${fresh === 1 ? "nueva" : "nuevas"} para ti`].filter(Boolean).join(", ")}.`,
|
|
69
|
+
"queue.observationTruncated": "La comprobación de repetidas solo cubre la parte de la cola que muestra Spotify; lo que no se ve podría repetir alguna.",
|
|
70
|
+
"queue.notAddedHeading": "Sin añadir:",
|
|
71
|
+
"queue.earlierReceipt": "Este es el resultado de la cola anterior; esta aclaración no volvió a añadir las canciones.",
|
|
72
|
+
|
|
73
|
+
"playlist.partialUnknown": ({ name }) => `Spotify creó la playlist privada "${name}", pero no confirmó que se añadieran las canciones. Revísala antes de decidir si lo intentas de nuevo.`,
|
|
74
|
+
"playlist.partialEmpty": ({ name }) => `Spotify creó la playlist privada "${name}", pero no añadió las canciones. La playlist vacía ya existe; revísala antes de decidir si lo intentas de nuevo.`,
|
|
75
|
+
"playlist.saved": ({ name, count }) => `Guardada como la playlist privada de Spotify "${name}" (${count} canciones).`,
|
|
76
|
+
|
|
77
|
+
"action.playback.resume": "la petición de reproducción",
|
|
78
|
+
"action.playback.pause": "la pausa",
|
|
79
|
+
"action.playback.next": "el salto a la siguiente",
|
|
80
|
+
"action.playback.previous": "la vuelta a la anterior",
|
|
81
|
+
"action.playback.volume.set": "el cambio de volumen",
|
|
82
|
+
"action.playback.seek": "el cambio de posición",
|
|
83
|
+
"action.playback.shuffle.set": "el ajuste de aleatorio",
|
|
84
|
+
"action.playback.repeat.set": "el ajuste de repetición",
|
|
85
|
+
"action.playback.transfer": "el cambio de dispositivo",
|
|
86
|
+
"action.playback.queue.add": "la adición a la cola",
|
|
87
|
+
"action.library.remove": "la eliminación de tu biblioteca",
|
|
88
|
+
"action.library.save": "el guardado en tu biblioteca",
|
|
89
|
+
"action.playlist.write": "la creación de la playlist",
|
|
90
|
+
"action.playlist.edit": "el cambio en la playlist",
|
|
91
|
+
"action.playlist.rename": "el cambio de nombre de la playlist",
|
|
92
|
+
"action.playlist.unfollow": "la eliminación de la playlist de tu biblioteca",
|
|
93
|
+
"action.playlist.remove_track": "la eliminación de una canción de la playlist",
|
|
94
|
+
"action.other": "el cambio pedido",
|
|
95
|
+
"write.unknown": ({ action, target }) => `Spotify no confirmó ${action}${target ? ` para "${target}"` : ""}. Revisa su estado antes de decidir si lo intentas de nuevo.`,
|
|
96
|
+
"write.unfollowed": ({ name }) => `Quité "${name}" de tu biblioteca de Spotify (dejaste de seguirla). La playlist puede seguir existiendo para otros oyentes; no se borró.`,
|
|
97
|
+
"write.renamed": ({ name }) => `Spotify aceptó el nuevo nombre de la playlist: "${name}".`,
|
|
98
|
+
"write.trackRemoved": ({ name }) => `Spotify aceptó quitar una canción de "${name}".`,
|
|
99
|
+
"write.accepted": ({ action, count, targets }) => `Spotify aceptó ${action}${count === null ? "" : ` (${count} canciones)`}${targets ? `: ${targets}` : ""}.`,
|
|
100
|
+
|
|
101
|
+
"plan.heading.private_library": ({ count }) => `Plan de ${count} canciones de tu biblioteca:`,
|
|
102
|
+
"plan.heading.private_history": ({ count }) => `Plan de ${count} canciones de tu historial para volver a escuchar:`,
|
|
103
|
+
"plan.heading.external_catalog": ({ count }) => `${count} canciones:`,
|
|
104
|
+
"plan.heading.mixed": ({ count }) => `${count} canciones:`,
|
|
105
|
+
"plan.heading.timeCapsule": ({ count }) => `Máquina del tiempo de ${count} paradas por tus años de escucha:`,
|
|
106
|
+
"plan.heading.historicalReturn": ({ count }) => `${count} canciones de tu historial que volvieron tras una larga pausa:`,
|
|
107
|
+
"plan.heading.backToBack": ({ count }) => `${count} canciones de tu historial que escuchaste seguidas:`,
|
|
108
|
+
"plan.externalTrack": ({ line, release }) => `${line}, del álbum "${release}"`,
|
|
109
|
+
"plan.rationale": ({ text }) => ` Por qué está: ${text}`,
|
|
110
|
+
"plan.ordering": ({ text }) => `Por qué este orden: ${text}`,
|
|
111
|
+
"plan.notSaved": "Todavía no se ha guardado ni añadido nada a la cola.",
|
|
112
|
+
"plan.previewing": "Los avances de 30 segundos suenan en tu reproductor; las canciones completas están en Apple Music.",
|
|
113
|
+
"plan.pending": "Límite: este plan solo está pendiente en esta sesión, no se ha escrito en Spotify y no tiene efectos externos.",
|
|
114
|
+
"plan.backToBackBoundary": "Cómo leerlo: que dos reproducciones guardadas vayan seguidas no demuestra que usaras la repetición, que la volvieras a poner a propósito ni que te guste.",
|
|
115
|
+
"plan.validationScope": "Qué se comprobó: el planificador local verifica la identidad de cada canción, que pertenezca a las candidatas, la cantidad y el orden; los motivos y el encaje con el momento siguen siendo juicios del modelo a partir de los metadatos disponibles.",
|
|
116
|
+
"plan.unvalidated": "No pude validar este plan, así que no te daré una lista que no se haya comprobado contra candidatas fiables. Afina o amplía la búsqueda y vuelve a intentarlo.",
|
|
117
|
+
|
|
118
|
+
"edit.previewHeading": ({ name, before, after }) => `Vista previa de cambios en la playlist privada de Spotify "${name}" (${before} -> ${after} canciones):`,
|
|
119
|
+
"edit.status.added": "añadir",
|
|
120
|
+
"edit.status.moved": "mover",
|
|
121
|
+
"edit.status.retained": "mantener",
|
|
122
|
+
"edit.removeHeading": "Quitar:",
|
|
123
|
+
"edit.summary": ({ added, removed, moved, retained }) => `Resumen: ${added} añadidas, ${removed} quitadas, ${moved} movidas y ${retained} sin cambios.`,
|
|
124
|
+
"edit.boundary": "Límite: Spotify no ha cambiado. Confírmalo de forma explícita en tu próximo mensaje para que Moondog escriba exactamente esta versión.",
|
|
125
|
+
"edit.updated": ({ name, before, after }) => `Actualicé la playlist privada de Spotify "${name}" con la vista previa que confirmaste${before === null ? ` (ahora tiene ${after} canciones)` : ` (${before} -> ${after} canciones)`}.`,
|
|
126
|
+
|
|
127
|
+
"selection.note": ({ playlist, track }) => `\n\nSeleccionado para próximos cambios: playlist ${playlist}; canción ${track}.`,
|
|
128
|
+
"memory.spotifyExcluded": "\n\nLos resultados de Spotify no se guardan en la memoria general; solo se podían guardar citas tuyas verificables, y lo demás no se guardó.",
|
|
129
|
+
"memory.notSaved": "\n\nLa respuesta terminó, pero no se pudo guardar la memoria.",
|
|
130
|
+
"choice.like": ({ title, artist }) => { const name = title ? `"${title}" de ${artist}` : artist; return `\n\nGuardado: te gusta ${name}. Dímelo cuando quieras cambiarlo.`; },
|
|
131
|
+
"choice.avoid": ({ title, artist }) => { const name = title ? `"${title}" de ${artist}` : artist; return `\n\nGuardado: dejaré ${name} fuera de lo que pongo y te sugiero. Dímelo cuando quieras cambiarlo.`; },
|
|
132
|
+
"choice.retract": ({ title, artist }) => { const name = title ? `"${title}" de ${artist}` : artist; return `\n\nDeshecho: tu elección anterior sobre ${name}.`; },
|
|
133
|
+
"turn.cancelled": "Cancelé el resto.",
|
|
134
|
+
"turn.interrupted": "La respuesta se interrumpió. Abajo están los resultados registrados en Spotify; no se repitió ninguna acción.",
|
|
135
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Français. Keys match messages/en.mjs; a missing key falls back to English.
|
|
2
|
+
export default {
|
|
3
|
+
"discovery.reason.listenbrainz": ({ adjacent, seed, release }) => `Les données d'écoute de ListenBrainz relient ${adjacent} à ${seed} ; extrait de « ${release} ».`,
|
|
4
|
+
"discovery.reason.appleMusic": ({ queries, release, genre }) => `Catalogue Apple Music : ${queries ? `correspond à ${queries}` : "candidat"} ; extrait de « ${release} »${genre ? `, genre du catalogue : ${genre}` : ""}.`,
|
|
5
|
+
"discovery.reason.external": ({ release }) => `Tiré du catalogue externe consulté, sur « ${release} ».`,
|
|
6
|
+
"discovery.order": ({ path }) => `À écouter dans cet ordre : ${path}.`,
|
|
7
|
+
"discovery.unavailable": "Je n'ai pas pu joindre les services de découverte musicale, donc cette demande n'a produit aucune recommandation. Renvoyez la demande pour réessayer.",
|
|
8
|
+
|
|
9
|
+
"citations.heading": "Sources musicales publiques (distinctes de vos données d'écoute personnelles) :",
|
|
10
|
+
"citations.item": ({ label, url, storefront, date }) => `- [${label}](<${url}>) - boutique ${storefront}, consultée le ${date}.`,
|
|
11
|
+
"citations.scope": "Portée : ces pages de catalogue publiques ne prouvent ni une préférence personnelle, ni un historique d'écoute complet, ni la disponibilité sur d'autres plateformes.",
|
|
12
|
+
"web.sources.heading": ({ providers }) => `Sources web publiques (${providers})`,
|
|
13
|
+
"web.sources.headingUnnamed": "Sources web publiques",
|
|
14
|
+
"web.sources.published": ({ date }) => `date de la source : ${date}`,
|
|
15
|
+
"web.sources.retrieved": ({ date }) => `consulté le ${date}`,
|
|
16
|
+
|
|
17
|
+
"external.neighbors": ({ seed }) => seed ? `voisins d'écoute ListenBrainz de ${seed}` : "voisins d'écoute ListenBrainz",
|
|
18
|
+
"external.listenbrainz": ({ neighbor, date }) => `${neighbor} (identité Wikidata, CC0, consultée le ${date} ; ce n'est pas une similarité audio)`,
|
|
19
|
+
"external.appleMusic": ({ date }) => `correspondances de titres Apple Music US (consultées le ${date})`,
|
|
20
|
+
"external.limit": "Seuls les titres déjà présents dans votre bibliothèque importée, avec le même artiste, sont exclus : cela ne veut pas dire que vous ne les avez jamais entendus. Ce sont des suggestions d'écoute.",
|
|
21
|
+
"external.from": ({ parts, limit }) => `D'après ${parts.join(", et ")}. ${limit}`,
|
|
22
|
+
|
|
23
|
+
"failure.deviceList": ({ noMatch, names, code }) => `Le nom d'appareil ${noMatch ? "ne correspond à aucun appareil" : "correspond à plusieurs appareils"}. Spotify affiche actuellement : ${names}. Dites « joue-le sur » suivi du nom affiché ; le morceau choisi est conservé. Aucune demande de lecture n'a été envoyée. (${code})`,
|
|
24
|
+
"failure.networkRead": ({ notSent, code }) => `Une erreur réseau a empêché de lire l'état des appareils et de la lecture Spotify ; la préparation s'est arrêtée.${notSent ? " La demande de lecture n'a pas été envoyée." : ""} Vérifiez la connexion à Spotify et réessayez. (${code})`,
|
|
25
|
+
"failure.readiness.spotify_device_selection_required": "Le morceau choisi est conservé, mais l'appareil cible n'est pas déterminé. Indiquez l'appareil voulu ; l'appareil précédent ne sera pas utilisé à sa place.",
|
|
26
|
+
"failure.readiness.spotify_device_not_found": "Spotify ne voit pas l'appareil cible. Ouvrez Spotify dessus, puis redemandez la lecture ; aucun autre appareil n'a été utilisé à sa place.",
|
|
27
|
+
"failure.readiness.spotify_device_ambiguous": "Plusieurs appareils Spotify sont peut-être disponibles. Précisez le nom de l'appareil voulu.",
|
|
28
|
+
"failure.readiness.spotify_device_restricted": "L'appareil cible ne confirme pas le contrôle par l'API Web de Spotify. Choisissez un autre appareil disponible.",
|
|
29
|
+
"failure.readiness.spotify_device_changed": "Un autre appareil Spotify est devenu actif. Choisissez explicitement l'appareil voulu ; la lecture n'a pas été déplacée automatiquement.",
|
|
30
|
+
"failure.readiness.spotify_device_state_unconfirmed": "L'état des appareils et de la lecture Spotify est incomplet ou incohérent. Vérifiez l'appareil actuel dans Spotify avant de réessayer.",
|
|
31
|
+
"failure.readiness.spotify_device_not_ready": "L'appareil cible n'a pas été prêt dans le délai prévu. Ouvrez Spotify dessus, puis redemandez le même morceau.",
|
|
32
|
+
"failure.readiness.spotify_playback_restricted": "Spotify n'autorise pas la reprise de la lecture pour le moment. Vérifiez l'appareil cible.",
|
|
33
|
+
"failure.songNotSent": " La demande de lecture n'a pas été envoyée.",
|
|
34
|
+
"failure.preparationStopped": ({ evidence }) => `Les vérifications de l'appareil de lecture n'ont pas abouti (${evidence}) ; aucune demande de lecture n'a été envoyée. Vérifiez l'état de l'appareil Spotify avant de réessayer.`,
|
|
35
|
+
"failure.queueRequestRequired": "Aucun morceau n'a été ajouté à la file d'attente : je n'ai pas pu relier cette réponse à une demande d'ajout. Il faut une demande explicite d'ajouter de la musique à la file d'attente pour continuer.",
|
|
36
|
+
"failure.notSent": ({ code }) => `Rien n'a été envoyé à Spotify : je n'ai pas pu relier cela aux morceaux trouvés (${code}). Redemandez avec le titre ou l'artiste, et je chercherai à nouveau.`,
|
|
37
|
+
"failure.avoided": "Rien n'a été envoyé à Spotify : vous m'avez demandé d'écarter cet artiste ou ce morceau. Dites-le-moi quand vous voulez pour changer cela.",
|
|
38
|
+
"failure.outcome.lookup": "La recherche Spotify n'a pas abouti",
|
|
39
|
+
"failure.outcome.unknown": "Le résultat de l'action Spotify est incertain",
|
|
40
|
+
"failure.outcome.unconfirmed": "L'action de lecture Spotify n'a pas été confirmée",
|
|
41
|
+
"failure.reason": ({ reason }) => `Motif indiqué par Spotify : ${reason}.`,
|
|
42
|
+
"failure.reasonUnknown": "La cause précise n'est pas confirmée.",
|
|
43
|
+
"failure.lookup": ({ outcome, evidence, reason }) => `${outcome} (${evidence}). ${reason} Aucune lecture ni aucun ajout à la file d'attente n'a été envoyé.`,
|
|
44
|
+
"failure.general": ({ targets, outcome, evidence, reason, playbackNotSent, recovered }) =>
|
|
45
|
+
`${targets ? `Cible : ${targets}.\n` : ""}${outcome} (${evidence}). ${reason}${playbackNotSent ? " La demande de lecture n'a pas été envoyée." : ""} ${recovered ? "Une récupération limitée de l'appareil s'est terminée ; aucune autre tentative n'a été faite." : "L'action n'a pas été retentée."} Lisez l'état de la lecture et les appareils disponibles pour aller plus loin.`,
|
|
46
|
+
|
|
47
|
+
"queue.unverified": ({ one }) => `Spotify ${one ? "l'a accepté" : "les a acceptés"}, mais je n'ai pas pu lire votre file d'attente pour vérifier.`,
|
|
48
|
+
"queue.confirmedPlaying": ({ one }) => one ? "Lecture confirmée sur Spotify." : "Confirmé sur Spotify : le premier est en lecture et les autres sont dans votre file d'attente.",
|
|
49
|
+
"queue.confirmed": ({ count }) => count === 1 ? "Confirmé dans votre file d'attente Spotify." : `Confirmé dans votre file d'attente Spotify : les ${count}.`,
|
|
50
|
+
"queue.partlyVisible": ({ accepted, confirmed, truncated }) => `Spotify en a accepté ${accepted} ; ${confirmed} apparaissent dans votre file d'attente pour l'instant${truncated ? " (Spotify n'affiche qu'une partie d'une longue file)" : ""}.`,
|
|
51
|
+
"queue.noPlayback": "Spotify n'a aucun morceau en cours à prendre comme point de départ ; rien n'a été ajouté.",
|
|
52
|
+
"queue.noCandidates": "Aucun candidat ne restait après le filtrage ; rien n'a été ajouté.",
|
|
53
|
+
"queue.requested": ({ requested, accepted, shortfall }) => `${requested} demandés ; Spotify en a accepté ${accepted}${shortfall ? `, il en manque ${shortfall}` : ""}.`,
|
|
54
|
+
"queue.similarSeed": ({ artist }) => `Artistes proches de ${artist}, d'après les auditeurs :`,
|
|
55
|
+
"queue.cancelled": "Ajout arrêté après l'annulation ; les morceaux acceptés restent dans la file d'attente.",
|
|
56
|
+
"queue.stopped": ({ count, title, artist }) => `${count} ajoutés à la file d'attente Spotify, puis arrêt à « ${title} » - ${artist}.`,
|
|
57
|
+
"queue.queued": ({ count }) => `${count} ajoutés à la file d'attente Spotify :`,
|
|
58
|
+
"queue.queuedSome": ({ count, unmatched }) => `${count} sur ${count + unmatched} ajoutés à la file d'attente Spotify :`,
|
|
59
|
+
"queue.outcomeUnknown": "Spotify n'a pas confirmé si le morceau interrompu a été ajouté. Vérifiez la file d'attente avant de réessayer ; cette écriture n'a pas été renvoyée.",
|
|
60
|
+
"queue.started": ({ title, device, more }) => `Rien ne jouait, alors j'ai lancé « ${title} »${device ? ` sur ${device}` : ""}${more ? " et mis la suite dans la file" : ""}.`,
|
|
61
|
+
"queue.unmatchedHeading": "Introuvables sur Spotify :",
|
|
62
|
+
"queue.skippedDuplicates": ({ count }) => `${count} doublons ignorés.`,
|
|
63
|
+
"queue.skippedUncertain": ({ count }) => `${count} morceaux ignorés pour éviter un doublon, car leur ajout précédent est incertain ; vérifiez la file d'attente Spotify.`,
|
|
64
|
+
"queue.skippedAvoided": ({ count }) => `${count} morceaux à éviter ignorés.`,
|
|
65
|
+
"plan.avoidedLeftOut": ({ titles }) => `Laissés de côté, comme vous me l'avez demandé : ${titles}.`,
|
|
66
|
+
"queue.skippedKnown": ({ count }) => `${count} morceaux déjà présents dans votre historique ignorés, comme demandé.`,
|
|
67
|
+
"queue.mix": ({ familiar = 0, returning = 0, heard = 0, known_artist: knownArtist = 0, new: fresh = 0 }) =>
|
|
68
|
+
`D'après votre historique : ${[familiar && `${familiar} que vous connaissez bien`, returning && `${returning} ${returning === 1 ? "qui revient" : "qui reviennent"} après un moment`, heard && `${heard} ${heard === 1 ? "entendu" : "entendus"} une ou deux fois`, knownArtist && `${knownArtist} ${knownArtist === 1 ? "nouveau d'un artiste" : "nouveaux d'artistes"} que vous connaissez`, fresh && `${fresh} ${fresh === 1 ? "nouveau" : "nouveaux"} pour vous`].filter(Boolean).join(", ")}.`,
|
|
69
|
+
"queue.observationTruncated": "Le dédoublonnage ne couvre que l'extrait limité de la file que Spotify renvoie ; des entrées non visibles peuvent encore faire doublon.",
|
|
70
|
+
"queue.notAddedHeading": "Non ajoutés :",
|
|
71
|
+
"queue.earlierReceipt": "Voici le reçu de l'ajout précédent ; cette précision n'a pas ajouté les morceaux une seconde fois.",
|
|
72
|
+
|
|
73
|
+
"playlist.partialUnknown": ({ name }) => `Spotify a créé la playlist privée « ${name} », mais l'ajout de ses morceaux n'a pas été confirmé. Vérifiez-la avant de décider de réessayer.`,
|
|
74
|
+
"playlist.partialEmpty": ({ name }) => `Spotify a créé la playlist privée « ${name} », mais n'a pas ajouté ses morceaux. La playlist vide existe désormais ; vérifiez-la avant de décider de réessayer.`,
|
|
75
|
+
"playlist.saved": ({ name, count }) => `Enregistré comme playlist Spotify privée « ${name} » (${count} morceaux).`,
|
|
76
|
+
|
|
77
|
+
"action.playback.resume": "demande de lecture",
|
|
78
|
+
"action.playback.pause": "demande de pause",
|
|
79
|
+
"action.playback.next": "demande de morceau suivant",
|
|
80
|
+
"action.playback.previous": "demande de morceau précédent",
|
|
81
|
+
"action.playback.volume.set": "changement de volume",
|
|
82
|
+
"action.playback.seek": "changement de position de lecture",
|
|
83
|
+
"action.playback.shuffle.set": "réglage de la lecture aléatoire",
|
|
84
|
+
"action.playback.repeat.set": "réglage de la répétition",
|
|
85
|
+
"action.playback.transfer": "changement d'appareil",
|
|
86
|
+
"action.playback.queue.add": "ajout à la file d'attente",
|
|
87
|
+
"action.library.remove": "retrait de la bibliothèque",
|
|
88
|
+
"action.library.save": "ajout à la bibliothèque",
|
|
89
|
+
"action.playlist.write": "création de playlist",
|
|
90
|
+
"action.playlist.edit": "modification de playlist",
|
|
91
|
+
"action.playlist.rename": "renommage de playlist",
|
|
92
|
+
"action.playlist.unfollow": "retrait de la playlist de la bibliothèque",
|
|
93
|
+
"action.playlist.remove_track": "retrait d'un morceau de la playlist",
|
|
94
|
+
"action.other": "modification demandée",
|
|
95
|
+
"write.unknown": ({ action, target }) => `Spotify n'a pas confirmé l'opération « ${action} »${target ? ` pour « ${target} »` : ""}. Vérifiez son état avant de décider de réessayer.`,
|
|
96
|
+
"write.unfollowed": ({ name }) => `« ${name} » a été retirée de votre bibliothèque Spotify (vous ne la suivez plus). La playlist peut encore exister pour d'autres auditeurs ; elle n'a pas été supprimée pour tous.`,
|
|
97
|
+
"write.renamed": ({ name }) => `Spotify a accepté de renommer la playlist en « ${name} ».`,
|
|
98
|
+
"write.trackRemoved": ({ name }) => `Spotify a accepté le retrait d'un morceau de « ${name} ».`,
|
|
99
|
+
"write.accepted": ({ action, count, targets }) => `Spotify a accepté l'opération « ${action} »${count === null ? "" : ` (${count} morceaux)`}${targets ? ` : ${targets}` : ""}.`,
|
|
100
|
+
|
|
101
|
+
"plan.heading.private_library": ({ count }) => `Sélection de ${count} morceaux tirée de votre bibliothèque :`,
|
|
102
|
+
"plan.heading.private_history": ({ count }) => `${count} morceaux à réécouter, tirés de votre historique :`,
|
|
103
|
+
"plan.heading.external_catalog": ({ count }) => `${count} morceaux :`,
|
|
104
|
+
"plan.heading.mixed": ({ count }) => `${count} morceaux :`,
|
|
105
|
+
"plan.heading.timeCapsule": ({ count }) => `Machine à remonter le temps en ${count} étapes à travers vos années d'écoute :`,
|
|
106
|
+
"plan.heading.historicalReturn": ({ count }) => `${count} morceaux revenus après une longue absence :`,
|
|
107
|
+
"plan.heading.backToBack": ({ count }) => `${count} morceaux que vous avez écoutés à la suite :`,
|
|
108
|
+
"plan.externalTrack": ({ line, release }) => `${line}, extrait de « ${release} »`,
|
|
109
|
+
"plan.rationale": ({ text }) => ` Raison du choix : ${text}`,
|
|
110
|
+
"plan.ordering": ({ text }) => `Raison de l'ordre : ${text}`,
|
|
111
|
+
"plan.notSaved": "Rien n'a encore été enregistré ni ajouté à la file d'attente.",
|
|
112
|
+
"plan.previewing": "Les extraits de 30 secondes jouent dans votre lecteur ; les morceaux complets sont sur Apple Music.",
|
|
113
|
+
"plan.pending": "Limite : cette sélection n'attend une confirmation que dans la session en cours ; elle n'a pas été écrite sur Spotify et n'a aucun effet extérieur.",
|
|
114
|
+
"plan.backToBackBoundary": "Limite d'interprétation : des écoutes enregistrées à la suite ne prouvent ni le mode répétition, ni une réécoute voulue, ni un goût pour le morceau.",
|
|
115
|
+
"plan.validationScope": "Portée de la vérification : le planificateur local vérifie l'identité des morceaux, leur appartenance aux candidats, leur nombre et leur ordre ; les raisons du choix et l'adéquation à la situation restent des jugements du modèle, fondés sur les métadonnées disponibles.",
|
|
116
|
+
"plan.unvalidated": "Je n'ai pas pu vérifier cette sélection, donc je ne renverrai pas une liste de morceaux non comparée à des candidats fiables. Précisez ou élargissez la recherche, puis réessayez.",
|
|
117
|
+
|
|
118
|
+
"edit.previewHeading": ({ name, before, after }) => `Aperçu de la modification de la playlist Spotify privée « ${name} » (${before} -> ${after} morceaux) :`,
|
|
119
|
+
"edit.status.added": "ajout",
|
|
120
|
+
"edit.status.moved": "déplacé",
|
|
121
|
+
"edit.status.retained": "conservé",
|
|
122
|
+
"edit.removeHeading": "À retirer :",
|
|
123
|
+
"edit.summary": ({ added, removed, moved, retained }) => `Résumé des changements : ${added} ajoutés, ${removed} retirés, ${moved} déplacés, ${retained} conservés à leur place.`,
|
|
124
|
+
"edit.boundary": "Limite : Spotify n'a pas changé. Confirmez explicitement dans votre prochain message pour que Moondog écrive exactement cette version conservée.",
|
|
125
|
+
"edit.updated": ({ name, before, after }) => `Playlist Spotify privée « ${name} » mise à jour d'après l'aperçu confirmé${before === null ? ` (${after} morceaux maintenant)` : ` (${before} -> ${after} morceaux)`}.`,
|
|
126
|
+
|
|
127
|
+
"selection.note": ({ playlist, track }) => `\n\nSélection pour les prochaines modifications : playlist ${playlist} ; morceau ${track}.`,
|
|
128
|
+
"memory.spotifyExcluded": "\n\nLes résultats Spotify sont exclus de la mémoire générale ; seules vos propres paroles vérifiées pouvaient être retenues, et le reste n'a pas été enregistré.",
|
|
129
|
+
"memory.notSaved": "\n\nLa réponse est terminée, mais la mémoire n'a pas été enregistrée.",
|
|
130
|
+
"choice.like": ({ title, artist }) => { const name = title ? `« ${title} » de ${artist}` : artist; return `\n\nEnregistré : vous aimez ${name}. Dites-le-moi quand vous voulez pour le changer.`; },
|
|
131
|
+
"choice.avoid": ({ title, artist }) => { const name = title ? `« ${title} » de ${artist}` : artist; return `\n\nEnregistré : je laisserai ${name} de côté dans ce que je joue et propose. Dites-le-moi quand vous voulez pour le changer.`; },
|
|
132
|
+
"choice.retract": ({ title, artist }) => { const name = title ? `« ${title} » de ${artist}` : artist; return `\n\nAnnulé : votre choix précédent sur ${name}.`; },
|
|
133
|
+
"turn.cancelled": "Suite annulée.",
|
|
134
|
+
"turn.interrupted": "La réponse a été interrompue. Les résultats Spotify enregistrés figurent ci-dessous ; aucune action n'a été relancée.",
|
|
135
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Italiano. Keys match messages/en.mjs; a missing key falls back to English.
|
|
2
|
+
export default {
|
|
3
|
+
"discovery.reason.listenbrainz": ({ adjacent, seed, release }) => `I dati d'ascolto di ListenBrainz collegano ${adjacent} a ${seed}; da "${release}".`,
|
|
4
|
+
"discovery.reason.appleMusic": ({ queries, release, genre }) => `Catalogo Apple Music: ${queries ? `corrisponde a ${queries}` : "candidato"}; da "${release}"${genre ? `, genere nel catalogo: ${genre}` : ""}.`,
|
|
5
|
+
"discovery.reason.external": ({ release }) => `Dal catalogo esterno consultato, su "${release}".`,
|
|
6
|
+
"discovery.order": ({ path }) => `Ascolta in quest'ordine: ${path}.`,
|
|
7
|
+
"discovery.unavailable": "Non sono riuscito a raggiungere i servizi di scoperta musicale, quindi questa richiesta non ha prodotto consigli. Invia di nuovo la richiesta per riprovare.",
|
|
8
|
+
|
|
9
|
+
"citations.heading": "Fonti musicali pubbliche (separate dai tuoi dati d'ascolto personali):",
|
|
10
|
+
"citations.item": ({ label, url, storefront, date }) => `- [${label}](<${url}>) - store ${storefront}, consultato il ${date}.`,
|
|
11
|
+
"citations.scope": "Ambito: queste pagine di catalogo pubbliche non dimostrano preferenze personali, una cronologia d'ascolto completa né la disponibilità su altre piattaforme.",
|
|
12
|
+
"web.sources.heading": ({ providers }) => `Fonti web pubbliche (${providers})`,
|
|
13
|
+
"web.sources.headingUnnamed": "Fonti web pubbliche",
|
|
14
|
+
"web.sources.published": ({ date }) => `data della fonte: ${date}`,
|
|
15
|
+
"web.sources.retrieved": ({ date }) => `consultato: ${date}`,
|
|
16
|
+
|
|
17
|
+
"external.neighbors": ({ seed }) => seed ? `vicini d'ascolto ListenBrainz di ${seed}` : "vicini d'ascolto ListenBrainz",
|
|
18
|
+
"external.listenbrainz": ({ neighbor, date }) => `${neighbor} (identità Wikidata, CC0, consultata il ${date}; non è una somiglianza sonora)`,
|
|
19
|
+
"external.appleMusic": ({ date }) => `corrispondenze di titoli su Apple Music US (consultate il ${date})`,
|
|
20
|
+
"external.limit": "È escluso solo ciò che compare nella tua libreria importata con lo stesso titolo e artista, quindi non significa che tu non li abbia mai sentiti. Sono suggerimenti d'ascolto.",
|
|
21
|
+
"external.from": ({ parts, limit }) => `Da ${parts.join(" e ")}. ${limit}`,
|
|
22
|
+
|
|
23
|
+
"failure.deviceList": ({ noMatch, names, code }) => `Il nome del dispositivo ${noMatch ? "non corrisponde a nessun dispositivo" : "corrisponde a più dispositivi"}. Spotify al momento mostra: ${names}. Di' "riproducilo su" seguito dal nome mostrato; il brano scelto resta selezionato. Non è stata inviata alcuna richiesta di riproduzione. (${code})`,
|
|
24
|
+
"failure.networkRead": ({ notSent, code }) => `Un errore di rete ha impedito di leggere lo stato di dispositivi e riproduzione di Spotify; la preparazione si è fermata.${notSent ? " La richiesta di riproduzione non è stata inviata." : ""} Controlla la connessione a Spotify e riprova. (${code})`,
|
|
25
|
+
"failure.readiness.spotify_device_selection_required": "Il brano scelto resta selezionato, ma il dispositivo di destinazione non è stabilito. Indica il dispositivo che vuoi; quello precedente non verrà usato al suo posto.",
|
|
26
|
+
"failure.readiness.spotify_device_not_found": "Spotify non vede il dispositivo di destinazione. Apri Spotify su quel dispositivo, poi richiedi di nuovo la riproduzione; nessun altro dispositivo è stato usato al suo posto.",
|
|
27
|
+
"failure.readiness.spotify_device_ambiguous": "Potrebbero essere disponibili più dispositivi Spotify. Indica il nome del dispositivo che vuoi.",
|
|
28
|
+
"failure.readiness.spotify_device_restricted": "Il dispositivo di destinazione non conferma il controllo tramite la Web API di Spotify. Scegli un altro dispositivo disponibile.",
|
|
29
|
+
"failure.readiness.spotify_device_changed": "Un altro dispositivo Spotify è diventato attivo. Scegli esplicitamente il dispositivo che vuoi; la riproduzione non è stata spostata in automatico.",
|
|
30
|
+
"failure.readiness.spotify_device_state_unconfirmed": "Lo stato di dispositivi e riproduzione di Spotify è incompleto o incoerente. Controlla il dispositivo attuale in Spotify prima di riprovare.",
|
|
31
|
+
"failure.readiness.spotify_device_not_ready": "Il dispositivo di destinazione non è stato pronto entro l'attesa prevista. Apri Spotify su quel dispositivo, poi richiedi di nuovo lo stesso brano.",
|
|
32
|
+
"failure.readiness.spotify_playback_restricted": "Al momento Spotify non permette di riprendere la riproduzione. Controlla il dispositivo di destinazione.",
|
|
33
|
+
"failure.songNotSent": " La richiesta di riproduzione non è stata inviata.",
|
|
34
|
+
"failure.preparationStopped": ({ evidence }) => `I controlli del dispositivo di riproduzione non sono stati completati (${evidence}); non è stata inviata alcuna richiesta di riproduzione. Controlla lo stato del dispositivo Spotify prima di riprovare.`,
|
|
35
|
+
"failure.queueRequestRequired": "Nessun brano è stato messo in coda: non sono riuscito a collegare questa risposta a una richiesta di coda. Per continuare serve una richiesta esplicita di aggiungere musica alla coda di riproduzione.",
|
|
36
|
+
"failure.notSent": ({ code }) => `Non ho inviato nulla a Spotify: non sono riuscito a collegarlo ai brani trovati (${code}). Chiedimelo di nuovo con il titolo o l'artista e cercherò ancora.`,
|
|
37
|
+
"failure.avoided": "Non ho inviato nulla a Spotify: mi hai chiesto di lasciare fuori questo artista o questo brano. Dimmelo quando vuoi per cambiarlo.",
|
|
38
|
+
"failure.outcome.lookup": "La ricerca su Spotify non è stata completata",
|
|
39
|
+
"failure.outcome.unknown": "L'esito dell'azione su Spotify è incerto",
|
|
40
|
+
"failure.outcome.unconfirmed": "L'azione di riproduzione su Spotify non è stata confermata",
|
|
41
|
+
"failure.reason": ({ reason }) => `Spotify ha segnalato: ${reason}.`,
|
|
42
|
+
"failure.reasonUnknown": "La causa precisa non è confermata.",
|
|
43
|
+
"failure.lookup": ({ outcome, evidence, reason }) => `${outcome} (${evidence}). ${reason} Non è stata inviata alcuna riproduzione né aggiunta alla coda.`,
|
|
44
|
+
"failure.general": ({ targets, outcome, evidence, reason, playbackNotSent, recovered }) =>
|
|
45
|
+
`${targets ? `Destinazione: ${targets}.\n` : ""}${outcome} (${evidence}). ${reason}${playbackNotSent ? " La richiesta di riproduzione non è stata inviata." : ""} ${recovered ? "Un recupero limitato del dispositivo si è concluso; non ci sono stati altri tentativi." : "L'azione non è stata ritentata."} Leggi lo stato della riproduzione e i dispositivi disponibili per approfondire.`,
|
|
46
|
+
|
|
47
|
+
"queue.unverified": ({ one }) => `Spotify ${one ? "l'ha accettato" : "li ha accettati"}, ma non sono riuscito a leggere la tua coda per controllare.`,
|
|
48
|
+
"queue.confirmedPlaying": ({ one }) => one ? "Riproduzione confermata su Spotify." : "Confermato su Spotify: il primo è in riproduzione e gli altri sono nella tua coda.",
|
|
49
|
+
"queue.confirmed": ({ count }) => count === 1 ? "Confermato nella tua coda di Spotify." : `Confermati nella tua coda di Spotify: tutti e ${count}.`,
|
|
50
|
+
"queue.partlyVisible": ({ accepted, confirmed, truncated }) => `Spotify ne ha accettati ${accepted}; ${confirmed} sono visibili nella tua coda in questo momento${truncated ? " (Spotify mostra solo una parte delle code lunghe)" : ""}.`,
|
|
51
|
+
"queue.noPlayback": "Su Spotify non c'è un brano in corso da usare come punto di partenza; non è stato messo in coda nulla.",
|
|
52
|
+
"queue.noCandidates": "Dopo il filtro non è rimasto alcun candidato; non è stato messo in coda nulla.",
|
|
53
|
+
"queue.requested": ({ requested, accepted, shortfall }) => `Richiesti ${requested}; Spotify ne ha accettati ${accepted}${shortfall ? `, ne mancano ${shortfall}` : ""}.`,
|
|
54
|
+
"queue.similarSeed": ({ artist }) => `Artisti simili a ${artist}, secondo gli ascoltatori:`,
|
|
55
|
+
"queue.cancelled": "Ho smesso di aggiungere brani dopo l'annullamento; quelli accettati restano in coda.",
|
|
56
|
+
"queue.stopped": ({ count, title, artist }) => `Messi ${count} in coda su Spotify, poi mi sono fermato a "${title}" - ${artist}.`,
|
|
57
|
+
"queue.queued": ({ count }) => `Messi ${count} in coda su Spotify:`,
|
|
58
|
+
"queue.queuedSome": ({ count, unmatched }) => `Messi in coda su Spotify ${count} su ${count + unmatched}:`,
|
|
59
|
+
"queue.outcomeUnknown": "Spotify non ha confermato se il brano su cui mi sono fermato sia stato aggiunto. Controlla la coda prima di riprovare; questa scrittura non è stata ripetuta.",
|
|
60
|
+
"queue.started": ({ title, device, more }) => `Non suonava niente, quindi ho avviato "${title}"${device ? ` su ${device}` : ""}${more ? " e messo in fila il resto" : ""}.`,
|
|
61
|
+
"queue.unmatchedHeading": "Non trovati su Spotify:",
|
|
62
|
+
"queue.skippedDuplicates": ({ count }) => `Saltati ${count} brani duplicati.`,
|
|
63
|
+
"queue.skippedUncertain": ({ count }) => `Saltati ${count} brani con un esito precedente incerto, per evitare doppioni; controlla la coda di Spotify.`,
|
|
64
|
+
"queue.skippedAvoided": ({ count }) => `Saltati ${count} brani che volevi evitare.`,
|
|
65
|
+
"plan.avoidedLeftOut": ({ titles }) => `Lasciati fuori, come mi hai chiesto: ${titles}.`,
|
|
66
|
+
"queue.skippedKnown": ({ count }) => `Saltati ${count} brani già presenti nella tua cronologia, come richiesto.`,
|
|
67
|
+
"queue.mix": ({ familiar = 0, returning = 0, heard = 0, known_artist: knownArtist = 0, new: fresh = 0 }) =>
|
|
68
|
+
`Secondo la tua cronologia: ${[familiar && `${familiar} che conosci bene`, returning && `${returning} ${returning === 1 ? "che torna" : "che tornano"} dopo un po'`, heard && `${heard} ${heard === 1 ? "sentito" : "sentiti"} una o due volte`, knownArtist && `${knownArtist} ${knownArtist === 1 ? "nuovo da un artista" : "nuovi da artisti"} che conosci`, fresh && `${fresh} ${fresh === 1 ? "nuovo" : "nuovi"} per te`].filter(Boolean).join(", ")}.`,
|
|
69
|
+
"queue.observationTruncated": "Il controllo dei doppioni copre solo la parte limitata della coda restituita da Spotify; le voci non visibili potrebbero ancora essere doppioni.",
|
|
70
|
+
"queue.notAddedHeading": "Non aggiunti:",
|
|
71
|
+
"queue.earlierReceipt": "Questo è l'esito della richiesta di coda precedente; questo chiarimento non ha aggiunto di nuovo i brani.",
|
|
72
|
+
|
|
73
|
+
"playlist.partialUnknown": ({ name }) => `Spotify ha creato la playlist privata "${name}", ma l'aggiunta dei brani non è stata confermata. Controllala prima di decidere se riprovare.`,
|
|
74
|
+
"playlist.partialEmpty": ({ name }) => `Spotify ha creato la playlist privata "${name}", ma non ha aggiunto i brani. La playlist vuota ora esiste; controllala prima di decidere se riprovare.`,
|
|
75
|
+
"playlist.saved": ({ name, count }) => `Salvata come playlist privata di Spotify "${name}" (${count} brani).`,
|
|
76
|
+
|
|
77
|
+
"action.playback.resume": "richiesta di riproduzione",
|
|
78
|
+
"action.playback.pause": "richiesta di pausa",
|
|
79
|
+
"action.playback.next": "richiesta del brano successivo",
|
|
80
|
+
"action.playback.previous": "richiesta del brano precedente",
|
|
81
|
+
"action.playback.volume.set": "modifica del volume",
|
|
82
|
+
"action.playback.seek": "modifica della posizione di riproduzione",
|
|
83
|
+
"action.playback.shuffle.set": "impostazione della riproduzione casuale",
|
|
84
|
+
"action.playback.repeat.set": "impostazione della ripetizione",
|
|
85
|
+
"action.playback.transfer": "cambio di dispositivo",
|
|
86
|
+
"action.playback.queue.add": "aggiunta alla coda",
|
|
87
|
+
"action.library.remove": "rimozione dalla libreria",
|
|
88
|
+
"action.library.save": "salvataggio in libreria",
|
|
89
|
+
"action.playlist.write": "creazione della playlist",
|
|
90
|
+
"action.playlist.edit": "modifica della playlist",
|
|
91
|
+
"action.playlist.rename": "cambio di nome della playlist",
|
|
92
|
+
"action.playlist.unfollow": "rimozione della playlist dalla libreria",
|
|
93
|
+
"action.playlist.remove_track": "rimozione di un brano dalla playlist",
|
|
94
|
+
"action.other": "modifica richiesta",
|
|
95
|
+
"write.unknown": ({ action, target }) => `Spotify non ha confermato l'operazione "${action}"${target ? ` per "${target}"` : ""}. Controlla lo stato prima di decidere se riprovare.`,
|
|
96
|
+
"write.unfollowed": ({ name }) => `"${name}" è stata rimossa dalla tua libreria di Spotify (non la segui più). La playlist può ancora esistere per altri ascoltatori; non è stata eliminata per tutti.`,
|
|
97
|
+
"write.renamed": ({ name }) => `Spotify ha accettato di rinominare la playlist in "${name}".`,
|
|
98
|
+
"write.trackRemoved": ({ name }) => `Spotify ha accettato la rimozione di un brano da "${name}".`,
|
|
99
|
+
"write.accepted": ({ action, count, targets }) => `Spotify ha accettato l'operazione "${action}"${count === null ? "" : ` (${count} brani)`}${targets ? `: ${targets}` : ""}.`,
|
|
100
|
+
|
|
101
|
+
"plan.heading.private_library": ({ count }) => `Selezione di ${count} brani dalla tua libreria:`,
|
|
102
|
+
"plan.heading.private_history": ({ count }) => `${count} brani da riascoltare, dalla tua cronologia:`,
|
|
103
|
+
"plan.heading.external_catalog": ({ count }) => `${count} brani:`,
|
|
104
|
+
"plan.heading.mixed": ({ count }) => `${count} brani:`,
|
|
105
|
+
"plan.heading.timeCapsule": ({ count }) => `Macchina del tempo in ${count} tappe attraverso i tuoi anni d'ascolto:`,
|
|
106
|
+
"plan.heading.historicalReturn": ({ count }) => `${count} brani tornati dopo una lunga pausa:`,
|
|
107
|
+
"plan.heading.backToBack": ({ count }) => `${count} brani che hai ascoltato uno dopo l'altro:`,
|
|
108
|
+
"plan.externalTrack": ({ line, release }) => `${line}, da "${release}"`,
|
|
109
|
+
"plan.rationale": ({ text }) => ` Perché l'ho scelto: ${text}`,
|
|
110
|
+
"plan.ordering": ({ text }) => `Perché quest'ordine: ${text}`,
|
|
111
|
+
"plan.notSaved": "Non ho ancora salvato né messo in coda nulla.",
|
|
112
|
+
"plan.previewing": "Le anteprime di 30 secondi stanno suonando nel tuo player; i brani completi sono su Apple Music.",
|
|
113
|
+
"plan.pending": "Limite: questa selezione attende conferma solo nella sessione in corso, non è stata scritta su Spotify e non ha effetti esterni.",
|
|
114
|
+
"plan.backToBackBoundary": "Limite d'interpretazione: ascolti registrati uno dopo l'altro non dimostrano la modalità ripetizione, un riascolto voluto né che il brano ti piaccia.",
|
|
115
|
+
"plan.validationScope": "Ambito della verifica: il pianificatore locale verifica identità dei brani, appartenenza ai candidati, numero e ordine; i motivi della scelta e l'adattamento alla situazione restano giudizi del modello basati sui metadati disponibili.",
|
|
116
|
+
"plan.unvalidated": "Non sono riuscito a verificare questa selezione, quindi non restituirò un elenco di brani non confrontato con candidati affidabili. Restringi o allarga la ricerca e riprova.",
|
|
117
|
+
|
|
118
|
+
"edit.previewHeading": ({ name, before, after }) => `Anteprima della modifica alla playlist privata di Spotify "${name}" (${before} -> ${after} brani):`,
|
|
119
|
+
"edit.status.added": "aggiunto",
|
|
120
|
+
"edit.status.moved": "spostato",
|
|
121
|
+
"edit.status.retained": "resta",
|
|
122
|
+
"edit.removeHeading": "Da rimuovere:",
|
|
123
|
+
"edit.summary": ({ added, removed, moved, retained }) => `Riepilogo: ${added} aggiunti, ${removed} rimossi, ${moved} spostati, ${retained} rimasti al loro posto.`,
|
|
124
|
+
"edit.boundary": "Limite: Spotify non è ancora cambiato. Conferma esplicitamente nel prossimo messaggio perché Moondog scriva esattamente questa versione conservata.",
|
|
125
|
+
"edit.updated": ({ name, before, after }) => `Ho aggiornato la playlist privata di Spotify "${name}" esattamente secondo l'anteprima confermata${before === null ? ` (ora ${after} brani)` : ` (${before} -> ${after} brani)`}.`,
|
|
126
|
+
|
|
127
|
+
"selection.note": ({ playlist, track }) => `\n\nSelezionati per le prossime modifiche: playlist ${playlist}; brano ${track}.`,
|
|
128
|
+
"memory.spotifyExcluded": "\n\nI risultati di Spotify sono esclusi dalla memoria generale; si potevano ricordare solo le tue parole verificate, e il resto non è stato salvato.",
|
|
129
|
+
"memory.notSaved": "\n\nLa risposta è completa, ma la memoria non è stata salvata.",
|
|
130
|
+
"choice.like": ({ title, artist }) => { const name = title ? `"${title}" di ${artist}` : artist; return `\n\nSalvato: ti piace ${name}. Dimmelo quando vuoi cambiarlo.`; },
|
|
131
|
+
"choice.avoid": ({ title, artist }) => { const name = title ? `"${title}" di ${artist}` : artist; return `\n\nSalvato: terrò ${name} fuori da ciò che suono e ti propongo. Dimmelo quando vuoi cambiarlo.`; },
|
|
132
|
+
"choice.retract": ({ title, artist }) => { const name = title ? `"${title}" di ${artist}` : artist; return `\n\nAnnullato: la tua scelta precedente su ${name}.`; },
|
|
133
|
+
"turn.cancelled": "Ho annullato il resto.",
|
|
134
|
+
"turn.interrupted": "La risposta si è interrotta. Gli esiti di Spotify registrati sono qui sotto; nessuna azione è stata ripetuta.",
|
|
135
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// 日本語(です・ます調)。Keys match messages/en.mjs; a missing key falls back to English.
|
|
2
|
+
export default {
|
|
3
|
+
"discovery.reason.listenbrainz": ({ adjacent, seed, release }) => `ListenBrainz の再生データで ${adjacent} と ${seed} がつながっています。『${release}』収録。`,
|
|
4
|
+
"discovery.reason.appleMusic": ({ queries, release, genre }) => `Apple Music カタログ${queries ? `で ${queries} に一致` : "の候補"}。『${release}』収録${genre ? `、カタログ上のジャンル: ${genre}` : ""}。`,
|
|
5
|
+
"discovery.reason.external": ({ release }) => `取得した外部カタログから。『${release}』収録。`,
|
|
6
|
+
"discovery.order": ({ path }) => `この順に聴いてみてください: ${path}。`,
|
|
7
|
+
"discovery.unavailable": "音楽を探すサービスに接続できなかったため、今回はおすすめを出せませんでした。もう一度送ってみてください。",
|
|
8
|
+
|
|
9
|
+
"citations.heading": "公開されている音楽情報(個人の再生記録とは別のものです):",
|
|
10
|
+
"citations.item": ({ label, url, storefront, date }) => `- [${label}](<${url}>) - ${storefront} ストア、${date} に取得。`,
|
|
11
|
+
"citations.scope": "範囲: これらの公開カタログページは、個人の好み、完全な再生履歴、他サービスでの配信状況を示すものではありません。",
|
|
12
|
+
"web.sources.heading": ({ providers }) => `公開 Web の出典(${providers})`,
|
|
13
|
+
"web.sources.headingUnnamed": "公開 Web の出典",
|
|
14
|
+
"web.sources.published": ({ date }) => `出典の日付:${date}`,
|
|
15
|
+
"web.sources.retrieved": ({ date }) => `取得:${date}`,
|
|
16
|
+
|
|
17
|
+
"external.neighbors": ({ seed }) => seed ? `ListenBrainz で ${seed} を聴く人たちに近いアーティスト` : "ListenBrainz で近いリスナーが聴くアーティスト",
|
|
18
|
+
"external.listenbrainz": ({ neighbor, date }) => `${neighbor}(Wikidata の識別情報、CC0、${date} に取得。音が似ているという意味ではありません)`,
|
|
19
|
+
"external.appleMusic": ({ date }) => `Apple Music US の曲名一致(${date} に取得)`,
|
|
20
|
+
"external.limit": "取り込んだライブラリと曲名・アーティストが完全に一致するものだけを除いています。まだ聴いたことがない曲という意味ではありません。聴いてみるための提案です。",
|
|
21
|
+
"external.from": ({ parts, limit }) => `出典: ${parts.join("、および")}。${limit}`,
|
|
22
|
+
|
|
23
|
+
"failure.deviceList": ({ noMatch, names, code }) => `デバイス名が${noMatch ? "一致しませんでした" : "複数のデバイスに一致しました"}。Spotify に現在表示されているのは: ${names}。表示された名前で「〜で再生して」と伝えてください。選んだ曲はそのまま保持されます。再生リクエストは送っていません。 (${code})`,
|
|
24
|
+
"failure.networkRead": ({ notSent, code }) => `ネットワークエラーで Spotify のデバイスや再生状態を読み取れず、準備を中止しました。${notSent ? "再生リクエストは送っていません。" : ""}Spotify との接続を確認してから、もう一度試してください。 (${code})`,
|
|
25
|
+
"failure.readiness.spotify_device_selection_required": "選んだ曲は保持していますが、再生するデバイスが決まっていません。使うデバイスの名前を教えてください。前のデバイスに勝手に切り替えることはありません。",
|
|
26
|
+
"failure.readiness.spotify_device_not_found": "指定したデバイスが Spotify に表示されていません。そのデバイスで Spotify を開いてから、もう一度再生を頼んでください。別のデバイスには切り替えていません。",
|
|
27
|
+
"failure.readiness.spotify_device_ambiguous": "使える Spotify デバイスが複数あるかもしれません。使いたいデバイスの名前を教えてください。",
|
|
28
|
+
"failure.readiness.spotify_device_restricted": "指定したデバイスは Spotify Web API での操作が確認できません。別のデバイスを選んでください。",
|
|
29
|
+
"failure.readiness.spotify_device_changed": "別の Spotify デバイスがアクティブになりました。使うデバイスをはっきり選んでください。再生は自動で移していません。",
|
|
30
|
+
"failure.readiness.spotify_device_state_unconfirmed": "Spotify のデバイスや再生状態の情報が不完全か、食い違っています。Spotify で今のデバイスを確認してから、もう一度試してください。",
|
|
31
|
+
"failure.readiness.spotify_device_not_ready": "待ち時間内にデバイスの準備ができませんでした。そのデバイスで Spotify を開いてから、同じ曲をもう一度頼んでください。",
|
|
32
|
+
"failure.readiness.spotify_playback_restricted": "Spotify が現在、再生の再開を許可していません。デバイスを確認してください。",
|
|
33
|
+
"failure.songNotSent": " 再生リクエストは送っていません。",
|
|
34
|
+
"failure.preparationStopped": ({ evidence }) => `再生前のデバイス確認が完了しませんでした(${evidence})。再生リクエストは送っていません。Spotify のデバイスの状態を確認してから、もう一度試してください。`,
|
|
35
|
+
"failure.queueRequestRequired": "曲は追加していません。この返事をキューへの追加リクエストと結びつけられませんでした。続けるには、キューに追加したいとはっきり伝えてください。",
|
|
36
|
+
"failure.notSent": ({ code }) => `Spotify には何も送っていません。さっき見つけた曲と結び付けられませんでした(${code})。曲名かアーティスト名を添えてもう一度頼んでください。改めて探します。`,
|
|
37
|
+
"failure.avoided": "Spotify には何も送っていません。このアーティストか曲は流さないように、と言われています。変えたいときはいつでも言ってください。",
|
|
38
|
+
"failure.outcome.lookup": "Spotify での検索が完了しませんでした",
|
|
39
|
+
"failure.outcome.unknown": "Spotify での操作結果がわかりません",
|
|
40
|
+
"failure.outcome.unconfirmed": "Spotify が再生操作を確認しませんでした",
|
|
41
|
+
"failure.reason": ({ reason }) => `Spotify からの理由: ${reason}。`,
|
|
42
|
+
"failure.reasonUnknown": "具体的な原因は確認できていません。",
|
|
43
|
+
"failure.lookup": ({ outcome, evidence, reason }) => `${outcome}(${evidence})。${reason}再生やキューへの追加は送っていません。`,
|
|
44
|
+
"failure.general": ({ targets, outcome, evidence, reason, playbackNotSent, recovered }) =>
|
|
45
|
+
`${targets ? `対象: ${targets}。\n` : ""}${outcome}(${evidence})。${reason}${playbackNotSent ? "再生リクエストは送っていません。" : ""}${recovered ? "デバイスの復旧を一度だけ試して終了しました。これ以上は再試行しません。" : "自動では再試行していません。"}再生状態と使えるデバイスを確認すると、原因を詳しく調べられます。`,
|
|
46
|
+
|
|
47
|
+
"queue.unverified": () => "Spotify は受け付けましたが、キューを読み取って確認できませんでした。",
|
|
48
|
+
"queue.confirmedPlaying": ({ one }) => one ? "Spotify で再生中であることを確認しました。" : "Spotify で確認しました。1 曲目が再生中で、残りはキューに入っています。",
|
|
49
|
+
"queue.confirmed": ({ count }) => count === 1 ? "Spotify のキューに入っていることを確認しました。" : `Spotify のキューに ${count} 曲すべて入っていることを確認しました。`,
|
|
50
|
+
"queue.partlyVisible": ({ accepted, confirmed, truncated }) => `Spotify は ${accepted} 曲を受け付け、今キューに見えているのは ${confirmed} 曲です${truncated ? "(長いキューは Spotify が一部しか表示しません)" : ""}。`,
|
|
51
|
+
"queue.noPlayback": "Spotify で再生中の曲がなく、手がかりにできないため、何も追加していません。",
|
|
52
|
+
"queue.noCandidates": "絞り込んだ結果、追加できる候補が残らなかったため、何も追加していません。",
|
|
53
|
+
"queue.requested": ({ requested, accepted, shortfall }) => `${requested} 曲のリクエストに対し、Spotify が受け付けたのは ${accepted} 曲です${shortfall ? `(${shortfall} 曲不足)` : ""}。`,
|
|
54
|
+
"queue.similarSeed": ({ artist }) => `${artist} を聴く人たちに近いアーティストから:`,
|
|
55
|
+
"queue.cancelled": "キャンセルを受けて追加を止めました。受け付け済みの曲はキューに残っています。",
|
|
56
|
+
"queue.stopped": ({ count, title, artist }) => `Spotify のキューに ${count} 曲追加し、「${title}」 - ${artist} で止まりました。`,
|
|
57
|
+
"queue.queued": ({ count }) => `Spotify のキューに ${count} 曲追加しました:`,
|
|
58
|
+
"queue.queuedSome": ({ count, unmatched }) => `Spotify のキューに ${count + unmatched} 曲中 ${count} 曲追加しました:`,
|
|
59
|
+
"queue.outcomeUnknown": "止まった曲が追加されたかどうか、Spotify が確認しませんでした。もう一度試す前にキューを確認してください。再送はしていません。",
|
|
60
|
+
"queue.started": ({ title, device, more }) => `何も再生していなかったので、${device ? `${device} で` : ""}「${title}」を再生し${more ? "、残りをキューに入れ" : ""}ました。`,
|
|
61
|
+
"queue.unmatchedHeading": "Spotify で見つからなかった曲:",
|
|
62
|
+
"queue.skippedDuplicates": ({ count }) => `重複していた ${count} 曲を飛ばしました。`,
|
|
63
|
+
"queue.skippedUncertain": ({ count }) => `前回キューへの追加結果がはっきりしなかった ${count} 曲を、重複を避けるため飛ばしました。Spotify のキューを確認してください。`,
|
|
64
|
+
"queue.skippedAvoided": ({ count }) => `避けるよう指定された ${count} 曲を飛ばしました。`,
|
|
65
|
+
"plan.avoidedLeftOut": ({ titles }) => `流さないように言われていた曲は外しました:${titles}。`,
|
|
66
|
+
"queue.skippedKnown": ({ count }) => `ご希望どおり、再生履歴にある ${count} 曲を飛ばしました。`,
|
|
67
|
+
"queue.mix": ({ familiar = 0, returning = 0, heard = 0, known_artist: knownArtist = 0, new: fresh = 0 }) =>
|
|
68
|
+
`再生履歴では: ${[familiar && `よく知っている曲 ${familiar} 曲`, returning && `久しぶりの曲 ${returning} 曲`, heard && `1、2 回聴いた曲 ${heard} 曲`, knownArtist && `知っているアーティストの新しい曲 ${knownArtist} 曲`, fresh && `初めての曲 ${fresh} 曲`].filter(Boolean).join("、")}。`,
|
|
69
|
+
"queue.observationTruncated": "重複の確認は Spotify が表示するキューの範囲だけです。表示されていない部分と重なる可能性があります。",
|
|
70
|
+
"queue.notAddedHeading": "まだ追加していない曲:",
|
|
71
|
+
"queue.earlierReceipt": "これは前回のキュー操作の結果です。今回の補足では曲を再度追加していません。",
|
|
72
|
+
|
|
73
|
+
"playlist.partialUnknown": ({ name }) => `Spotify に非公開プレイリスト「${name}」を作成しましたが、曲の追加は確認できませんでした。再試行する前にプレイリストを確認してください。`,
|
|
74
|
+
"playlist.partialEmpty": ({ name }) => `Spotify に非公開プレイリスト「${name}」を作成しましたが、曲は追加されませんでした。空のプレイリストが残っています。再試行する前に確認してください。`,
|
|
75
|
+
"playlist.saved": ({ name, count }) => `Spotify の非公開プレイリスト「${name}」として保存しました(${count} 曲)。`,
|
|
76
|
+
|
|
77
|
+
"action.playback.resume": "再生リクエスト",
|
|
78
|
+
"action.playback.pause": "一時停止",
|
|
79
|
+
"action.playback.next": "次の曲へのスキップ",
|
|
80
|
+
"action.playback.previous": "前の曲への移動",
|
|
81
|
+
"action.playback.volume.set": "音量の変更",
|
|
82
|
+
"action.playback.seek": "再生位置の変更",
|
|
83
|
+
"action.playback.shuffle.set": "シャッフルの設定",
|
|
84
|
+
"action.playback.repeat.set": "リピートの設定",
|
|
85
|
+
"action.playback.transfer": "デバイスの切り替え",
|
|
86
|
+
"action.playback.queue.add": "キューへの追加",
|
|
87
|
+
"action.library.remove": "ライブラリからの削除",
|
|
88
|
+
"action.library.save": "ライブラリへの保存",
|
|
89
|
+
"action.playlist.write": "プレイリストの作成",
|
|
90
|
+
"action.playlist.edit": "プレイリストの変更",
|
|
91
|
+
"action.playlist.rename": "プレイリスト名の変更",
|
|
92
|
+
"action.playlist.unfollow": "ライブラリからのプレイリストの削除",
|
|
93
|
+
"action.playlist.remove_track": "プレイリストからの曲の削除",
|
|
94
|
+
"action.other": "依頼された変更",
|
|
95
|
+
"write.unknown": ({ action, target }) => `Spotify で${target ? `「${target}」の` : ""}${action}が確認できませんでした。再試行する前に状態を確認してください。`,
|
|
96
|
+
"write.unfollowed": ({ name }) => `「${name}」を Spotify のライブラリから外しました(フォロー解除)。プレイリスト自体はほかのリスナーには残っている場合があり、削除はしていません。`,
|
|
97
|
+
"write.renamed": ({ name }) => `Spotify でプレイリスト名を「${name}」に変更しました。`,
|
|
98
|
+
"write.trackRemoved": ({ name }) => `Spotify で「${name}」から 1 曲削除しました。`,
|
|
99
|
+
"write.accepted": ({ action, count, targets }) => `Spotify が${action}を受け付けました${count === null ? "" : `(${count} 曲)`}${targets ? `: ${targets}` : ""}。`,
|
|
100
|
+
|
|
101
|
+
"plan.heading.private_library": ({ count }) => `あなたのライブラリから選んだ ${count} 曲のプラン:`,
|
|
102
|
+
"plan.heading.private_history": ({ count }) => `再生履歴からもう一度聴きたい ${count} 曲のプラン:`,
|
|
103
|
+
"plan.heading.external_catalog": ({ count }) => `${count} 曲:`,
|
|
104
|
+
"plan.heading.mixed": ({ count }) => `${count} 曲:`,
|
|
105
|
+
"plan.heading.timeCapsule": ({ count }) => `あなたの聴いてきた年をたどる ${count} 曲のタイムマシン:`,
|
|
106
|
+
"plan.heading.historicalReturn": ({ count }) => `長い空白のあとに戻ってきた ${count} 曲:`,
|
|
107
|
+
"plan.heading.backToBack": ({ count }) => `続けて再生していた ${count} 曲:`,
|
|
108
|
+
"plan.externalTrack": ({ line, release }) => `${line}(『${release}』収録)`,
|
|
109
|
+
"plan.rationale": ({ text }) => ` 選んだ理由: ${text}`,
|
|
110
|
+
"plan.ordering": ({ text }) => `曲順の理由: ${text}`,
|
|
111
|
+
"plan.notSaved": "まだ保存もキューへの追加もしていません。",
|
|
112
|
+
"plan.previewing": "30秒のプレビューをプレーヤーで再生中です。フル尺の曲は Apple Music で聴けます。",
|
|
113
|
+
"plan.pending": "範囲: このプランは今のセッション内で保留中です。Spotify には書き込んでおらず、外部への影響はありません。",
|
|
114
|
+
"plan.backToBackBoundary": "読み方の注意: 保存された再生が続いていても、リピート再生だった、意図して聴き直した、気に入っている、とは限りません。",
|
|
115
|
+
"plan.validationScope": "確認した範囲: ローカルのプランナーが曲の同一性、候補への所属、曲数、順番を確認しています。選んだ理由や場面への合い方は、手元のメタデータにもとづくモデルの判断です。",
|
|
116
|
+
"plan.unvalidated": "このプランを検証できなかったため、信頼できる候補で確認していない曲リストはお出ししません。検索を絞るか広げて、もう一度試してください。",
|
|
117
|
+
|
|
118
|
+
"edit.previewHeading": ({ name, before, after }) => `Spotify の非公開プレイリスト「${name}」の編集プレビュー(${before} -> ${after} 曲):`,
|
|
119
|
+
"edit.status.added": "追加",
|
|
120
|
+
"edit.status.moved": "移動",
|
|
121
|
+
"edit.status.retained": "維持",
|
|
122
|
+
"edit.removeHeading": "削除する曲:",
|
|
123
|
+
"edit.summary": ({ added, removed, moved, retained }) => `変更の概要: 追加 ${added}、削除 ${removed}、移動 ${moved}、そのまま ${retained}。`,
|
|
124
|
+
"edit.boundary": "範囲: Spotify はまだ変わっていません。次のメッセージではっきり確認してもらえたら、Moondog がこのとおりの内容で書き込みます。",
|
|
125
|
+
"edit.updated": ({ name, before, after }) => `確認済みのプレビューどおりに Spotify の非公開プレイリスト「${name}」を更新しました${before === null ? `(現在 ${after} 曲)` : `(${before} -> ${after} 曲)`}。`,
|
|
126
|
+
|
|
127
|
+
"selection.note": ({ playlist, track }) => `\n\n続けて編集する対象: プレイリスト ${playlist}、曲 ${track}。`,
|
|
128
|
+
"memory.spotifyExcluded": "\n\nSpotify の検索結果は一般の記憶には残しません。確認できるあなたの発言だけが対象で、それ以外は保存していません。",
|
|
129
|
+
"memory.notSaved": "\n\n返事は完了しましたが、記憶は保存できませんでした。",
|
|
130
|
+
"choice.like": ({ title, artist }) => { const name = title ? `${artist}の「${title}」` : artist; return `\n\n保存しました: ${name}が好き。変えたいときはいつでも言ってください。`; },
|
|
131
|
+
"choice.avoid": ({ title, artist }) => { const name = title ? `${artist}の「${title}」` : artist; return `\n\n保存しました: ${name}は再生にもおすすめにも入れません。変えたいときはいつでも言ってください。`; },
|
|
132
|
+
"choice.retract": ({ title, artist }) => { const name = title ? `${artist}の「${title}」` : artist; return `\n\n取り消しました: ${name}についての前の選択。`; },
|
|
133
|
+
"turn.cancelled": "以降の処理をキャンセルしました。",
|
|
134
|
+
"turn.interrupted": "返事が中断されました。記録された Spotify の操作結果は下のとおりです。操作は繰り返していません。",
|
|
135
|
+
};
|