mirror of
https://github.com/navidrome/navidrome.git
synced 2026-04-28 03:19:38 +00:00
Some checks are pending
Pipeline: Test, Lint, Build / Push to Docker Hub (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Get version info (push) Waiting to run
Pipeline: Test, Lint, Build / Lint Go code (push) Waiting to run
Pipeline: Test, Lint, Build / Test Go code (push) Waiting to run
Pipeline: Test, Lint, Build / Test JS code (push) Waiting to run
Pipeline: Test, Lint, Build / Lint i18n files (push) Waiting to run
Pipeline: Test, Lint, Build / Check Docker configuration (push) Waiting to run
Pipeline: Test, Lint, Build / Cleanup digest artifacts (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-1 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-2 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-3 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-4 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-5 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-6 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-7 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-8 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-9 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-10 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Push to GHCR (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build Windows installers (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Package/Release (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Upload Linux PKG (push) Blocked by required conditions
POEditor export / push-translations (push) Has been skipped
* feat: add shared ImageUploadService for entity image management * feat: add UploadedImage field and methods to Artist model * feat: add uploaded_image column to artist table * feat: add ArtistImageFolder config option * refactor: wire ImageUploadService and delegate playlist file ops to it Wire ImageUploadService into the DI container and refactor the playlist service to delegate image file operations (SetImage/RemoveImage) to the shared ImageUploadService, removing duplicated file I/O logic. A local ImageUploadService interface is defined in core/playlists to avoid an import cycle between core and core/playlists. * feat: artist artwork reader checks uploaded image first * feat: add image-folder priority source for artist artwork * feat: cache key invalidation for image-folder and uploaded images * refactor: extract shared image upload HTTP helpers * feat: add artist image upload/delete API endpoints * refactor: playlist handlers use shared image upload helpers * feat: add shared ImageUploadOverlay component * feat: add i18n keys for artist image upload * feat: add image upload overlay to artist detail pages * refactor: playlist details uses shared ImageUploadOverlay component * fix: add gosec nolint directive for ParseMultipartForm * refactor: deduplicate image upload code and optimize dir scanning - Remove dead ImageFilename methods from Artist and Playlist models (production code uses core.imageFilename exclusively) - Extract shared uploadedImagePath helper in model/image.go - Extract findImageInArtistFolder to deduplicate dir-scanning logic between fromArtistImageFolder and getArtistImageFolderModTime - Fix fileInputRef in useCallback dependency array * fix: include artist UpdatedAt in artwork cache key Without this, uploading or deleting an artist image would not invalidate the cached artwork because the cache key was only based on album folder timestamps, not the artist's own UpdatedAt field. * feat: add Portuguese translations for artist image upload * refactor: use shared i18n keys for cover art upload messages Move cover art upload/remove translations from per-entity sections (artist, playlist) to a shared top-level "message" section, avoiding duplication across entity types and translation files. * refactor: move cover art i18n keys to shared message section for all languages * refactor: simplify image upload code and eliminate redundancies Extracted duplicate image loading/lightbox state logic from DesktopArtistDetails and MobileArtistDetails into a shared useArtistImageState hook. Moved entity type constants to the consts package and replaced raw string literals throughout model, core, and nativeapi packages. Exported model.UploadedImagePath and reused it in core/image_upload.go to consolidate path construction. Cached the ArtistImageFolder lookup result in artistReader to eliminate a redundant os.ReadDir call on every artwork request. Signed-off-by: Deluan <deluan@navidrome.org> * style: fix prettier formatting in ImageUploadOverlay * fix: address code review feedback on image upload error handling - RemoveImage now returns errors instead of swallowing them - Artist handlers distinguish not-found from other DB errors - Defer multipart temp file cleanup after parsing * fix: enforce hard request size limit with MaxBytesReader for image uploads Signed-off-by: Deluan <deluan@navidrome.org> --------- Signed-off-by: Deluan <deluan@navidrome.org>
715 lines
28 KiB
JSON
715 lines
28 KiB
JSON
{
|
|
"languageName": "Español",
|
|
"resources": {
|
|
"song": {
|
|
"name": "Canción |||| Canciones",
|
|
"fields": {
|
|
"albumArtist": "Artista del álbum",
|
|
"duration": "Duración",
|
|
"trackNumber": "#",
|
|
"playCount": "Reproducciones",
|
|
"title": "Título",
|
|
"artist": "Artista",
|
|
"album": "Álbum",
|
|
"path": "Ruta del archivo",
|
|
"genre": "Género",
|
|
"compilation": "Compilación",
|
|
"year": "Año",
|
|
"size": "Tamaño del archivo",
|
|
"updatedAt": "Actualizado el",
|
|
"bitRate": "Tasa de bits",
|
|
"discSubtitle": "Subtítulo del disco",
|
|
"starred": "Favorito",
|
|
"comment": "Comentario",
|
|
"rating": "Calificación",
|
|
"quality": "Calidad",
|
|
"bpm": "BPM",
|
|
"playDate": "Últimas reproducciones",
|
|
"channels": "Canales",
|
|
"createdAt": "Creado el",
|
|
"grouping": "Agrupación",
|
|
"mood": "Estado de ánimo",
|
|
"participants": "Participantes",
|
|
"tags": "Etiquetas",
|
|
"mappedTags": "Etiquetas asignadas",
|
|
"rawTags": "Etiquetas sin procesar",
|
|
"bitDepth": "Profundidad de bits",
|
|
"sampleRate": "Frecuencia de muestreo",
|
|
"missing": "Faltante",
|
|
"libraryName": "Biblioteca",
|
|
"composer": "Compositor",
|
|
"disc": ""
|
|
},
|
|
"actions": {
|
|
"addToQueue": "Reproducir después",
|
|
"playNow": "Reproducir ahora",
|
|
"addToPlaylist": "Agregar a la playlist",
|
|
"shuffleAll": "Todas aleatorias",
|
|
"download": "Descarga",
|
|
"playNext": "Siguiente",
|
|
"info": "Obtener información",
|
|
"showInPlaylist": "Mostrar en la lista de reproducción",
|
|
"instantMix": "Mezcla instantánea"
|
|
}
|
|
},
|
|
"album": {
|
|
"name": "Álbum |||| Álbumes",
|
|
"fields": {
|
|
"albumArtist": "Artista del álbum",
|
|
"artist": "Artista",
|
|
"duration": "Duración",
|
|
"songCount": "Canciones",
|
|
"playCount": "Reproducciones",
|
|
"name": "Nombre",
|
|
"genre": "Género",
|
|
"compilation": "Compilación",
|
|
"year": "Año",
|
|
"updatedAt": "Actualizado el",
|
|
"comment": "Comentario",
|
|
"rating": "Calificación",
|
|
"createdAt": "Creado el",
|
|
"size": "Tamaño del archivo",
|
|
"originalDate": "Original",
|
|
"releaseDate": "Publicado",
|
|
"releases": "Lanzamiento |||| Lanzamientos",
|
|
"released": "Publicado",
|
|
"recordLabel": "Discográfica",
|
|
"catalogNum": "Número de catálogo",
|
|
"releaseType": "Tipo de lanzamiento",
|
|
"grouping": "Agrupación",
|
|
"media": "Medios",
|
|
"mood": "Estado de ánimo",
|
|
"date": "Fecha de grabación",
|
|
"missing": "Faltante",
|
|
"libraryName": "Biblioteca"
|
|
},
|
|
"actions": {
|
|
"playAll": "Reproducir",
|
|
"playNext": "Reproducir siguiente",
|
|
"addToQueue": "Reproducir después",
|
|
"shuffle": "Aleatorio",
|
|
"addToPlaylist": "Agregar a la lista",
|
|
"download": "Descargar",
|
|
"info": "Obtener información",
|
|
"share": "Compartir"
|
|
},
|
|
"lists": {
|
|
"all": "Todos",
|
|
"random": "Aleatorio",
|
|
"recentlyAdded": "Recientes",
|
|
"recentlyPlayed": "Recientes",
|
|
"mostPlayed": "Más reproducidos",
|
|
"starred": "Favoritos",
|
|
"topRated": "Mejor calificados"
|
|
}
|
|
},
|
|
"artist": {
|
|
"name": "Artista |||| Artistas",
|
|
"fields": {
|
|
"name": "Nombre",
|
|
"albumCount": "Número de álbumes",
|
|
"songCount": "Número de canciones",
|
|
"playCount": "Reproducciones",
|
|
"rating": "Calificación",
|
|
"genre": "Género",
|
|
"size": "Tamaño",
|
|
"role": "Rol",
|
|
"missing": "Faltante"
|
|
},
|
|
"roles": {
|
|
"albumartist": "Artista del álbum |||| Artistas del álbum",
|
|
"artist": "Artista |||| Artistas",
|
|
"composer": "Compositor |||| Compositores",
|
|
"conductor": "Director de orquesta |||| Directores de orquesta",
|
|
"lyricist": "Letrista |||| Letristas",
|
|
"arranger": "Arreglista |||| Arreglistas",
|
|
"producer": "Productor |||| Productores",
|
|
"director": "Director |||| Directores",
|
|
"engineer": "Ingeniero de sonido |||| Ingenieros de sonido",
|
|
"mixer": "Mezclador |||| Mezcladores",
|
|
"remixer": "Remezclador |||| Remezcladores",
|
|
"djmixer": "DJ Mezclador |||| DJ Mezcladores",
|
|
"performer": "Intérprete |||| Intérpretes",
|
|
"maincredit": "Artista del álbum o Artista |||| Artistas del álbum o Artistas"
|
|
},
|
|
"actions": {
|
|
"shuffle": "Aleatorio",
|
|
"radio": "Radio",
|
|
"topSongs": "Más destacadas"
|
|
}
|
|
},
|
|
"user": {
|
|
"name": "Usuario |||| Usuarios",
|
|
"fields": {
|
|
"userName": "Nombre de usuario",
|
|
"isAdmin": "Es administrador",
|
|
"lastLoginAt": "Último inicio de sesión",
|
|
"updatedAt": "Actualizado el",
|
|
"name": "Nombre",
|
|
"password": "Contraseña",
|
|
"createdAt": "Creado el",
|
|
"changePassword": "¿Cambiar contraseña?",
|
|
"currentPassword": "Contraseña actual",
|
|
"newPassword": "Nueva contraseña",
|
|
"token": "Token",
|
|
"lastAccessAt": "Último acceso",
|
|
"libraries": "Bibliotecas"
|
|
},
|
|
"helperTexts": {
|
|
"name": "Los cambios a tu nombre se verán en el próximo inicio de sesión",
|
|
"libraries": "Selecciona bibliotecas específicas para este usuario o déjalo vacío para usar las bibliotecas por defecto"
|
|
},
|
|
"notifications": {
|
|
"created": "Usuario creado",
|
|
"updated": "Usuario actualizado",
|
|
"deleted": "Usuario eliminado"
|
|
},
|
|
"message": {
|
|
"listenBrainzToken": "Escribe tu token de usuario de ListenBrainz",
|
|
"clickHereForToken": "Click aquí para obtener tu token",
|
|
"selectAllLibraries": "Seleccionar todas las bibliotecas",
|
|
"adminAutoLibraries": "Los usuarios administradores tienen acceso a todas las bibliotecas automáticamente"
|
|
},
|
|
"validation": {
|
|
"librariesRequired": "Se debe seleccionar al menos una biblioteca para los usuarios que no sean administradores"
|
|
}
|
|
},
|
|
"player": {
|
|
"name": "Reproductor |||| Reproductores",
|
|
"fields": {
|
|
"name": "Nombre",
|
|
"transcodingId": "Transcodificación",
|
|
"maxBitRate": "Tasa de bits Máx.",
|
|
"client": "Cliente",
|
|
"userName": "Usuario",
|
|
"lastSeen": "Última conexión",
|
|
"reportRealPath": "Reporta la ruta absoluta",
|
|
"scrobbleEnabled": "Envía los scrobbles a servicios externos"
|
|
}
|
|
},
|
|
"transcoding": {
|
|
"name": "Transcodificación |||| Transcodificaciones",
|
|
"fields": {
|
|
"name": "Nombre",
|
|
"targetFormat": "Formato de destino",
|
|
"defaultBitRate": "Tasa de bits por defecto",
|
|
"command": "Comando"
|
|
}
|
|
},
|
|
"playlist": {
|
|
"name": "Lista |||| Listas",
|
|
"fields": {
|
|
"name": "Nombre",
|
|
"duration": "Duración",
|
|
"ownerName": "Dueño",
|
|
"public": "Público",
|
|
"updatedAt": "Actualizado el",
|
|
"createdAt": "Creado el",
|
|
"songCount": "Canciones",
|
|
"comment": "Comentario",
|
|
"sync": "Auto-importados",
|
|
"path": "Importados de"
|
|
},
|
|
"actions": {
|
|
"selectPlaylist": "Seleccione una lista:",
|
|
"addNewPlaylist": "Creada \"%{name}\"",
|
|
"export": "Exportar",
|
|
"makePublic": "Hazla pública",
|
|
"makePrivate": "Hazla privada",
|
|
"saveQueue": "Guardar la fila de reproducción en una playlist",
|
|
"searchOrCreate": "Buscar listas de reproducción o escribe para crear una nueva…",
|
|
"pressEnterToCreate": "Pulsa Enter para crear una nueva lista de reproducción",
|
|
"removeFromSelection": "Quitar de la selección"
|
|
},
|
|
"message": {
|
|
"duplicate_song": "Algunas de las canciones seleccionadas están presentes en la playlist",
|
|
"song_exist": "Se están agregando duplicados a la playlist. ¿Quieres agregar los duplicados o omitirlos?",
|
|
"noPlaylistsFound": "No se encontraron listas de reproducción",
|
|
"noPlaylists": "No hay listas de reproducción disponibles"
|
|
}
|
|
},
|
|
"radio": {
|
|
"name": "Radio |||| Radios",
|
|
"fields": {
|
|
"name": "Nombre",
|
|
"streamUrl": "URL del stream",
|
|
"homePageUrl": "URL de la página web",
|
|
"updatedAt": "Actualizado el",
|
|
"createdAt": "Creado el"
|
|
},
|
|
"actions": {
|
|
"playNow": "Reproducir ahora"
|
|
}
|
|
},
|
|
"share": {
|
|
"name": "Compartir |||| Compartidos",
|
|
"fields": {
|
|
"username": "Compartido por",
|
|
"url": "URL",
|
|
"description": "Descripción",
|
|
"contents": "Contenido",
|
|
"expiresAt": "Caduca el",
|
|
"lastVisitedAt": "Visitado por última vez el",
|
|
"visitCount": "Número de visitas",
|
|
"format": "Formato",
|
|
"maxBitRate": "Tasa de bits Máx.",
|
|
"updatedAt": "Actualizado el",
|
|
"createdAt": "Creado el",
|
|
"downloadable": "¿Permitir descargas?"
|
|
}
|
|
},
|
|
"missing": {
|
|
"name": "Fichero faltante |||| Ficheros faltantes",
|
|
"fields": {
|
|
"path": "Ruta",
|
|
"size": "Tamaño",
|
|
"updatedAt": "Actualizado el",
|
|
"libraryName": "Biblioteca"
|
|
},
|
|
"actions": {
|
|
"remove": "Eliminar",
|
|
"remove_all": "Eliminar todo"
|
|
},
|
|
"notifications": {
|
|
"removed": "Eliminado"
|
|
},
|
|
"empty": "No faltan archivos"
|
|
},
|
|
"library": {
|
|
"name": "Biblioteca |||| Bibliotecas",
|
|
"fields": {
|
|
"name": "Nombre",
|
|
"path": "Ruta",
|
|
"remotePath": "Ruta remota",
|
|
"lastScanAt": "Último escaneo",
|
|
"songCount": "Canciones",
|
|
"albumCount": "Álbumes",
|
|
"artistCount": "Artistas",
|
|
"totalSongs": "Canciones",
|
|
"totalAlbums": "Álbumes",
|
|
"totalArtists": "Artistas",
|
|
"totalFolders": "Carpetas",
|
|
"totalFiles": "Archivos",
|
|
"totalMissingFiles": "Archivos faltantes",
|
|
"totalSize": "Tamaño total",
|
|
"totalDuration": "Duración",
|
|
"defaultNewUsers": "Por defecto para nuevos usuarios",
|
|
"createdAt": "Creado",
|
|
"updatedAt": "Actualizado"
|
|
},
|
|
"sections": {
|
|
"basic": "Información básica",
|
|
"statistics": "Estadísticas"
|
|
},
|
|
"actions": {
|
|
"scan": "Escanear biblioteca",
|
|
"manageUsers": "Gestionar el acceso de usarios",
|
|
"viewDetails": "Ver detalles",
|
|
"quickScan": "Escaneo rápido",
|
|
"fullScan": "Escaneo completo"
|
|
},
|
|
"notifications": {
|
|
"created": "La biblioteca se creó correctamente",
|
|
"updated": "La biblioteca se actualizó correctamente",
|
|
"deleted": "La biblioteca se eliminó correctamente",
|
|
"scanStarted": "El escaneo de la biblioteca ha comenzado",
|
|
"scanCompleted": "El escaneo de la biblioteca se completó",
|
|
"quickScanStarted": "Escaneo rápido ha comenzado",
|
|
"fullScanStarted": "Escaneo completo ha comenzado",
|
|
"scanError": "Error al iniciar el escaneo. Revisa los registros"
|
|
},
|
|
"validation": {
|
|
"nameRequired": "El nombre de la biblioteca es obligatorio",
|
|
"pathRequired": "La ruta de la biblioteca es obligatoria",
|
|
"pathNotDirectory": "La ruta de la biblioteca debe ser un directorio",
|
|
"pathNotFound": "Ruta de la biblioteca no encontrada",
|
|
"pathNotAccessible": "La ruta de la biblioteca no es accesible",
|
|
"pathInvalid": "Ruta de la biblioteca no válida"
|
|
},
|
|
"messages": {
|
|
"deleteConfirm": "¿Estás seguro/a de que quieres eliminar esta biblioteca? Esto eliminará todos los datos asociados y el acceso de les usuaries.",
|
|
"scanInProgress": "Escaneo en curso...",
|
|
"noLibrariesAssigned": "No hay bibliotecas asignadas a este usuario"
|
|
}
|
|
},
|
|
"plugin": {
|
|
"name": "Plugin |||| Plugins",
|
|
"fields": {
|
|
"id": "ID",
|
|
"name": "Nombre",
|
|
"description": "Descripción",
|
|
"version": "Versión",
|
|
"author": "Autor",
|
|
"website": "Web",
|
|
"permissions": "Permisos",
|
|
"enabled": "Activado",
|
|
"status": "Estado",
|
|
"path": "Ruta",
|
|
"lastError": "Error",
|
|
"hasError": "Error",
|
|
"updatedAt": "Actualizado",
|
|
"createdAt": "Instalado",
|
|
"configKey": "Clave",
|
|
"configValue": "Valor",
|
|
"allUsers": "Permitir todos los usuarios",
|
|
"selectedUsers": "Usuarios seleccionados",
|
|
"allLibraries": "Permitir todas las bibliotecas",
|
|
"selectedLibraries": "Bibliotecas seleccionadas",
|
|
"allowWriteAccess": ""
|
|
},
|
|
"sections": {
|
|
"status": "Estado",
|
|
"info": "Información del Plugin",
|
|
"configuration": "Configuración",
|
|
"manifest": "Manifiesto",
|
|
"usersPermission": "Permiso del usuario",
|
|
"libraryPermission": "Permiso de la biblioteca"
|
|
},
|
|
"status": {
|
|
"enabled": "Activado",
|
|
"disabled": "Deshabilitado"
|
|
},
|
|
"actions": {
|
|
"enable": "Activar",
|
|
"disable": "Desactivar",
|
|
"disabledDueToError": "Corrige el error antes de activar",
|
|
"disabledUsersRequired": "Selecciona usuarios antes de activar",
|
|
"disabledLibrariesRequired": "Selecciona bibliotecas antes de activar",
|
|
"addConfig": "Añadir configuración",
|
|
"rescan": "Reescanear"
|
|
},
|
|
"notifications": {
|
|
"enabled": "Plugin activado",
|
|
"disabled": "Plugin deshabilitado",
|
|
"updated": "Plugin actualizado",
|
|
"error": "Error al actualizar el plugin"
|
|
},
|
|
"validation": {
|
|
"invalidJson": "La configuración debe ser un JSON válido"
|
|
},
|
|
"messages": {
|
|
"configHelp": "Configura el plugin utilizando pares de clave-valor. Déjalo en blanco si el plugin no requiere configuración.",
|
|
"clickPermissions": "Haz clic en un permiso para ver los detalles",
|
|
"noConfig": "No hay configuración establecida",
|
|
"allUsersHelp": "Cuando se active, el plugin tendrá acceso a todos los usuarios, incluidos los que se creen en el futuro.",
|
|
"noUsers": "Ningún usuario seleccionado",
|
|
"permissionReason": "Razón",
|
|
"usersRequired": "Este plugin requiere acceso a la información de los usuarios. Selecciona a qué usuarios puede acceder el plugin, o activa 'Permitir todos los usuarios'.",
|
|
"allLibrariesHelp": "Cuando se active, el plugin tendrá acceso a todas las bibliotecas, incluidas las que se creen en el futuro.",
|
|
"noLibraries": "Ninguna biblioteca seleccionada",
|
|
"librariesRequired": "Este plugin requiere acceso a la información de las bibliotecas. Selecciona a qué bibliotecas puede acceder el plugin, o activa 'Permitir todas las bibliotecas'.",
|
|
"requiredHosts": "Hosts requeridos",
|
|
"configValidationError": "La validación de la configuración falló:",
|
|
"schemaRenderError": "No se pudo renderizar el formulario de configuración. Es posible que el esquema del complemento no sea válido.",
|
|
"allowWriteAccessHelp": ""
|
|
},
|
|
"placeholders": {
|
|
"configKey": "clave",
|
|
"configValue": "valor"
|
|
}
|
|
}
|
|
},
|
|
"ra": {
|
|
"auth": {
|
|
"welcome1": "¡Gracias por instalar Navidrome!",
|
|
"welcome2": "Para empezar, crea un usuario administrador",
|
|
"confirmPassword": "Confirme la contraseña",
|
|
"buttonCreateAdmin": "Crear Admin",
|
|
"auth_check_error": "Por favor inicie sesión para continuar",
|
|
"user_menu": "Perfil",
|
|
"username": "Usuario",
|
|
"password": "Contraseña",
|
|
"sign_in": "Acceder",
|
|
"sign_in_error": "La autenticación falló, por favor, vuelva a intentarlo",
|
|
"logout": "Cerrar sesión",
|
|
"insightsCollectionNote": "Navidrome recopila datos de uso anónimos para\nayudar a mejorar el proyecto. Haz clic [aquí] para \nobtener más información y optar por no\nparticipar si lo deseas"
|
|
},
|
|
"validation": {
|
|
"invalidChars": "Por favor use solo letras y números",
|
|
"passwordDoesNotMatch": "La contraseña no coincide",
|
|
"required": "Requerido",
|
|
"minLength": "Debe contener %{min} caracteres al menos",
|
|
"maxLength": "Debe contener %{max} caracteres o menos",
|
|
"minValue": "Debe ser al menos %{min}",
|
|
"maxValue": "Debe ser %{max} o menos",
|
|
"number": "Debe ser un número",
|
|
"email": "Debe ser un correo electrónico válido",
|
|
"oneOf": "Debe ser uno de: %{options}",
|
|
"regex": "Debe coincidir con un formato específico (regexp): %{pattern}",
|
|
"unique": "Tiene que ser único",
|
|
"url": "Debe ser una URL válida"
|
|
},
|
|
"action": {
|
|
"add_filter": "Añadir filtro",
|
|
"add": "Añadir",
|
|
"back": "Ir atrás",
|
|
"bulk_actions": "1 elemento seleccionado |||| %{smart_count} elementos seleccionados",
|
|
"cancel": "Cancelar",
|
|
"clear_input_value": "Limpiar valor",
|
|
"clone": "Duplicar",
|
|
"confirm": "Confirmar",
|
|
"create": "Crear",
|
|
"delete": "Eliminar",
|
|
"edit": "Editar",
|
|
"export": "Exportar",
|
|
"list": "Lista",
|
|
"refresh": "Refrescar",
|
|
"remove_filter": "Eliminar este filtro",
|
|
"remove": "Eliminar",
|
|
"save": "Guardar",
|
|
"search": "Buscar",
|
|
"show": "Mostrar",
|
|
"sort": "Ordenar",
|
|
"undo": "Deshacer",
|
|
"expand": "Expandir",
|
|
"close": "Cerrar",
|
|
"open_menu": "Abrir menú",
|
|
"close_menu": "Cerrar menú",
|
|
"unselect": "Deseleccionado",
|
|
"skip": "Omitir",
|
|
"bulk_actions_mobile": "1 |||| %{smart_count}",
|
|
"share": "Compartir",
|
|
"download": "Descargar"
|
|
},
|
|
"boolean": {
|
|
"true": "Sí",
|
|
"false": "No"
|
|
},
|
|
"page": {
|
|
"create": "Crear %{name}",
|
|
"dashboard": "Tablero",
|
|
"edit": "%{name} #%{id}",
|
|
"error": "Algo salió mal",
|
|
"list": "%{name}",
|
|
"loading": "Cargando",
|
|
"not_found": "No encontrado",
|
|
"show": "%{name} #%{id}",
|
|
"empty": "Sin %{name} todavía.",
|
|
"invite": "¿Quiere agregar una?"
|
|
},
|
|
"input": {
|
|
"file": {
|
|
"upload_several": "Arrastre algunos archivos para subir o haga clic para seleccionar uno.",
|
|
"upload_single": "Arrastre un archivo para subir o haga clic para seleccionarlo."
|
|
},
|
|
"image": {
|
|
"upload_several": "Arrastre algunas imagénes para subir o haga clic para seleccionar una.",
|
|
"upload_single": "Arrastre alguna imagen para subir o haga clic para seleccionarla."
|
|
},
|
|
"references": {
|
|
"all_missing": "No se pueden encontrar datos de referencias.",
|
|
"many_missing": "Al menos una de las referencias asociadas parece no estar disponible.",
|
|
"single_missing": "La referencia asociada no parece estar disponible."
|
|
},
|
|
"password": {
|
|
"toggle_visible": "Ocultar contraseña",
|
|
"toggle_hidden": "Mostrar contraseña"
|
|
}
|
|
},
|
|
"message": {
|
|
"about": "Acerca de",
|
|
"are_you_sure": "¿Está seguro?",
|
|
"bulk_delete_content": "¿Seguro que quiere eliminar este %{name}? |||| ¿Seguro que quiere eliminar estos %{smart_count} elementos?",
|
|
"bulk_delete_title": "Eliminar %{name} |||| Eliminar %{smart_count} %{name}",
|
|
"delete_content": "¿Seguro que quiere eliminar este elemento?",
|
|
"delete_title": "Eliminar %{name} #%{id}",
|
|
"details": "Detalles",
|
|
"error": "Se produjo un error en el cliente y su solicitud no se pudo completar",
|
|
"invalid_form": "El formulario no es válido. Por favor verifique si hay errores",
|
|
"loading": "La página se está cargando, espere un momento por favor",
|
|
"no": "No",
|
|
"not_found": "O bien escribió una URL incorrecta o siguió un enlace incorrecto.",
|
|
"yes": "Sí",
|
|
"unsaved_changes": "Algunos de sus cambios no se guardaron. ¿Está seguro que quiere ignorarlos?"
|
|
},
|
|
"navigation": {
|
|
"no_results": "No se han encontrado resultados",
|
|
"no_more_results": "El número de página %{page} está fuera de los límites. Pruebe la página anterior.",
|
|
"page_out_of_boundaries": "Número de página %{page} fuera de los límites",
|
|
"page_out_from_end": "No puede avanzar después de la última página",
|
|
"page_out_from_begin": "No puede ir antes de la página 1",
|
|
"page_range_info": "%{offsetBegin}-%{offsetEnd} de %{total}",
|
|
"page_rows_per_page": "Filas por página:",
|
|
"next": "Siguiente",
|
|
"prev": "Anterior",
|
|
"skip_nav": "Pasa al contenido"
|
|
},
|
|
"notification": {
|
|
"updated": "Elemento actualizado |||| %{smart_count} elementos actualizados",
|
|
"created": "Elemento creado",
|
|
"deleted": "Elemento eliminado |||| %{smart_count} elementos eliminados.",
|
|
"bad_item": "Elemento incorrecto",
|
|
"item_doesnt_exist": "El elemento no existe",
|
|
"http_error": "Error de comunicación con el servidor",
|
|
"data_provider_error": "Error del proveedor de datos. Consulte la consola para más detalles.",
|
|
"i18n_error": "No se pudieron cargar las traducciones para el idioma especificado",
|
|
"canceled": "Acción cancelada",
|
|
"logged_out": "Su sesión ha finalizado, vuelva a conectarse.",
|
|
"new_version": "¡Nueva versión disponible! Por favor refresca esta ventana."
|
|
},
|
|
"toggleFieldsMenu": {
|
|
"columnsToDisplay": "Columnas para mostrar",
|
|
"layout": "Diseño",
|
|
"grid": "Cuadrícula",
|
|
"table": "Tabla"
|
|
}
|
|
},
|
|
"message": {
|
|
"note": "NOTA",
|
|
"transcodingDisabled": "Cambiar la configuración de la transcodificación a través de la interfaz web esta deshabilitado por motivos de seguridad. Si quieres cambiar (editar o agregar) opciones de transcodificación, reinicia el servidor con la %{config} opción de configuración.",
|
|
"transcodingEnabled": "Navidrom se esta ejecutando con %{config}, lo que hace posible ejecutar comandos de sistema desde el apartado de transcodificación en la interfaz web. Recomendamos deshabilitarlo por motivos de seguridad y solo habilitarlo cuando se este configurando opciones de transcodificación.",
|
|
"songsAddedToPlaylist": "1 canción agregada a la lista |||| %{smart_count} canciones agregadas a la lista",
|
|
"noPlaylistsAvailable": "Ninguna lista disponible",
|
|
"delete_user_title": "Eliminar usuario '%{name}'",
|
|
"delete_user_content": "¿Esta seguro de eliminar a este usuario y todos sus datos (incluyendo listas y preferencias)?",
|
|
"notifications_blocked": "Las notificaciones de este sitio están bloqueadas en tu navegador",
|
|
"notifications_not_available": "Este navegador no soporta notificaciones o no ingresaste a Navidrome usando https",
|
|
"lastfmLinkSuccess": "Last.fm esta conectado y el scrobbling esta activado",
|
|
"lastfmLinkFailure": "No se pudo conectar con Last.fm",
|
|
"lastfmUnlinkSuccess": "Last.fm se ha desconectado y el scrobbling se desactivo",
|
|
"lastfmUnlinkFailure": "No se pudo desconectar Last.fm",
|
|
"openIn": {
|
|
"lastfm": "Ver en Last.fm",
|
|
"musicbrainz": "Ver en MusicBrainz"
|
|
},
|
|
"lastfmLink": "Leer más...",
|
|
"listenBrainzLinkSuccess": "Se ha conectado correctamente a ListenBrainz y se activó el scrobbling como el usuario: %{user}",
|
|
"listenBrainzLinkFailure": "No se pudo conectar con ListenBrainz: %{error}",
|
|
"listenBrainzUnlinkSuccess": "Se desconectó ListenBrainz y se desactivó el scrobbling",
|
|
"listenBrainzUnlinkFailure": "No se pudo desconectar ListenBrainz",
|
|
"downloadOriginalFormat": "Descargar formato original",
|
|
"shareOriginalFormat": "Compartir formato original",
|
|
"shareDialogTitle": "Compartir %{resource} '%{name}'",
|
|
"shareBatchDialogTitle": "Compartir 1 %{resource} |||| Compartir %{smart_count} %{resource}",
|
|
"shareSuccess": "URL copiada al portapapeles: %{url}",
|
|
"shareFailure": "Error al copiar la URL %{url} al portapapeles",
|
|
"downloadDialogTitle": "Descargar %{resource} '%{name}' (%{size})",
|
|
"shareCopyToClipboard": "Copiar al portapapeles: Ctrl+C, Intro",
|
|
"remove_missing_title": "Eliminar archivos faltantes",
|
|
"remove_missing_content": "¿Realmente desea eliminar los archivos faltantes seleccionados de la base de datos? Esto eliminará permanentemente cualquier referencia a ellos, incluidas sus reproducciones y valoraciones.",
|
|
"remove_all_missing_title": "Eliminar todos los archivos faltantes",
|
|
"remove_all_missing_content": "¿Realmente desea eliminar todos los archivos faltantes de la base de datos? Esto eliminará permanentemente cualquier referencia a ellos, incluidas sus reproducciones y valoraciones.",
|
|
"noSimilarSongsFound": "No se encontraron canciones similares",
|
|
"noTopSongsFound": "No se encontraron canciones destacadas",
|
|
"startingInstantMix": "Cargando la mezcla instantánea..."
|
|
},
|
|
"menu": {
|
|
"library": "Biblioteca",
|
|
"settings": "Ajustes",
|
|
"version": "Versión",
|
|
"theme": "Tema",
|
|
"personal": {
|
|
"name": "Personal",
|
|
"options": {
|
|
"theme": "Tema",
|
|
"language": "Idioma",
|
|
"defaultView": "Vista por defecto",
|
|
"desktop_notifications": "Notificaciones de escritorio",
|
|
"lastfmScrobbling": "Scrobble a Last.fm",
|
|
"listenBrainzScrobbling": "Scrobble a ListenBrainz",
|
|
"replaygain": "Modo de ReplayGain",
|
|
"preAmp": "ReplayGain PreAmp (dB)",
|
|
"gain": {
|
|
"none": "Desactivado",
|
|
"album": "Ganancia del álbum",
|
|
"track": "Ganancia de pista"
|
|
},
|
|
"lastfmNotConfigured": "La clave API de Last.fm no está configurada"
|
|
}
|
|
},
|
|
"albumList": "Álbumes",
|
|
"about": "Acerca de",
|
|
"playlists": "Playlists",
|
|
"sharedPlaylists": "Playlists Compartidas",
|
|
"librarySelector": {
|
|
"allLibraries": "Todas las bibliotecas (%{count})",
|
|
"multipleLibraries": "%{selected} de %{total} bibliotecas",
|
|
"selectLibraries": "Seleccionar bibliotecas",
|
|
"none": "Ninguno"
|
|
}
|
|
},
|
|
"player": {
|
|
"playListsText": "Fila de reproducción",
|
|
"openText": "Abrir",
|
|
"closeText": "Cerrar",
|
|
"notContentText": "Sin música",
|
|
"clickToPlayText": "Clic para reproducir",
|
|
"clickToPauseText": "Clic para pausar",
|
|
"nextTrackText": "Pista siguiente",
|
|
"previousTrackText": "Pista anterior",
|
|
"reloadText": "Refrescar",
|
|
"volumeText": "Volumen",
|
|
"toggleLyricText": "Mostrar letras",
|
|
"toggleMiniModeText": "Minimizar",
|
|
"destroyText": "Destruir",
|
|
"downloadText": "Descargar",
|
|
"removeAudioListsText": "Eliminar listas de audio",
|
|
"clickToDeleteText": "Clic para eliminar %{name}",
|
|
"emptyLyricText": "Sin letras",
|
|
"playModeText": {
|
|
"order": "En orden",
|
|
"orderLoop": "Repetir",
|
|
"singleLoop": "Repetir una",
|
|
"shufflePlay": "Aleatorio"
|
|
}
|
|
},
|
|
"about": {
|
|
"links": {
|
|
"homepage": "Página de inicio",
|
|
"source": "Código fuente",
|
|
"featureRequests": "Pedir funcionalidad",
|
|
"lastInsightsCollection": "Última recopilación de datos",
|
|
"insights": {
|
|
"disabled": "Deshabilitado",
|
|
"waiting": "Esperando"
|
|
}
|
|
},
|
|
"tabs": {
|
|
"about": "Acerca de",
|
|
"config": "Configuración"
|
|
},
|
|
"config": {
|
|
"configName": "Nombre de la configuración",
|
|
"environmentVariable": "Variables de entorno",
|
|
"currentValue": "Valor actual",
|
|
"configurationFile": "Archivo de configuración",
|
|
"exportToml": "Exportar configuración (TOML)",
|
|
"exportSuccess": "Configuración exportada al portapapeles en formato TOML",
|
|
"exportFailed": "Error al copiar la configuración",
|
|
"devFlagsHeader": "Indicadores de desarrollo (sujetos a cambios o eliminación)",
|
|
"devFlagsComment": "Estas son configuraciones experimentales y pueden eliminarse en versiones futuras",
|
|
"downloadToml": "Descargar la configuración (TOML)"
|
|
}
|
|
},
|
|
"activity": {
|
|
"title": "Actividad",
|
|
"totalScanned": "Total de carpetas escaneadas",
|
|
"quickScan": "Escaneo rápido",
|
|
"fullScan": "Escaneo completo",
|
|
"serverUptime": "Uptime del servidor",
|
|
"serverDown": "OFFLINE",
|
|
"scanType": "Tipo",
|
|
"status": "Error de escaneo",
|
|
"elapsedTime": "Tiempo transcurrido",
|
|
"selectiveScan": "Selectivo"
|
|
},
|
|
"help": {
|
|
"title": "Atajos de teclado de Navidrome",
|
|
"hotkeys": {
|
|
"show_help": "Muestra esta ayuda",
|
|
"toggle_menu": "Activa/desactiva la barra lateral",
|
|
"toggle_play": "Reproducir / Pausar",
|
|
"prev_song": "Canción anterior",
|
|
"next_song": "Siguiente canción",
|
|
"vol_up": "Subir volumen",
|
|
"vol_down": "Bajar volumen",
|
|
"toggle_love": "Marca esta canción como favorita",
|
|
"current_song": "Canción actual"
|
|
}
|
|
},
|
|
"nowPlaying": {
|
|
"title": "En reproducción",
|
|
"empty": "Nada en reproducción",
|
|
"minutesAgo": "Hace %{smart_count} minuto |||| Hace %{smart_count} minutos"
|
|
}
|
|
}
|