Merge branch 'develop' into feat/2091-improve-visuals

This commit is contained in:
jon r 2025-03-28 11:58:58 +01:00
commit 75e1e91786
6 changed files with 10619 additions and 10641 deletions

View File

@ -175,7 +175,7 @@ lint_api:
- if: $CI_COMMIT_BRANCH =~ /(stable|develop)/
- changes: [api/**/*]
image: $CI_REGISTRY/funkwhale/ci/python-funkwhale-api:3.11
image: $CI_REGISTRY/funkwhale/ci/python-funkwhale-api:3.13
cache: *api_cache
before_script:
- cd api
@ -339,7 +339,7 @@ build_api_schema:
# Add build_docs rules because it depends on the build_api_schema artifact
- changes: [docs/**/*]
image: $CI_REGISTRY/funkwhale/ci/python-funkwhale-api:3.11
image: $CI_REGISTRY/funkwhale/ci/python-funkwhale-api:3.13
services:
- postgres:15-alpine
- redis:7-alpine
@ -357,6 +357,11 @@ build_api_schema:
- poetry run funkwhale-manage migrate
script:
- poetry run funkwhale-manage spectacular --file ../docs/schema.yml
- diff ../docs/schema.yml ./funkwhale_api/common/schema.yml || (
echo "Schema files do not match! run sudo docker compose run --rm
api funkwhale-manage spectacular > ./api/funkwhale_api/common/schema.yml" &&
exit 1
)
artifacts:
expire_in: 2 weeks
paths:

View File

@ -6,7 +6,8 @@ repos:
rev: v4.4.0
hooks:
- id: check-added-large-files
args: ['--maxkb=1000']
exclude: 'api/funkwhale_api/common/schema.yml'
- id: check-case-conflict
- id: check-executables-have-shebangs
- id: check-shebang-scripts-are-executable
@ -63,6 +64,7 @@ repos:
hooks:
- id: prettier
files: \.(md|yml|yaml|json)$
exclude: 'api/funkwhale_api/common/schema.yml'
- repo: https://github.com/codespell-project/codespell
rev: v2.2.6

View File

@ -9291,25 +9291,16 @@ paths:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
application/x-www-form-urlencoded:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
multipart/form-data:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
application/activity+json:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
required: true
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
security:
- oauth2: []
- ApplicationToken: []
@ -12936,7 +12927,7 @@ paths:
description: ''
/api/v2/instance/nodeinfo/2.1/:
get:
operationId: getNodeInfo21
operationId: getNodeInfo20_2
tags:
- instance
responses:
@ -12944,7 +12935,7 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/NodeInfo21'
$ref: '#/components/schemas/NodeInfo20'
description: ''
/api/v2/instance/settings/:
get:
@ -18966,25 +18957,16 @@ paths:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
application/x-www-form-urlencoded:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
multipart/form-data:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
application/activity+json:
schema:
type: array
items:
$ref: '#/components/schemas/UploadBulkUpdateRequest'
required: true
$ref: '#/components/schemas/PatchedUploadForOwnerRequest'
security:
- oauth2: []
- ApplicationToken: []
@ -20288,16 +20270,12 @@ components:
downloads_count:
type: integer
readOnly: true
subscriptions_count:
type: integer
readOnly: true
required:
- actor
- artist
- attributed_to
- downloads_count
- rss_url
- subscriptions_count
- url
ChannelCreate:
type: object
@ -23146,124 +23124,6 @@ components:
- shortDescription
- supportedUploadExtensions
- terms
Metadata21:
type: object
properties:
actorId:
type: string
private:
type: boolean
readOnly: true
shortDescription:
type: string
readOnly: true
longDescription:
type: string
readOnly: true
contactEmail:
type: string
readOnly: true
nodeName:
type: string
readOnly: true
banner:
type: string
readOnly: true
defaultUploadQuota:
type: integer
readOnly: true
supportedUploadExtensions:
type: array
items:
type: string
allowList:
allOf:
- $ref: '#/components/schemas/AllowListStat'
readOnly: true
funkwhaleSupportMessageEnabled:
type: boolean
readOnly: true
instanceSupportMessage:
type: string
readOnly: true
usage:
$ref: '#/components/schemas/MetadataUsage'
languages:
type: array
items:
type: string
location:
type: string
content:
$ref: '#/components/schemas/MetadataContent'
features:
type: array
items:
type: string
codeOfConduct:
type: string
readOnly: true
required:
- actorId
- allowList
- banner
- codeOfConduct
- contactEmail
- content
- defaultUploadQuota
- features
- funkwhaleSupportMessageEnabled
- instanceSupportMessage
- languages
- location
- longDescription
- nodeName
- private
- shortDescription
- supportedUploadExtensions
MetadataContent:
type: object
properties:
local:
$ref: '#/components/schemas/MetadataContentLocal'
topMusicCategories:
type: array
items:
$ref: '#/components/schemas/MetadataContentCategory'
topPodcastCategories:
type: array
items:
$ref: '#/components/schemas/MetadataContentCategory'
required:
- local
- topMusicCategories
- topPodcastCategories
MetadataContentCategory:
type: object
properties:
name:
type: string
count:
type: integer
required:
- count
- name
MetadataContentLocal:
type: object
properties:
artists:
type: integer
releases:
type: integer
recordings:
type: integer
hoursOfContent:
type: integer
required:
- artists
- hoursOfContent
- recordings
- releases
MetadataUsage:
type: object
properties:
@ -23388,42 +23248,6 @@ components:
- software
- usage
- version
NodeInfo21:
type: object
properties:
version:
type: string
readOnly: true
software:
$ref: '#/components/schemas/SoftwareSerializer_v2'
protocols:
type: array
items: {}
readOnly: true
services:
allOf:
- $ref: '#/components/schemas/Services'
default:
inbound: []
outbound: []
openRegistrations:
type: boolean
readOnly: true
usage:
allOf:
- $ref: '#/components/schemas/Usage'
readOnly: true
metadata:
allOf:
- $ref: '#/components/schemas/Metadata21'
readOnly: true
required:
- metadata
- openRegistrations
- protocols
- software
- usage
- version
NodeInfoLibrary:
type: object
properties:
@ -24631,8 +24455,6 @@ components:
allOf:
- $ref: '#/components/schemas/ImportStatusEnum'
default: pending
privacy_level:
$ref: '#/components/schemas/LibraryPrivacyLevelEnum'
import_metadata: {}
import_reference:
type: string
@ -25234,25 +25056,6 @@ components:
required:
- name
- version
SoftwareSerializer_v2:
type: object
properties:
name:
type: string
readOnly: true
version:
type: string
repository:
type: string
readOnly: true
homepage:
type: string
readOnly: true
required:
- homepage
- name
- repository
- version
SpaManifest:
type: object
properties:
@ -25691,17 +25494,6 @@ components:
- mimetype
- size
- uuid
UploadBulkUpdateRequest:
type: object
properties:
uuid:
type: string
format: uuid
privacy_level:
$ref: '#/components/schemas/LibraryPrivacyLevelEnum'
required:
- privacy_level
- uuid
UploadForOwner:
type: object
properties:
@ -25748,8 +25540,6 @@ components:
allOf:
- $ref: '#/components/schemas/ImportStatusEnum'
default: pending
privacy_level:
$ref: '#/components/schemas/LibraryPrivacyLevelEnum'
import_details:
readOnly: true
import_metadata: {}
@ -25790,8 +25580,6 @@ components:
allOf:
- $ref: '#/components/schemas/ImportStatusEnum'
default: pending
privacy_level:
$ref: '#/components/schemas/LibraryPrivacyLevelEnum'
import_metadata: {}
import_reference:
type: string
@ -26119,11 +25907,11 @@ components:
write:instance:requests: ''
write:instance:notes: ''
servers:
- url: https://demo.funkwhale.audio
- url: https://demo.funkwhale.audio
description: Demo Server
- url: https://funkwhale.audio
- url: https://funkwhale.audio
description: Read server with real content
- url: '{protocol}://{domain}'
- url: '{protocol}://{domain}'
description: Custom server
variables:
domain:

View File

@ -0,0 +1,7 @@
# OpenApi schema
The frontend need up to date schemas ! If you change the api you need to upgrade the schema by running : `docker compose run --rm api funkwhale-manage spectacular > ./api/funkwhale_api/common/schema.yml`.
Then you need to upgrade the frontend schema has well by running `yarn generate-types-from-local-schema`.
Be aware that `get_signup_form_additional_fields_serializer` can tweak the schema generation.

View File

@ -2802,7 +2802,11 @@
"libraryAcceptFollow": "{ username } ha acceptat el seguiment de la biblioteca \"{ library }\"",
"libraryFollow": "{ username } ha seguit la teva biblioteca \"{ library }\"",
"libraryPendingFollow": "{ username } vol seguir la teva biblioteca \"{ library }\"",
"libraryReject": "Has rebutjat la petició de {username} per seguir \"{library}\""
"libraryReject": "Has rebutjat la petició de {username} per seguir \"{library}\"",
"userAcceptFollow": "{username} ha acceptat que el seguiu",
"userFollow": "{username} et segueix",
"userPendingFollow": "{username} vol seguir-vos",
"userReject": "Heu rebutjat la sol·licitud de {username} per seguir-vos"
}
}
},
@ -2865,6 +2869,19 @@
"name": "La meva impressionant llista de reproducció"
}
},
"PlaylistDropdown": {
"button": {
"export": {
"description": "Això proporcionarà un fitxer xspf amb les dades de la llista de reproducció",
"header": "Descàrrega la llista de reproducció"
},
"import": {
"description": "Això actualitzarà la llista de reproducció amb el contingut del fitxer xspf. Se suprimiran les pistes existents a la llista de reproducció",
"header": "Reconstrueix la llista de reproducció"
}
},
"more": "Més"
},
"PlaylistModal": {
"button": {
"addDuplicate": "Afegeix de totes maneres",
@ -3395,6 +3412,7 @@
"moderation": "Moderació",
"music": "Música",
"playlists": "Llistes de reproducció",
"qualityFilters": "Explora els filtres de qualitat de la pàgina",
"sections": "Seccions",
"security": "Seguretat",
"settings": "Paràmetres de la instància",
@ -4412,7 +4430,7 @@
},
"meta": {
"failedTracks": "Pistes fallides: {tracks}",
"lastUpdate": "Última actualització: · ",
"lastUpdate": "Última actualització:",
"tracks": "{ n } pista | { n } pistes"
},
"modal": {

View File

@ -395,7 +395,8 @@
"help": {
"discography": "Publica la música que haces como una bonita discografía de álbumes y sencillos.",
"podcast": "Aloja tus episodios y mantén a tu comunidad actualizada.",
"podcastFields": "Usado para el campo itunes:email y itunes:name requerido por ciertas plataformas como Spotify o iTunes"
"podcastFields": "Usado para el campo itunes:email y itunes:name requerido por ciertas plataformas como Spotify o iTunes",
"username": "Usado en URL y para seguir este canal en el Fediverso. No puede ser cambiado luego."
},
"label": {
"category": "Categoría",
@ -407,8 +408,13 @@
"name": "Nombre",
"owner": "Propietario",
"podcast": "Podcasts",
"subcategory": "Subcategoría",
"tags": "Etiquetas",
"username": "Manejo de Fediverse"
},
"legend": {
"purpose": "¿Para qué será usado este canal?"
},
"loader": {
"loading": "Subiendo"
},
@ -454,6 +460,9 @@
},
"message": {
"copy": "¡Texto copiado al portapapeles!"
},
"warning": {
"anonymous": "Compartir no funcionará porque esta manada no permite a los usuarios anónimos acceder al contenido."
}
},
"LibraryFollowButton": {
@ -477,6 +486,7 @@
"playPlaylist": "Vaciar lista de reproducción",
"playTrack": "Reproducir canción",
"playTracks": "Reproducir canción",
"report": "Reportar…",
"startRadio": "Reproducir canciones similares",
"trackDetails": "Detalles"
},
@ -506,7 +516,17 @@
"unmute": "Activar sonido"
},
"meta": {
"position": "{ index } de { length }"
"position": "{ index } de { length }",
"unknownAlbum": "Álbum desconocido",
"unknownArtist": "Artista desconocido"
}
},
"PlayerControls": {
"labels": {
"next": "Pista siguiente",
"pause": "Pausa",
"play": "Reproducir",
"previous": "Pista anterior"
}
},
"Search": {
@ -524,6 +544,9 @@
}
},
"SearchBar": {
"empty": {
"noResults": "Perdón, no hay resultados para esta búsqueda"
},
"header": {
"noResults": "No se han encontrado coincidencias"
},
@ -535,11 +558,13 @@
"podcasts": "Podcasts"
},
"search": "Buscar música",
"tag": "Etiqueta",
"track": "Canción"
},
"link": {
"fediverse": "Buscar en Wikipedia",
"more": "Más resultados 🡒"
"more": "Más resultados 🡒",
"rss": "Suscribirse a este podcast vía RSS"
},
"placeholder": {
"search": "Buscar artistas, álbumes, canciones…"
@ -652,6 +677,7 @@
},
"header": {
"appDetails": "Detalles de la aplicación",
"appSecretWarning": "Mantener una copia de este token en un lugar seguro.",
"editApp": "Error al aplicar la acción"
},
"help": {
@ -665,6 +691,9 @@
"link": {
"settings": "Volver a los ajustes"
},
"message": {
"appSecretWarning": "No serás capaz de verlo de nuevo una vez que dejes esta pantalla."
},
"title": "Error al aplicar la acción"
},
"ApplicationForm": {
@ -675,14 +704,22 @@
"header": {
"failure": "No podemos crear tu cuenta"
},
"help": {
"redirectUri": "Usa \"urn:ietf:wg:oauth:2.0:oob\" como URI de redirección si tu aplicación no está alojada en la web."
},
"label": {
"name": "Nombre",
"redirectUri": "Redireccionar URI",
"scopes": {
"description": "La comprobación de los ámbitos padre \"Lectura\" o \"Escritura\" implica el acceso a todos los ámbitos hijos correspondientes.",
"label": "Alcances",
"read": {
"description": "Acceso de sólo lectura a los datos del usuario",
"label": "Leer"
},
"write": {
"description": "Acceso de solo lectura a datos de usuario",
"label": "Escritura"
}
}
}
@ -703,10 +740,16 @@
"authorize": "Autorizar la aplicación de terceros",
"authorizeFailure": "Error al aplicar la acción",
"fetchFailure": "Error al crear la invitación",
"readOnly": "Sólo lectura"
"readOnly": "Sólo lectura",
"writeOnly": "Solo escritura"
},
"help": {
"pasteCode": "Copie y pegue el siguiente código en la aplicación:"
"copyCode": "Se te mostrará un código para copiar y pegar en la aplicación",
"pasteCode": "Copie y pegue el siguiente código en la aplicación:",
"redirect": "Serás redireccionado a { 0 }"
},
"message": {
"unknownPermissions": "La aplicación también está solicitando los siguientes permisos desconocidos:"
},
"title": "Autorizar la aplicación"
},
@ -729,6 +772,9 @@
"createAccount": "Crear una cuenta",
"resetPassword": "Restablecer tu contraseña"
},
"message": {
"redirect": "Serás redireccionado a {domain} para autenticar"
},
"placeholder": {
"username": "Introduce tu nombre de usuario o correo electrónico"
}
@ -779,22 +825,29 @@
"refresh": "Recargar",
"remove": "Quitar",
"removeApp": "Borrar lista de reproducción",
"revoke": "Revocar",
"revokeAccess": "Revocar acceso",
"update": "Actualizar",
"updateSettings": "Actualizar ajustes"
},
"description": {
"authorizedApps": "Esta es la lista de aplicaciones que tienen acceso a tus datos de la cuenta.",
"changeEmail": "Cambie la dirección de correo electrónico asociada a su cuenta. Le enviaremos una confirmación a la nueva dirección.",
"changePassword": {
"paragraph1": "Cambiar tu contraseña también cambiará la contraseña de la API de Subsonic, si pediste una.",
"paragraph2": "Tendrás que actualizar tu contraseña en los clientes que usan esta contraseña."
},
"contentFilters": "Los filtros de contenido te ayudan a ocultar los contenidos que no quieres ver en el servicio."
"contentFilters": "Los filtros de contenido te ayudan a ocultar los contenidos que no quieres ver en el servicio.",
"deleteAccount": "Puedes eliminar permanentemente e irreversiblemente tu cuenta y todos los datos asociados usando el siguiente formulario. Se te pedirá confirmación.",
"plugins": "Usa plugins para extender Funkwhale y obtener características adicionales.",
"yourApps": "Esta es la lista de aplicaciones que tienes registradas."
},
"header": {
"accountFailure": "No se puede iniciar la sesión",
"accountSettings": "Configuración de cuenta",
"authorizedApps": "Aplicaciones autorizadas",
"avatar": "Avatar",
"avatarFailure": "Tu avatar no puede ser guardado",
"changeEmail": "Confirma tu dirección de correo",
"changePassword": "Cambiar mi contraseña",
"contentFilters": "Filtros de contenido",
@ -803,6 +856,7 @@
"hiddenArtists": "Explorando artistas",
"noApps": "No tienes ninguna regla para esta cuenta.",
"noPersonalApps": "No tienes ninguna regla para esta cuenta.",
"passwordFailure": "Tu contraseña no puede ser cambiada",
"plugins": "Plugins",
"settingsUpdated": "Ajustes actualizados",
"updateFailure": "Ajustes actualizados",
@ -825,6 +879,7 @@
"newApp": "Crear una nueva lista de reproducción"
},
"message": {
"confirmDelete": "Tu solicitud de eliminación fue enviada, tu cuenta y contenido serán borrados en breve",
"currentEmail": "Tienes iniciada actualmente sesión como { email }."
},
"modal": {
@ -837,12 +892,22 @@
"header": "¿Cambiar tu contraseña?"
},
"deleteAccount": {
"content": {
"warning": "Esto es irreversible y borrará permanentemente tus datos de nuestros servidores. Se cerrará inmediatamente la sesión."
},
"header": "¿Quieres restaurar tu cola de reproducción anterior?"
},
"deleteApp": {
"content": {
"warning": "Esto borrará por completo esta lista de reproducción y no se podrá deshacer."
}
},
"header": "¿Borrar aplicación {app}?"
},
"revokeApp": {
"content": {
"warning": "Esto prevendrá que esta aplicación acceda al servicio en tu nombre."
},
"header": "¿Revocar el acceso para la aplicación {app}?"
}
},
"table": {
@ -861,11 +926,15 @@
"yourApps": {
"header": {
"application": "Aplicación",
"creationDate": "Fecha de creación"
"creationDate": "Fecha de creación",
"scopes": "Alcances"
}
}
},
"title": "Configuración de Cuenta"
"title": "Configuración de Cuenta",
"warning": {
"deleteAccount": "Tu cuneta será eliminada de nuestros servidores en unos minutos. También notificaremos a otros servidores que podrían copiar algunos de tus datos y así ellos procederán a la eliminación. Por favor tenga en cuenta que algunos de estos servidores podrían estar fuera de línea o no estar dispuestos a cumplir."
}
},
"SignupForm": {
"button": {
@ -877,10 +946,13 @@
},
"label": {
"email": "Dirección de correo electrónico",
"invitation": "Código de invitación",
"password": "Contraseña",
"username": "Nombre de usuario"
},
"message": {
"accountCreated": "Tu cuenta fue creada exitosamente. Por favor verifica tu dirección de correo electrónico antes de tratar de iniciar sesión.",
"awaitingReview": "Tu solicitud de datos fue enviada exitosamente. Se te notificará por correo electrónico cuando nuestro equipo de moderación halla revisado tu solicitud.",
"registrationClosed": "La inscripción a esta instancia está cerrada, necesitarás un código de invitación para inscribirte.",
"requiresReview": "Las inscripciones en este pod están abiertas, pero son revisadas por los moderadores antes de su aprobación."
},
@ -956,7 +1028,8 @@
},
"AlbumSelect": {
"label": {
"album": "Álbum"
"album": "Álbum",
"series": "Series"
},
"meta": {
"tracks": "{ n } canción | { n } canciones"
@ -981,6 +1054,7 @@
"auth": "Si dejas de seguir esta biblioteca, perderás acceso a su contenido"
},
"title": {
"subscribe": "Suscribirse",
"unsubscribe": "{ count } favorito"
}
},
@ -988,7 +1062,9 @@
"button": {
"edit": "Editar",
"ignore": "Ignorar",
"remove": "Quitar"
"remove": "Quitar",
"resume": "Resumen",
"retry": "Reintentar"
},
"description": {
"extensions": "Extensiones soportadas: { extensions }"
@ -1004,12 +1080,16 @@
"openBrowser": "Explorar…"
},
"message": {
"dragAndDrop": "Arrastre y suelte sus archivos aquí o abra el navegador para cargar sus archivos"
"dragAndDrop": "Arrastre y suelte sus archivos aquí o abra el navegador para cargar sus archivos",
"pending": "Tienes algunas cargas de borradores pendientes de publicación."
},
"status": {
"errored": "Error",
"pending": "En espera",
"uploading": "Subiendo"
},
"warning": {
"quota": "No tienes espacio disponible para subir tus archivos. Por favor contacta a los moderadores."
}
},
"UploadMetadataForm": {
@ -1017,6 +1097,7 @@
"description": "Descripción",
"image": "Nombre",
"position": "Paginación",
"tags": "Etiquetas",
"title": "Título"
}
},
@ -1037,7 +1118,8 @@
"uploadFiles": "¿Eliminar la biblioteca?"
},
"meta": {
"files": "{ n } archivo | { n } archivos"
"files": "{ n } archivo | { n } archivos",
"quota": "Almacenamiento restante: {space}"
}
}
},
@ -1048,6 +1130,7 @@
"go": "Ir",
"launch": "Iniciar",
"refresh": "Actualiza el contenido de la tabla",
"select": "Seleccionar",
"selectAll": "Seleccionar un filtro",
"selectCurrentPage": "Seleccionar solo la página actual",
"selectElement": "Seleccionar { n } elemento | Seleccionar los { n } elementos",
@ -1098,13 +1181,17 @@
},
"ContentForm": {
"button": {
"preview": "Previsualización"
"preview": "Previsualización",
"write": "Escribir"
},
"empty": {
"noContent": "Archivos pendientes."
},
"help": {
"markdown": "La sintaxis Markdown es compatible."
},
"placeholder": {
"input": "Escribe algunas palabras aquí…"
}
},
"CopyInput": {
@ -1140,6 +1227,7 @@
},
"ExpandableDiv": {
"button": {
"less": "Mostrar menos",
"more": "Mostrar 1 álbum adicional"
}
},
@ -1155,6 +1243,12 @@
}
},
"LoginModal": {
"description": {
"noAccess": "No tienes acceso"
},
"header": {
"unauthenticated": "No autenticado"
},
"link": {
"login": "Iniciar sesión",
"signup": "Inscripción"
@ -1164,6 +1258,7 @@
"button": {
"cancel": "Cancelar",
"edit": "Editar",
"less": "Mostrar menos",
"more": "Mostrar 1 álbum adicional",
"update": "Mi descripción molona"
},
@ -1174,10 +1269,16 @@
"failure": "Error al aplicar la acción"
}
},
"UserLink": {
"link": {
"username": "{'@'}{username}"
}
},
"UserMenu": {
"label": {
"language": "Cambiar idioma",
"shortcuts": "Atajos de teclado"
"shortcuts": "Atajos de teclado",
"theme": "Cambiar tema"
},
"link": {
"about": "Acerca de",
@ -1203,11 +1304,13 @@
},
"label": {
"language": "Cambiar idioma",
"shortcuts": "Atajos de teclado"
"shortcuts": "Atajos de teclado",
"theme": "Cambiar tema"
},
"link": {
"about": "Acerca de",
"chat": "Sala de chat",
"docs": "Documentación",
"forum": "Foro",
"git": "Sistema de seguimiento de incidentes",
"login": "Iniciar sesión",
@ -1265,6 +1368,8 @@
},
"description": {
"failure": "Ocurrió un error al intentar actualizar los datos:",
"pending": "Nuestro servidor no procesó a tiempo la solicitud de actualización. Se procesará más tarde.",
"skipped": "El servidor remoto respondió, pero los datos devueltos no son compatibles con Funkwhale.",
"success": "Los datos se han actualizado con éxito desde el servidor remoto."
},
"header": {
@ -1276,7 +1381,8 @@
"success": "Actualización exitosa"
},
"loader": {
"awaitingResult": "Cargando tus favoritos…"
"awaitingResult": "Cargando tus favoritos…",
"fetchRequest": "Solicitando una búsqueda…"
},
"table": {
"error": {
@ -1287,7 +1393,11 @@
"value": {
"connectionError": "Imposible conectar con el servidor remoto",
"httpError": "Ha ocurrido un error HTTP al contactar con el servidor remoto",
"invalidAttributesError": "Los datos devueltos por el servidor remoto tenían atributos inválidos o faltaban"
"httpStatus": "El servidor remoto respondió con HTTP {status}",
"invalidAttributesError": "Los datos devueltos por el servidor remoto tenían atributos inválidos o faltaban",
"invalidJsonError": "El servidor remoto devolvió datos JSON o JSON-LD no válidos",
"timeoutError": "El servidor remoto no respondió a tiempo",
"unknownError": "Error desconocido"
}
}
}
@ -1320,7 +1430,8 @@
"meta": {
"episodes": "{ n } episodio | { n } episodios",
"tracks": "{ n } canción | { n } canciones"
}
},
"title": "Álbum"
},
"AlbumDetail": {
"description": {
@ -1345,6 +1456,7 @@
},
"link": {
"discogs": "Buscar música",
"django": "Ver en el administrador de Django",
"domain": "Miembro desde { date }",
"moderation": "Actualizar regla de moderación",
"musicbrainz": "Ver en MusicBrainz"
@ -1365,6 +1477,9 @@
"header": {
"edit": "Reproducir canción",
"suggest": "No podemos añadir la canción a una lista de reproducción"
},
"message": {
"remote": "Este objeto es gestionado por otro servidor, no puedes editarlo."
}
},
"Albums": {
@ -1378,7 +1493,8 @@
"browse": "Explorando álbumes"
},
"label": {
"search": "Buscar"
"search": "Buscar",
"tags": "Etiquetas"
},
"link": {
"addMusic": "Añadir algo de música"
@ -1409,6 +1525,7 @@
},
"link": {
"discogs": "Buscar música",
"django": "Ver en el administrador de Django",
"domain": "Miembro desde { date }",
"moderation": "Actualizar regla de moderación",
"musicbrainz": "Ver en MusicBrainz",
@ -1440,12 +1557,18 @@
},
"link": {
"filter": "Ver archivos"
},
"message": {
"filter": "Actualmente estás ocultando contenido relacionado a este artista."
}
},
"ArtistEdit": {
"header": {
"edit": "Reproducir canción",
"suggest": "No podemos añadir la canción a una lista de reproducción"
},
"message": {
"remote": "Este objeto está gestionado por otro servidor, no puedes editarlo."
}
},
"Artists": {
@ -1461,7 +1584,8 @@
},
"label": {
"excludeCompilation": "Excluir recopilación de artistas",
"search": "Nombre del artista"
"search": "Nombre del artista",
"tags": "Etiquetas"
},
"ordering": {
"direction": {
@ -1488,7 +1612,13 @@
"header": {
"modification": "Fecha de modificación"
},
"link": {
"track": "Pista #{id} - {name}"
},
"modal": {
"content": {
"warning": "La sugerencia será borrada completamente, esta acción es irreversible."
},
"delete": {
"header": "¿Borrar esta sugerencia?"
}
@ -1513,13 +1643,29 @@
"EditForm": {
"button": {
"cancel": "Cancelar",
"clear": "Borrar"
"clear": "Borrar",
"new": "Enviar otra edición",
"reset": "Reiniciar al valor inicial",
"showAll": "Mostrar todas las ediciones",
"showUnreviewed": "Restringir las ediciones sin revición",
"submit": "Enviar y aplicar edición",
"suggest": "Enviar sugerencia"
},
"empty": {
"suggestEdit": "Sugerir un cambio usando el siguiente formulario"
},
"header": {
"failure": "Error al guardar los cambios",
"recentEdits": "Añadidos recientemente",
"success": "Tu edición fue enviada exitosamente.",
"unreviewed": "Ediciones recientes en espera de revisión"
},
"label": {
"summary": "Resumen (opcional)"
},
"message": {
"noPermission": "No tienes permiso para editar este objeto, pero puedes sugerir cambios. Una vez enviadas, las sugerencias serán revisadas antes de aprobarse."
},
"notApplicable": "N/A",
"placeholder": {
"summary": "Ha ocurrido un error al guardar los cambios."
@ -1531,15 +1677,21 @@
"retry": "Biblioteca actualizada"
},
"description": {
"import": "Reiniciar importación"
"import": "Reiniciar importación",
"previousImport": "Resultados de tu importación previa:"
},
"empty": {
"noFiles": "0"
},
"header": {
"failure": "Error al guardar los cambios",
"local": "Subir música de '~/tu almacenamiento local",
"server": "Estado de la importación",
"status": "Estado de la importación"
},
"label": {
"extensions": "Extensiones soportadas: { extensions }",
"remainingSpace": "Almacenamiento restante",
"uploadWidget": "Haga clic para seleccionar los archivos que desea cargar o arrastre y suelte los archivos o directorios"
},
"link": {
@ -1548,7 +1700,9 @@
"uploading": "Subiendo"
},
"message": {
"listener": "Esta página está pidiendo que confirmes que quieres irte - los dato que has ingresado podrían no guardarse.",
"local": {
"copyright": "No subas contenido con copyright en una biblioteca pública, de otro modo, podrías estar infringiendo la ley",
"format": "Las canciones que estás subiendo estén etiquetadas correctamente:",
"message": "Estás a punto de subir música a tu biblioteca. Antes de continuar asegúrate que:",
"tag": "Las canciones que estás subiendo estén etiquetadas correctamente."
@ -1562,6 +1716,7 @@
"size": "Tamaño",
"status": "Estado"
},
"progress": "{percent}%",
"status": {
"pending": "En espera",
"uploaded": "Subido",
@ -1573,6 +1728,7 @@
"denied": "Subida rechazada, asegúrate que el archivo no es demasiado grande y que no has alcanzado tu cuota",
"extension": "Tipo de archivo no válido, asegúrese de que está cargando un archivo de audio. Las extensiones de archivo admitidas son { extensions }",
"network": "Ha ocurrido un error de red al subir este archivo",
"retry": "Reintentar",
"size": "No es posible cargar este archivo, asegúrate que no es demasiado grande",
"timeout": "Timeout en la subida, intentalo de nuevo"
}
@ -1604,9 +1760,11 @@
"error": {
"importFailure": "Ocurrió un error durante el proceso de carga. Encontrará más información abajo.",
"invalidMetadata": {
"label": "Metadatos inválidos"
"label": "Metadatos inválidos",
"message": "Los metadatos incluidos en el archivo no son válidos o faltan algunos campos obligatorios."
},
"unknownError": {
"label": "Error desconocido",
"message": "Ha ocurrido un error desconocido"
}
},