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)/ - if: $CI_COMMIT_BRANCH =~ /(stable|develop)/
- changes: [api/**/*] - 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 cache: *api_cache
before_script: before_script:
- cd api - cd api
@ -339,7 +339,7 @@ build_api_schema:
# Add build_docs rules because it depends on the build_api_schema artifact # Add build_docs rules because it depends on the build_api_schema artifact
- changes: [docs/**/*] - changes: [docs/**/*]
image: $CI_REGISTRY/funkwhale/ci/python-funkwhale-api:3.11 image: $CI_REGISTRY/funkwhale/ci/python-funkwhale-api:3.13
services: services:
- postgres:15-alpine - postgres:15-alpine
- redis:7-alpine - redis:7-alpine
@ -357,6 +357,11 @@ build_api_schema:
- poetry run funkwhale-manage migrate - poetry run funkwhale-manage migrate
script: script:
- poetry run funkwhale-manage spectacular --file ../docs/schema.yml - 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: artifacts:
expire_in: 2 weeks expire_in: 2 weeks
paths: paths:

View File

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

File diff suppressed because it is too large Load Diff

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 }\"", "libraryAcceptFollow": "{ username } ha acceptat el seguiment de la biblioteca \"{ library }\"",
"libraryFollow": "{ username } ha seguit la teva biblioteca \"{ library }\"", "libraryFollow": "{ username } ha seguit la teva biblioteca \"{ library }\"",
"libraryPendingFollow": "{ username } vol seguir 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ó" "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": { "PlaylistModal": {
"button": { "button": {
"addDuplicate": "Afegeix de totes maneres", "addDuplicate": "Afegeix de totes maneres",
@ -3395,6 +3412,7 @@
"moderation": "Moderació", "moderation": "Moderació",
"music": "Música", "music": "Música",
"playlists": "Llistes de reproducció", "playlists": "Llistes de reproducció",
"qualityFilters": "Explora els filtres de qualitat de la pàgina",
"sections": "Seccions", "sections": "Seccions",
"security": "Seguretat", "security": "Seguretat",
"settings": "Paràmetres de la instància", "settings": "Paràmetres de la instància",
@ -4412,7 +4430,7 @@
}, },
"meta": { "meta": {
"failedTracks": "Pistes fallides: {tracks}", "failedTracks": "Pistes fallides: {tracks}",
"lastUpdate": "Última actualització: · ", "lastUpdate": "Última actualització:",
"tracks": "{ n } pista | { n } pistes" "tracks": "{ n } pista | { n } pistes"
}, },
"modal": { "modal": {

View File

@ -395,7 +395,8 @@
"help": { "help": {
"discography": "Publica la música que haces como una bonita discografía de álbumes y sencillos.", "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.", "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": { "label": {
"category": "Categoría", "category": "Categoría",
@ -407,8 +408,13 @@
"name": "Nombre", "name": "Nombre",
"owner": "Propietario", "owner": "Propietario",
"podcast": "Podcasts", "podcast": "Podcasts",
"subcategory": "Subcategoría",
"tags": "Etiquetas",
"username": "Manejo de Fediverse" "username": "Manejo de Fediverse"
}, },
"legend": {
"purpose": "¿Para qué será usado este canal?"
},
"loader": { "loader": {
"loading": "Subiendo" "loading": "Subiendo"
}, },
@ -454,6 +460,9 @@
}, },
"message": { "message": {
"copy": "¡Texto copiado al portapapeles!" "copy": "¡Texto copiado al portapapeles!"
},
"warning": {
"anonymous": "Compartir no funcionará porque esta manada no permite a los usuarios anónimos acceder al contenido."
} }
}, },
"LibraryFollowButton": { "LibraryFollowButton": {
@ -477,6 +486,7 @@
"playPlaylist": "Vaciar lista de reproducción", "playPlaylist": "Vaciar lista de reproducción",
"playTrack": "Reproducir canción", "playTrack": "Reproducir canción",
"playTracks": "Reproducir canción", "playTracks": "Reproducir canción",
"report": "Reportar…",
"startRadio": "Reproducir canciones similares", "startRadio": "Reproducir canciones similares",
"trackDetails": "Detalles" "trackDetails": "Detalles"
}, },
@ -506,7 +516,17 @@
"unmute": "Activar sonido" "unmute": "Activar sonido"
}, },
"meta": { "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": { "Search": {
@ -524,6 +544,9 @@
} }
}, },
"SearchBar": { "SearchBar": {
"empty": {
"noResults": "Perdón, no hay resultados para esta búsqueda"
},
"header": { "header": {
"noResults": "No se han encontrado coincidencias" "noResults": "No se han encontrado coincidencias"
}, },
@ -535,11 +558,13 @@
"podcasts": "Podcasts" "podcasts": "Podcasts"
}, },
"search": "Buscar música", "search": "Buscar música",
"tag": "Etiqueta",
"track": "Canción" "track": "Canción"
}, },
"link": { "link": {
"fediverse": "Buscar en Wikipedia", "fediverse": "Buscar en Wikipedia",
"more": "Más resultados 🡒" "more": "Más resultados 🡒",
"rss": "Suscribirse a este podcast vía RSS"
}, },
"placeholder": { "placeholder": {
"search": "Buscar artistas, álbumes, canciones…" "search": "Buscar artistas, álbumes, canciones…"
@ -652,6 +677,7 @@
}, },
"header": { "header": {
"appDetails": "Detalles de la aplicación", "appDetails": "Detalles de la aplicación",
"appSecretWarning": "Mantener una copia de este token en un lugar seguro.",
"editApp": "Error al aplicar la acción" "editApp": "Error al aplicar la acción"
}, },
"help": { "help": {
@ -665,6 +691,9 @@
"link": { "link": {
"settings": "Volver a los ajustes" "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" "title": "Error al aplicar la acción"
}, },
"ApplicationForm": { "ApplicationForm": {
@ -675,14 +704,22 @@
"header": { "header": {
"failure": "No podemos crear tu cuenta" "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": { "label": {
"name": "Nombre", "name": "Nombre",
"redirectUri": "Redireccionar URI", "redirectUri": "Redireccionar URI",
"scopes": { "scopes": {
"description": "La comprobación de los ámbitos padre \"Lectura\" o \"Escritura\" implica el acceso a todos los ámbitos hijos correspondientes.", "description": "La comprobación de los ámbitos padre \"Lectura\" o \"Escritura\" implica el acceso a todos los ámbitos hijos correspondientes.",
"label": "Alcances",
"read": { "read": {
"description": "Acceso de sólo lectura a los datos del usuario", "description": "Acceso de sólo lectura a los datos del usuario",
"label": "Leer" "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", "authorize": "Autorizar la aplicación de terceros",
"authorizeFailure": "Error al aplicar la acción", "authorizeFailure": "Error al aplicar la acción",
"fetchFailure": "Error al crear la invitación", "fetchFailure": "Error al crear la invitación",
"readOnly": "Sólo lectura" "readOnly": "Sólo lectura",
"writeOnly": "Solo escritura"
}, },
"help": { "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" "title": "Autorizar la aplicación"
}, },
@ -729,6 +772,9 @@
"createAccount": "Crear una cuenta", "createAccount": "Crear una cuenta",
"resetPassword": "Restablecer tu contraseña" "resetPassword": "Restablecer tu contraseña"
}, },
"message": {
"redirect": "Serás redireccionado a {domain} para autenticar"
},
"placeholder": { "placeholder": {
"username": "Introduce tu nombre de usuario o correo electrónico" "username": "Introduce tu nombre de usuario o correo electrónico"
} }
@ -779,22 +825,29 @@
"refresh": "Recargar", "refresh": "Recargar",
"remove": "Quitar", "remove": "Quitar",
"removeApp": "Borrar lista de reproducción", "removeApp": "Borrar lista de reproducción",
"revoke": "Revocar",
"revokeAccess": "Revocar acceso",
"update": "Actualizar", "update": "Actualizar",
"updateSettings": "Actualizar ajustes" "updateSettings": "Actualizar ajustes"
}, },
"description": { "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.", "changeEmail": "Cambie la dirección de correo electrónico asociada a su cuenta. Le enviaremos una confirmación a la nueva dirección.",
"changePassword": { "changePassword": {
"paragraph1": "Cambiar tu contraseña también cambiará la contraseña de la API de Subsonic, si pediste una.", "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." "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": { "header": {
"accountFailure": "No se puede iniciar la sesión", "accountFailure": "No se puede iniciar la sesión",
"accountSettings": "Configuración de cuenta", "accountSettings": "Configuración de cuenta",
"authorizedApps": "Aplicaciones autorizadas", "authorizedApps": "Aplicaciones autorizadas",
"avatar": "Avatar", "avatar": "Avatar",
"avatarFailure": "Tu avatar no puede ser guardado",
"changeEmail": "Confirma tu dirección de correo", "changeEmail": "Confirma tu dirección de correo",
"changePassword": "Cambiar mi contraseña", "changePassword": "Cambiar mi contraseña",
"contentFilters": "Filtros de contenido", "contentFilters": "Filtros de contenido",
@ -803,6 +856,7 @@
"hiddenArtists": "Explorando artistas", "hiddenArtists": "Explorando artistas",
"noApps": "No tienes ninguna regla para esta cuenta.", "noApps": "No tienes ninguna regla para esta cuenta.",
"noPersonalApps": "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", "plugins": "Plugins",
"settingsUpdated": "Ajustes actualizados", "settingsUpdated": "Ajustes actualizados",
"updateFailure": "Ajustes actualizados", "updateFailure": "Ajustes actualizados",
@ -825,6 +879,7 @@
"newApp": "Crear una nueva lista de reproducción" "newApp": "Crear una nueva lista de reproducción"
}, },
"message": { "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 }." "currentEmail": "Tienes iniciada actualmente sesión como { email }."
}, },
"modal": { "modal": {
@ -837,12 +892,22 @@
"header": "¿Cambiar tu contraseña?" "header": "¿Cambiar tu contraseña?"
}, },
"deleteAccount": { "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?" "header": "¿Quieres restaurar tu cola de reproducción anterior?"
}, },
"deleteApp": { "deleteApp": {
"content": { "content": {
"warning": "Esto borrará por completo esta lista de reproducción y no se podrá deshacer." "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": { "table": {
@ -861,11 +926,15 @@
"yourApps": { "yourApps": {
"header": { "header": {
"application": "Aplicación", "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": { "SignupForm": {
"button": { "button": {
@ -877,10 +946,13 @@
}, },
"label": { "label": {
"email": "Dirección de correo electrónico", "email": "Dirección de correo electrónico",
"invitation": "Código de invitación",
"password": "Contraseña", "password": "Contraseña",
"username": "Nombre de usuario" "username": "Nombre de usuario"
}, },
"message": { "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.", "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." "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": { "AlbumSelect": {
"label": { "label": {
"album": "Álbum" "album": "Álbum",
"series": "Series"
}, },
"meta": { "meta": {
"tracks": "{ n } canción | { n } canciones" "tracks": "{ n } canción | { n } canciones"
@ -981,6 +1054,7 @@
"auth": "Si dejas de seguir esta biblioteca, perderás acceso a su contenido" "auth": "Si dejas de seguir esta biblioteca, perderás acceso a su contenido"
}, },
"title": { "title": {
"subscribe": "Suscribirse",
"unsubscribe": "{ count } favorito" "unsubscribe": "{ count } favorito"
} }
}, },
@ -988,7 +1062,9 @@
"button": { "button": {
"edit": "Editar", "edit": "Editar",
"ignore": "Ignorar", "ignore": "Ignorar",
"remove": "Quitar" "remove": "Quitar",
"resume": "Resumen",
"retry": "Reintentar"
}, },
"description": { "description": {
"extensions": "Extensiones soportadas: { extensions }" "extensions": "Extensiones soportadas: { extensions }"
@ -1004,12 +1080,16 @@
"openBrowser": "Explorar…" "openBrowser": "Explorar…"
}, },
"message": { "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": { "status": {
"errored": "Error", "errored": "Error",
"pending": "En espera", "pending": "En espera",
"uploading": "Subiendo" "uploading": "Subiendo"
},
"warning": {
"quota": "No tienes espacio disponible para subir tus archivos. Por favor contacta a los moderadores."
} }
}, },
"UploadMetadataForm": { "UploadMetadataForm": {
@ -1017,6 +1097,7 @@
"description": "Descripción", "description": "Descripción",
"image": "Nombre", "image": "Nombre",
"position": "Paginación", "position": "Paginación",
"tags": "Etiquetas",
"title": "Título" "title": "Título"
} }
}, },
@ -1037,7 +1118,8 @@
"uploadFiles": "¿Eliminar la biblioteca?" "uploadFiles": "¿Eliminar la biblioteca?"
}, },
"meta": { "meta": {
"files": "{ n } archivo | { n } archivos" "files": "{ n } archivo | { n } archivos",
"quota": "Almacenamiento restante: {space}"
} }
} }
}, },
@ -1048,6 +1130,7 @@
"go": "Ir", "go": "Ir",
"launch": "Iniciar", "launch": "Iniciar",
"refresh": "Actualiza el contenido de la tabla", "refresh": "Actualiza el contenido de la tabla",
"select": "Seleccionar",
"selectAll": "Seleccionar un filtro", "selectAll": "Seleccionar un filtro",
"selectCurrentPage": "Seleccionar solo la página actual", "selectCurrentPage": "Seleccionar solo la página actual",
"selectElement": "Seleccionar { n } elemento | Seleccionar los { n } elementos", "selectElement": "Seleccionar { n } elemento | Seleccionar los { n } elementos",
@ -1098,13 +1181,17 @@
}, },
"ContentForm": { "ContentForm": {
"button": { "button": {
"preview": "Previsualización" "preview": "Previsualización",
"write": "Escribir"
}, },
"empty": { "empty": {
"noContent": "Archivos pendientes." "noContent": "Archivos pendientes."
}, },
"help": { "help": {
"markdown": "La sintaxis Markdown es compatible." "markdown": "La sintaxis Markdown es compatible."
},
"placeholder": {
"input": "Escribe algunas palabras aquí…"
} }
}, },
"CopyInput": { "CopyInput": {
@ -1140,6 +1227,7 @@
}, },
"ExpandableDiv": { "ExpandableDiv": {
"button": { "button": {
"less": "Mostrar menos",
"more": "Mostrar 1 álbum adicional" "more": "Mostrar 1 álbum adicional"
} }
}, },
@ -1155,6 +1243,12 @@
} }
}, },
"LoginModal": { "LoginModal": {
"description": {
"noAccess": "No tienes acceso"
},
"header": {
"unauthenticated": "No autenticado"
},
"link": { "link": {
"login": "Iniciar sesión", "login": "Iniciar sesión",
"signup": "Inscripción" "signup": "Inscripción"
@ -1164,6 +1258,7 @@
"button": { "button": {
"cancel": "Cancelar", "cancel": "Cancelar",
"edit": "Editar", "edit": "Editar",
"less": "Mostrar menos",
"more": "Mostrar 1 álbum adicional", "more": "Mostrar 1 álbum adicional",
"update": "Mi descripción molona" "update": "Mi descripción molona"
}, },
@ -1174,10 +1269,16 @@
"failure": "Error al aplicar la acción" "failure": "Error al aplicar la acción"
} }
}, },
"UserLink": {
"link": {
"username": "{'@'}{username}"
}
},
"UserMenu": { "UserMenu": {
"label": { "label": {
"language": "Cambiar idioma", "language": "Cambiar idioma",
"shortcuts": "Atajos de teclado" "shortcuts": "Atajos de teclado",
"theme": "Cambiar tema"
}, },
"link": { "link": {
"about": "Acerca de", "about": "Acerca de",
@ -1203,11 +1304,13 @@
}, },
"label": { "label": {
"language": "Cambiar idioma", "language": "Cambiar idioma",
"shortcuts": "Atajos de teclado" "shortcuts": "Atajos de teclado",
"theme": "Cambiar tema"
}, },
"link": { "link": {
"about": "Acerca de", "about": "Acerca de",
"chat": "Sala de chat", "chat": "Sala de chat",
"docs": "Documentación",
"forum": "Foro", "forum": "Foro",
"git": "Sistema de seguimiento de incidentes", "git": "Sistema de seguimiento de incidentes",
"login": "Iniciar sesión", "login": "Iniciar sesión",
@ -1265,6 +1368,8 @@
}, },
"description": { "description": {
"failure": "Ocurrió un error al intentar actualizar los datos:", "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." "success": "Los datos se han actualizado con éxito desde el servidor remoto."
}, },
"header": { "header": {
@ -1276,7 +1381,8 @@
"success": "Actualización exitosa" "success": "Actualización exitosa"
}, },
"loader": { "loader": {
"awaitingResult": "Cargando tus favoritos…" "awaitingResult": "Cargando tus favoritos…",
"fetchRequest": "Solicitando una búsqueda…"
}, },
"table": { "table": {
"error": { "error": {
@ -1287,7 +1393,11 @@
"value": { "value": {
"connectionError": "Imposible conectar con el servidor remoto", "connectionError": "Imposible conectar con el servidor remoto",
"httpError": "Ha ocurrido un error HTTP al contactar 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": { "meta": {
"episodes": "{ n } episodio | { n } episodios", "episodes": "{ n } episodio | { n } episodios",
"tracks": "{ n } canción | { n } canciones" "tracks": "{ n } canción | { n } canciones"
} },
"title": "Álbum"
}, },
"AlbumDetail": { "AlbumDetail": {
"description": { "description": {
@ -1345,6 +1456,7 @@
}, },
"link": { "link": {
"discogs": "Buscar música", "discogs": "Buscar música",
"django": "Ver en el administrador de Django",
"domain": "Miembro desde { date }", "domain": "Miembro desde { date }",
"moderation": "Actualizar regla de moderación", "moderation": "Actualizar regla de moderación",
"musicbrainz": "Ver en MusicBrainz" "musicbrainz": "Ver en MusicBrainz"
@ -1365,6 +1477,9 @@
"header": { "header": {
"edit": "Reproducir canción", "edit": "Reproducir canción",
"suggest": "No podemos añadir la canción a una lista de reproducció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": { "Albums": {
@ -1378,7 +1493,8 @@
"browse": "Explorando álbumes" "browse": "Explorando álbumes"
}, },
"label": { "label": {
"search": "Buscar" "search": "Buscar",
"tags": "Etiquetas"
}, },
"link": { "link": {
"addMusic": "Añadir algo de música" "addMusic": "Añadir algo de música"
@ -1409,6 +1525,7 @@
}, },
"link": { "link": {
"discogs": "Buscar música", "discogs": "Buscar música",
"django": "Ver en el administrador de Django",
"domain": "Miembro desde { date }", "domain": "Miembro desde { date }",
"moderation": "Actualizar regla de moderación", "moderation": "Actualizar regla de moderación",
"musicbrainz": "Ver en MusicBrainz", "musicbrainz": "Ver en MusicBrainz",
@ -1440,12 +1557,18 @@
}, },
"link": { "link": {
"filter": "Ver archivos" "filter": "Ver archivos"
},
"message": {
"filter": "Actualmente estás ocultando contenido relacionado a este artista."
} }
}, },
"ArtistEdit": { "ArtistEdit": {
"header": { "header": {
"edit": "Reproducir canción", "edit": "Reproducir canción",
"suggest": "No podemos añadir la canción a una lista de reproducció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": { "Artists": {
@ -1461,7 +1584,8 @@
}, },
"label": { "label": {
"excludeCompilation": "Excluir recopilación de artistas", "excludeCompilation": "Excluir recopilación de artistas",
"search": "Nombre del artista" "search": "Nombre del artista",
"tags": "Etiquetas"
}, },
"ordering": { "ordering": {
"direction": { "direction": {
@ -1488,7 +1612,13 @@
"header": { "header": {
"modification": "Fecha de modificación" "modification": "Fecha de modificación"
}, },
"link": {
"track": "Pista #{id} - {name}"
},
"modal": { "modal": {
"content": {
"warning": "La sugerencia será borrada completamente, esta acción es irreversible."
},
"delete": { "delete": {
"header": "¿Borrar esta sugerencia?" "header": "¿Borrar esta sugerencia?"
} }
@ -1513,13 +1643,29 @@
"EditForm": { "EditForm": {
"button": { "button": {
"cancel": "Cancelar", "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": { "header": {
"failure": "Error al guardar los cambios", "failure": "Error al guardar los cambios",
"recentEdits": "Añadidos recientemente", "recentEdits": "Añadidos recientemente",
"success": "Tu edición fue enviada exitosamente.",
"unreviewed": "Ediciones recientes en espera de revisión" "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", "notApplicable": "N/A",
"placeholder": { "placeholder": {
"summary": "Ha ocurrido un error al guardar los cambios." "summary": "Ha ocurrido un error al guardar los cambios."
@ -1531,15 +1677,21 @@
"retry": "Biblioteca actualizada" "retry": "Biblioteca actualizada"
}, },
"description": { "description": {
"import": "Reiniciar importación" "import": "Reiniciar importación",
"previousImport": "Resultados de tu importación previa:"
},
"empty": {
"noFiles": "0"
}, },
"header": { "header": {
"failure": "Error al guardar los cambios", "failure": "Error al guardar los cambios",
"local": "Subir música de '~/tu almacenamiento local",
"server": "Estado de la importación", "server": "Estado de la importación",
"status": "Estado de la importación" "status": "Estado de la importación"
}, },
"label": { "label": {
"extensions": "Extensiones soportadas: { extensions }", "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" "uploadWidget": "Haga clic para seleccionar los archivos que desea cargar o arrastre y suelte los archivos o directorios"
}, },
"link": { "link": {
@ -1548,7 +1700,9 @@
"uploading": "Subiendo" "uploading": "Subiendo"
}, },
"message": { "message": {
"listener": "Esta página está pidiendo que confirmes que quieres irte - los dato que has ingresado podrían no guardarse.",
"local": { "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:", "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:", "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." "tag": "Las canciones que estás subiendo estén etiquetadas correctamente."
@ -1562,6 +1716,7 @@
"size": "Tamaño", "size": "Tamaño",
"status": "Estado" "status": "Estado"
}, },
"progress": "{percent}%",
"status": { "status": {
"pending": "En espera", "pending": "En espera",
"uploaded": "Subido", "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", "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 }", "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", "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", "size": "No es posible cargar este archivo, asegúrate que no es demasiado grande",
"timeout": "Timeout en la subida, intentalo de nuevo" "timeout": "Timeout en la subida, intentalo de nuevo"
} }
@ -1604,9 +1760,11 @@
"error": { "error": {
"importFailure": "Ocurrió un error durante el proceso de carga. Encontrará más información abajo.", "importFailure": "Ocurrió un error durante el proceso de carga. Encontrará más información abajo.",
"invalidMetadata": { "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": { "unknownError": {
"label": "Error desconocido",
"message": "Ha ocurrido un error desconocido" "message": "Ha ocurrido un error desconocido"
} }
}, },