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": "Galego",
|
|
"resources": {
|
|
"song": {
|
|
"name": "Canción |||| Cancións",
|
|
"fields": {
|
|
"albumArtist": "Artista do Álbum",
|
|
"duration": "Tempo",
|
|
"trackNumber": "#",
|
|
"playCount": "Reproducións",
|
|
"title": "Título",
|
|
"artist": "Artista",
|
|
"album": "Álbum",
|
|
"path": "Ruta do ficheiro",
|
|
"genre": "Xénero",
|
|
"compilation": "Compilación",
|
|
"year": "Ano",
|
|
"size": "Tamaño do ficheiro",
|
|
"updatedAt": "Actualizado a",
|
|
"bitRate": "Taxa de bits",
|
|
"discSubtitle": "Subtítulo do disco",
|
|
"starred": "Favorito",
|
|
"comment": "Comentario",
|
|
"rating": "Valoración",
|
|
"quality": "Calidade",
|
|
"bpm": "BPM",
|
|
"playDate": "Último reproducido",
|
|
"channels": "Canles",
|
|
"createdAt": "Engadido",
|
|
"grouping": "Grupos",
|
|
"mood": "Estado",
|
|
"participants": "Participantes adicionais",
|
|
"tags": "Etiquetas adicionais",
|
|
"mappedTags": "Etiquetas mapeadas",
|
|
"rawTags": "Etiquetas en cru",
|
|
"bitDepth": "Calidade de Bit",
|
|
"sampleRate": "Taxa de mostra",
|
|
"missing": "Falta",
|
|
"libraryName": "Biblioteca",
|
|
"composer": "Composición",
|
|
"disc": ""
|
|
},
|
|
"actions": {
|
|
"addToQueue": "Ao final da cola",
|
|
"playNow": "Reproducir agora",
|
|
"addToPlaylist": "Engadir á lista",
|
|
"shuffleAll": "Remexer todo",
|
|
"download": "Descargar",
|
|
"playNext": "A continuación",
|
|
"info": "Obter info",
|
|
"showInPlaylist": "Mostrar en Lista de reprodución",
|
|
"instantMix": "Mestura Súbita"
|
|
}
|
|
},
|
|
"album": {
|
|
"name": "Álbum |||| Álbums",
|
|
"fields": {
|
|
"albumArtist": "Artista do álbum",
|
|
"artist": "Artista",
|
|
"duration": "Tempo",
|
|
"songCount": "Cancións",
|
|
"playCount": "Reproducións",
|
|
"name": "Nome",
|
|
"genre": "Xénero",
|
|
"compilation": "Compilación",
|
|
"year": "Ano",
|
|
"updatedAt": "Actualizado a",
|
|
"comment": "Comentario",
|
|
"rating": "Valoración",
|
|
"createdAt": "Engadido o",
|
|
"size": "Tamaño",
|
|
"originalDate": "Orixinal",
|
|
"releaseDate": "Publicado",
|
|
"releases": "Publicación |||| Publicacións",
|
|
"released": "Publicado",
|
|
"recordLabel": "Editorial",
|
|
"catalogNum": "Número de catálogo",
|
|
"releaseType": "Tipo",
|
|
"grouping": "Grupos",
|
|
"media": "Multimedia",
|
|
"mood": "Estado",
|
|
"date": "Data de gravación",
|
|
"missing": "Falta",
|
|
"libraryName": "Biblioteca"
|
|
},
|
|
"actions": {
|
|
"playAll": "Reproducir",
|
|
"playNext": "Reproducir a seguir",
|
|
"addToQueue": "Reproducir máis tarde",
|
|
"shuffle": "Barallar",
|
|
"addToPlaylist": "Engadir a Lista",
|
|
"download": "Descargar",
|
|
"info": "Obter info",
|
|
"share": "Compartir"
|
|
},
|
|
"lists": {
|
|
"all": "Todo",
|
|
"random": "Ao chou",
|
|
"recentlyAdded": "Engadida recentemente",
|
|
"recentlyPlayed": "Reproducida recentemente",
|
|
"mostPlayed": "Reproducida máis veces",
|
|
"starred": "Favoritas",
|
|
"topRated": "Máis valoradas"
|
|
}
|
|
},
|
|
"artist": {
|
|
"name": "Artista |||| Artistas",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"albumCount": "Número de álbums",
|
|
"songCount": "Número de cancións",
|
|
"playCount": "Reproducións",
|
|
"rating": "Valoración",
|
|
"genre": "Xénero",
|
|
"size": "Tamaño",
|
|
"role": "Rol",
|
|
"missing": "Falta"
|
|
},
|
|
"roles": {
|
|
"albumartist": "Artista do álbum |||| Artistas do álbum",
|
|
"artist": "Artista |||| Artistas",
|
|
"composer": "Composición |||| Composición",
|
|
"conductor": "Condutor |||| Condutoras",
|
|
"lyricist": "Letrista |||| Letristas",
|
|
"arranger": "Arranxos |||| Arranxos",
|
|
"producer": "Produtora |||| Produtoras",
|
|
"director": "Dirección |||| Dirección",
|
|
"engineer": "Enxeñería |||| Enxeñería",
|
|
"mixer": "Mistura |||| Mistura",
|
|
"remixer": "Remezcla |||| Remezcla",
|
|
"djmixer": "Mezcla DJs |||| Mezcla DJs",
|
|
"performer": "Intérprete |||| Intérpretes",
|
|
"maincredit": "Artista do álbum ou Artista |||| Artistas do álbum ou Artistas"
|
|
},
|
|
"actions": {
|
|
"shuffle": "Barallar",
|
|
"radio": "Radio",
|
|
"topSongs": "Cancións destacadas"
|
|
}
|
|
},
|
|
"user": {
|
|
"name": "Usuaria |||| Usuarias",
|
|
"fields": {
|
|
"userName": "Identificador",
|
|
"isAdmin": "É Admin",
|
|
"lastLoginAt": "Último acceso o",
|
|
"updatedAt": "Actualizado",
|
|
"name": "Nome",
|
|
"password": "Contrasinal",
|
|
"createdAt": "Data creación",
|
|
"changePassword": "Cambiar contrasinal?",
|
|
"currentPassword": "Contrasinal actual",
|
|
"newPassword": "Novo contrasinal",
|
|
"token": "Token",
|
|
"lastAccessAt": "Último acceso",
|
|
"libraries": "Bibliotecas"
|
|
},
|
|
"helperTexts": {
|
|
"name": "Os cambios no nome aplicaranse a próxima vez que accedas",
|
|
"libraries": "Selecciona bibliotecas específicas para esta usuaria, ou deixa baleiro para usar as bibliotecas por defecto"
|
|
},
|
|
"notifications": {
|
|
"created": "Creouse a usuaria",
|
|
"updated": "Actualizouse a usuaria",
|
|
"deleted": "Eliminouse a usuaria"
|
|
},
|
|
"message": {
|
|
"listenBrainzToken": "Escribe o token de usuaria de ListenBrainz",
|
|
"clickHereForToken": "Preme aquí para obter o token",
|
|
"selectAllLibraries": "Seleccionar todas as bibliotecas",
|
|
"adminAutoLibraries": "As usuarias Admin teñen acceso por defecto a todas as bibliotecas"
|
|
},
|
|
"validation": {
|
|
"librariesRequired": "Debes seleccionar polo menos unha biblioteca para usuarias non admins"
|
|
}
|
|
},
|
|
"player": {
|
|
"name": "Reprodutor |||| Reprodutores",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"transcodingId": "Transcodificación",
|
|
"maxBitRate": "Taxa de bit máx.",
|
|
"client": "Cliente",
|
|
"userName": "Identificador",
|
|
"lastSeen": "Último acceso",
|
|
"reportRealPath": "Informar de Ruta Real",
|
|
"scrobbleEnabled": "Enviar Scrobbles a servizos externos"
|
|
}
|
|
},
|
|
"transcoding": {
|
|
"name": "Transcodificación |||| Transcodificacións",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"targetFormat": "Formato de destino",
|
|
"defaultBitRate": "Taxa de bit por defecto",
|
|
"command": "Orde"
|
|
}
|
|
},
|
|
"playlist": {
|
|
"name": "Lista de reprodución |||| Listas de reprodución",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"duration": "Duración",
|
|
"ownerName": "Propiedade",
|
|
"public": "Pública",
|
|
"updatedAt": "Actualizada o",
|
|
"createdAt": "Creada o",
|
|
"songCount": "Cancións",
|
|
"comment": "Comentario",
|
|
"sync": "Autoimportación",
|
|
"path": "Importar desde"
|
|
},
|
|
"actions": {
|
|
"selectPlaylist": "Elixe unha lista:",
|
|
"addNewPlaylist": "Crear \"%{name}\"",
|
|
"export": "Exportar",
|
|
"makePublic": "Facela Pública",
|
|
"makePrivate": "Facela Privada",
|
|
"saveQueue": "Salvar a Cola como Lista de reprodución",
|
|
"searchOrCreate": "Buscar listas ou escribe para crear nova…",
|
|
"pressEnterToCreate": "Preme Enter para crear nova lista",
|
|
"removeFromSelection": "Retirar da selección"
|
|
},
|
|
"message": {
|
|
"duplicate_song": "Engadir cancións duplicadas",
|
|
"song_exist": "Hai duplicadas que serán engadidas á lista de reprodución. Desexas engadir as duplicadas ou omitilas?",
|
|
"noPlaylistsFound": "Sen listas de reprodución",
|
|
"noPlaylists": "Sen listas dispoñibles"
|
|
}
|
|
},
|
|
"radio": {
|
|
"name": "Radio |||| Radios",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"streamUrl": "URL do fluxo",
|
|
"homePageUrl": "URL da web",
|
|
"updatedAt": "Actualizada",
|
|
"createdAt": "Creada"
|
|
},
|
|
"actions": {
|
|
"playNow": "En reprodución"
|
|
}
|
|
},
|
|
"share": {
|
|
"name": "Compartido |||| Compartidos",
|
|
"fields": {
|
|
"username": "Compartida por",
|
|
"url": "URL",
|
|
"description": "Descrición",
|
|
"contents": "Contidos",
|
|
"expiresAt": "Caducidade",
|
|
"lastVisitedAt": "Última visitada",
|
|
"visitCount": "Visitas",
|
|
"format": "Formato",
|
|
"maxBitRate": "Taxa de Bit Máx.",
|
|
"updatedAt": "Actualizada o",
|
|
"createdAt": "Creada o",
|
|
"downloadable": "Permitir descargas?"
|
|
}
|
|
},
|
|
"missing": {
|
|
"name": "Falta o ficheiro |||| Faltan os ficheiros",
|
|
"fields": {
|
|
"path": "Ruta",
|
|
"size": "Tamaño",
|
|
"updatedAt": "Desapareceu o",
|
|
"libraryName": "Biblioteca"
|
|
},
|
|
"actions": {
|
|
"remove": "Retirar",
|
|
"remove_all": "Retirar todo"
|
|
},
|
|
"notifications": {
|
|
"removed": "Ficheiro(s) faltantes retirados"
|
|
},
|
|
"empty": "Sen ficheiros faltantes"
|
|
},
|
|
"library": {
|
|
"name": "Biblioteca |||| Bibliotecas",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"path": "Ruta",
|
|
"remotePath": "Ruta remota",
|
|
"lastScanAt": "Último escaneado",
|
|
"songCount": "Cancións",
|
|
"albumCount": "Álbums",
|
|
"artistCount": "Artistas",
|
|
"totalSongs": "Cancións",
|
|
"totalAlbums": "Álbums",
|
|
"totalArtists": "Artistas",
|
|
"totalFolders": "Cartafoles",
|
|
"totalFiles": "Ficheiros",
|
|
"totalMissingFiles": "Ficheiros que faltan",
|
|
"totalSize": "Tamaño total",
|
|
"totalDuration": "Duración",
|
|
"defaultNewUsers": "Por defecto para novas usuarias",
|
|
"createdAt": "Creada",
|
|
"updatedAt": "Actualizada"
|
|
},
|
|
"sections": {
|
|
"basic": "Información básica",
|
|
"statistics": "Estatísticas"
|
|
},
|
|
"actions": {
|
|
"scan": "Escanear Biblioteca",
|
|
"manageUsers": "Xestionar acceso das usuarias",
|
|
"viewDetails": "Ver detalles",
|
|
"quickScan": "Escaneado rápido",
|
|
"fullScan": "Escaneado completo"
|
|
},
|
|
"notifications": {
|
|
"created": "Biblioteca creada correctamente",
|
|
"updated": "Biblioteca actualizada correctamente",
|
|
"deleted": "Biblioteca eliminada correctamente",
|
|
"scanStarted": "Comezou o escaneo da biblioteca",
|
|
"scanCompleted": "Completouse o escaneado da biblioteca",
|
|
"quickScanStarted": "Iniciado o escaneado rápido",
|
|
"fullScanStarted": "Iniciado o escaneado completo",
|
|
"scanError": "Erro ao escanear. Comproba o rexistro"
|
|
},
|
|
"validation": {
|
|
"nameRequired": "Requírese un nome para a biblioteca",
|
|
"pathRequired": "Requírese unha ruta para a biblioteca",
|
|
"pathNotDirectory": "A ruta á biblioteca ten que ser un directorio",
|
|
"pathNotFound": "Non se atopa a ruta á biblioteca",
|
|
"pathNotAccessible": "A ruta á biblioteca non é accesible",
|
|
"pathInvalid": "Ruta non válida á biblioteca"
|
|
},
|
|
"messages": {
|
|
"deleteConfirm": "Tes certeza de querer eliminar esta biblioteca? Isto eliminará todos os datos asociados e accesos de usuarias.",
|
|
"scanInProgress": "Escaneo en progreso…",
|
|
"noLibrariesAssigned": "Sen bibliotecas asignadas a esta usuaria"
|
|
}
|
|
},
|
|
"plugin": {
|
|
"name": "Complemento |||| Complementos",
|
|
"fields": {
|
|
"id": "ID",
|
|
"name": "Nome",
|
|
"description": "Descrición",
|
|
"version": "Versión",
|
|
"author": "Autoría",
|
|
"website": "Sitio web",
|
|
"permissions": "Permisos",
|
|
"enabled": "Activado",
|
|
"status": "Estado",
|
|
"path": "Ruta",
|
|
"lastError": "Erro",
|
|
"hasError": "Erro",
|
|
"updatedAt": "Actualizado",
|
|
"createdAt": "Instalado",
|
|
"configKey": "Clave",
|
|
"configValue": "Valor",
|
|
"allUsers": "Para todas as usuarias",
|
|
"selectedUsers": "Usuarias seleccionadas",
|
|
"allLibraries": "Permitir todas as bibliotecas",
|
|
"selectedLibraries": "Selecciona bibliotecas",
|
|
"allowWriteAccess": ""
|
|
},
|
|
"sections": {
|
|
"status": "Estado",
|
|
"info": "Info do complemento",
|
|
"configuration": "Configuración",
|
|
"manifest": "Manifesto",
|
|
"usersPermission": "Permiso sobre usuarias",
|
|
"libraryPermission": "Permiso sobre bibliotecas"
|
|
},
|
|
"status": {
|
|
"enabled": "Activado",
|
|
"disabled": "Desactivado"
|
|
},
|
|
"actions": {
|
|
"enable": "Activar",
|
|
"disable": "Desactivar",
|
|
"disabledDueToError": "Arranxar erro antes de activar",
|
|
"disabledUsersRequired": "Selección de usuarias antes de activar",
|
|
"disabledLibrariesRequired": "Selección de bibliotecas antes de activar",
|
|
"addConfig": "Engadir configuración",
|
|
"rescan": "Volver a escanear"
|
|
},
|
|
"notifications": {
|
|
"enabled": "Complemento activado",
|
|
"disabled": "Complemento desactivado",
|
|
"updated": "Complemento actualizado",
|
|
"error": "Erro ao actualizar o complemento"
|
|
},
|
|
"validation": {
|
|
"invalidJson": "A configuración debe ser un JSON válido"
|
|
},
|
|
"messages": {
|
|
"configHelp": "Configura o complemento usando pares clave-valor. Deixa baleiro se o complemento non require configuración.",
|
|
"clickPermissions": "Preme nun permiso para ver detalles",
|
|
"noConfig": "Sen configuración establecida",
|
|
"allUsersHelp": "Ao activalo, o complemento terá acceso a todas as usuarias, incluíndo aquelas que se creen no futuro.",
|
|
"noUsers": "Sen usuarias seleccionadas",
|
|
"permissionReason": "Motivo",
|
|
"usersRequired": "O complemento precisa acceso á información sobre a usuaria. Selecciona as usuarias ás que pode acceder, ou activa 'Todas as usuarias'.",
|
|
"allLibrariesHelp": "Ao activalo, o complemento terá acceso a todas as bibliotecas, incluíndo aquelas que se creen no futuro.",
|
|
"noLibraries": "Sen bibliotecas seleccionadas",
|
|
"librariesRequired": "O complemento precisa acceso á información sobre a biblioteca. Selecciona as bibliotecas ás que pode acceder, ou activa 'Todas as bibliotecas'.",
|
|
"requiredHosts": "Servidores requeridos",
|
|
"configValidationError": "Fallou a comprobación da configuración:",
|
|
"schemaRenderError": "Non se puido aplicar a configuración. O esquema do complemento podería non ser válido.",
|
|
"allowWriteAccessHelp": ""
|
|
},
|
|
"placeholders": {
|
|
"configKey": "clave",
|
|
"configValue": "valor"
|
|
}
|
|
}
|
|
},
|
|
"ra": {
|
|
"auth": {
|
|
"welcome1": "Grazas por instalar Navidrome!",
|
|
"welcome2": "Para comezar, crea a conta para administración",
|
|
"confirmPassword": "Confirmar contrasinal",
|
|
"buttonCreateAdmin": "Crear Admin",
|
|
"auth_check_error": "Accede para continuar",
|
|
"user_menu": "Perfil",
|
|
"username": "Identificador",
|
|
"password": "Contrasinal",
|
|
"sign_in": "Accede",
|
|
"sign_in_error": "Fallou a autenticación, volve intentalo",
|
|
"logout": "Pechar sesión",
|
|
"insightsCollectionNote": "Navidrome recolle datos anónimos de uso para mellorar o proxecto. Peme [aquí] para saber máis e desactivar se queres"
|
|
},
|
|
"validation": {
|
|
"invalidChars": "Utiliza só letras e números",
|
|
"passwordDoesNotMatch": "Os contrasinais non concordan",
|
|
"required": "Requerido",
|
|
"minLength": "Ten que ter %{min} caracteres como mínimo",
|
|
"maxLength": "Ten que ter %{max} caracteres ou menos",
|
|
"minValue": "Ten que ter polo menos %{min}",
|
|
"maxValue": "Ten que ter %{max} ou menos",
|
|
"number": "Ten que ser un número",
|
|
"email": "Ten que ser un email válido",
|
|
"oneOf": "Ten que ser un de: %{options}",
|
|
"regex": "Ten que ter un formato específico (regexp): %{pattern}",
|
|
"unique": "Ten que ser único",
|
|
"url": "Ten que ser un URL válido"
|
|
},
|
|
"action": {
|
|
"add_filter": "Engadir filtro",
|
|
"add": "Engadir",
|
|
"back": "Atrás",
|
|
"bulk_actions": "1 elemento seleccionado |||| %{smart_count} elementos seleccionados",
|
|
"cancel": "Cancelar",
|
|
"clear_input_value": "Limpar valor",
|
|
"clone": "Clonar",
|
|
"confirm": "Confirmar",
|
|
"create": "Crear",
|
|
"delete": "Eliminar",
|
|
"edit": "Editar",
|
|
"export": "Exportar",
|
|
"list": "Lista",
|
|
"refresh": "Actualizar",
|
|
"remove_filter": "Eliminar este filtro",
|
|
"remove": "Eliminar",
|
|
"save": "Gardar",
|
|
"search": "Buscar",
|
|
"show": "Mostrar",
|
|
"sort": "Orde",
|
|
"undo": "Desfacer",
|
|
"expand": "Despregar",
|
|
"close": "Pechar",
|
|
"open_menu": "Abrir menú",
|
|
"close_menu": "Pechar menú",
|
|
"unselect": "Deseleccionar",
|
|
"skip": "Omitir",
|
|
"bulk_actions_mobile": "1 |||| %{smart_count}",
|
|
"share": "Compartir",
|
|
"download": "Descargar"
|
|
},
|
|
"boolean": {
|
|
"true": "Si",
|
|
"false": "Non"
|
|
},
|
|
"page": {
|
|
"create": "Crear %{name}",
|
|
"dashboard": "Taboleiro",
|
|
"edit": "%{name} #%{id}",
|
|
"error": "Algo fallou",
|
|
"list": "%{name}",
|
|
"loading": "Cargando",
|
|
"not_found": "Non atopado",
|
|
"show": "%{name} #%{id}",
|
|
"empty": "Aínda non hai %{name}.",
|
|
"invite": "Queres engadir unha?"
|
|
},
|
|
"input": {
|
|
"file": {
|
|
"upload_several": "Solta aquí algún ficheiro para subilo, ou preme para selección.",
|
|
"upload_single": "Solta aquí un ficheiro para subilo, ou preme para seleccionalo."
|
|
},
|
|
"image": {
|
|
"upload_several": "Solta aquí algunhas imaxes para subir, ou preme para seleccionar.",
|
|
"upload_single": "Solta unha imaxe para subila, ou preme para seleccionala."
|
|
},
|
|
"references": {
|
|
"all_missing": "Non se atopan datos de referencia.",
|
|
"many_missing": "Semella que unha das referencias asociadas xa non está dispoñible.",
|
|
"single_missing": "A referencia asociada semella que xa non está dispoñible."
|
|
},
|
|
"password": {
|
|
"toggle_visible": "Agochar contrasinal",
|
|
"toggle_hidden": "Mostrar contrasinal"
|
|
}
|
|
},
|
|
"message": {
|
|
"about": "Acerca de",
|
|
"are_you_sure": "Tes certeza?",
|
|
"bulk_delete_content": "Tes a certeza de querer borrar a %{name} |||| Tes a certeza de querer eleminar estes %{smart_count} elementos?",
|
|
"bulk_delete_title": "Eliminar %{name} |||| Eliminar %{smart_count} %{name}",
|
|
"delete_content": "Tes a certeza de querer eliminar este elemento?",
|
|
"delete_title": "Eliminar %{name} #%{id}",
|
|
"details": "Detalles",
|
|
"error": "Houbo un erro no cliente e a solicitude non se puido completar.",
|
|
"invalid_form": "O formulario non é válido. Comproba os erros",
|
|
"loading": "A páxina está cargando, agarda un momento",
|
|
"no": "Non",
|
|
"not_found": "Ou ben escribiches un URL incorrecto ou ben seguiches unha ligazón non válida.",
|
|
"yes": "Si",
|
|
"unsaved_changes": "Algún dos cambios non foi gardado. Tes a certeza de querer ignoralos?"
|
|
},
|
|
"navigation": {
|
|
"no_results": "No hai resultados",
|
|
"no_more_results": "O número de páxina %{page} supera os límites. Inténtao coa páxina anterior.",
|
|
"page_out_of_boundaries": "O número de páxina %{page} supera o límite",
|
|
"page_out_from_end": "Non se pode ir máis alá la última páxina",
|
|
"page_out_from_begin": "Non se pode ir a antes da páxina 1",
|
|
"page_range_info": "%{offsetBegin}-%{offsetEnd} de %{total}",
|
|
"page_rows_per_page": "Elementos por páxina:",
|
|
"next": "Seguinte",
|
|
"prev": "Anterior",
|
|
"skip_nav": "Omitir contido"
|
|
},
|
|
"notification": {
|
|
"updated": "Elemento actualizado |||| %{smart_count} elementos actualizados",
|
|
"created": "Creouse o elemento",
|
|
"deleted": "Elemento eliminado |||| %{smart_count} elementos eliminados",
|
|
"bad_item": "O elemento non é correcto",
|
|
"item_doesnt_exist": "O elemento non existe",
|
|
"http_error": "Erro de comunicación co servidor",
|
|
"data_provider_error": "Erro dataProvider. Mira na consola para ver detalles.",
|
|
"i18n_error": "Non se puido cargar a tradución do idioma indicado",
|
|
"canceled": "Acción cancelada",
|
|
"logged_out": "Rematou a túa sesión, volve a acceder.",
|
|
"new_version": "Nova versión dispoñible! Actualiza esta ventá."
|
|
},
|
|
"toggleFieldsMenu": {
|
|
"columnsToDisplay": "Columnas a mostrar",
|
|
"layout": "Disposición",
|
|
"grid": "Grella",
|
|
"table": "Táboa"
|
|
}
|
|
},
|
|
"message": {
|
|
"note": "NOTA",
|
|
"transcodingDisabled": "Desactivouse o cambio da configuración da transcodificación usando a interface web por razóns de seguridade. Se queres cambiar (editar ou engadir) opcións de transcodificación, reinicia o servidor coa opción de configuración %{config}",
|
|
"transcodingEnabled": "Navidrome está a funcionar con %{config}, polo que é posible executar ordes do sistema desde os axustes de transcodificación usando a interface web. Por razóns de seguridade, recomendamos desactivalo e só activalo cando se configuran as opcións de Transcodificación.",
|
|
"songsAddedToPlaylist": "Engadida 1 canción á lista de reprodución |||| Engadidas %{smart_count} cancións á lista de reprodución",
|
|
"noPlaylistsAvailable": "Nada dispoñible",
|
|
"delete_user_title": "Eliminar usuaria '%{name}'",
|
|
"delete_user_content": "Tes a certeza de querer eliminar esta usuaria e todos os seus datos (incluíndo listas e preferencias)?",
|
|
"notifications_blocked": "Tes bloqueadas as Notificacións desta páxina web nos axustes do navegador",
|
|
"notifications_not_available": "Este navegador non ten soporte para as notificacións de escritorio ou ben non estás accedendo Navidrome con https",
|
|
"lastfmLinkSuccess": "Ligouse Last.fm correctamente e o scrobbling está activado",
|
|
"lastfmLinkFailure": "Non se puido ligar Last.fm",
|
|
"lastfmUnlinkSuccess": "Desligouse Last.fm e desactivouse o scrobbling",
|
|
"lastfmUnlinkFailure": "Non se puido desligar Last.fm",
|
|
"openIn": {
|
|
"lastfm": "Abrir en Last.fm",
|
|
"musicbrainz": "Abrir en MusicBrainz"
|
|
},
|
|
"lastfmLink": "Saber máis...",
|
|
"listenBrainzLinkSuccess": "Conectouse correctamente con ListenBrainz e activouse o scrobbling para: %{user}",
|
|
"listenBrainzLinkFailure": "Non se conectou con ListenBrainz: %{error}",
|
|
"listenBrainzUnlinkSuccess": "Desconectouse ListenBrainz e desactivouse o scrobbling",
|
|
"listenBrainzUnlinkFailure": "Non se puido desconectar de ListenBrainz",
|
|
"downloadOriginalFormat": "Descargar formato orixinal",
|
|
"shareOriginalFormat": "Compartir no formato orixinal",
|
|
"shareDialogTitle": "Compartir %{resource} '%{name}'",
|
|
"shareBatchDialogTitle": "Compartir 1 %{resource} |||| Compartir %{smart_count} %{resource}",
|
|
"shareSuccess": "URL copiado ao portapapeis: %{url}",
|
|
"shareFailure": "Erro ao copiar o URL %{url} ao portapapeis",
|
|
"downloadDialogTitle": "Descargar %{resource} '%{name}' (%{size})",
|
|
"shareCopyToClipboard": "Copiar ao portapapeis: Ctrl+C, Enter",
|
|
"remove_missing_title": "Retirar ficheiros que faltan",
|
|
"remove_missing_content": "Tes certeza de querer retirar da base de datos os ficheiros que faltan? Isto retirará de xeito permanente todas a referencias a eles, incluíndo a conta de reproducións e valoracións.",
|
|
"remove_all_missing_title": "Retirar todos os ficheiros que faltan",
|
|
"remove_all_missing_content": "Tes certeza de querer retirar da base de datos todos os ficheiros que faltan? Isto eliminará todas as referencias a eles, incluíndo o número de reproducións e valoracións.",
|
|
"noSimilarSongsFound": "Sen cancións parecidas",
|
|
"noTopSongsFound": "Sen cancións destacadas",
|
|
"startingInstantMix": "Cargando Mestura Súbita…"
|
|
},
|
|
"menu": {
|
|
"library": "Biblioteca",
|
|
"settings": "Axustes",
|
|
"version": "Versión",
|
|
"theme": "Decorado",
|
|
"personal": {
|
|
"name": "Persoal",
|
|
"options": {
|
|
"theme": "Decorado",
|
|
"language": "Idioma",
|
|
"defaultView": "Vista por defecto",
|
|
"desktop_notifications": "Notificacións de escritorio",
|
|
"lastfmScrobbling": "Scrobble con Last.fm",
|
|
"listenBrainzScrobbling": "Scrobble con ListenBrainz",
|
|
"replaygain": "Modo ReplayGain",
|
|
"preAmp": "PreAmp (dB) de ReplayGain",
|
|
"gain": {
|
|
"none": "Desactivada",
|
|
"album": "Usar ganancia do Álbum",
|
|
"track": "Usar ganancia da Canción"
|
|
},
|
|
"lastfmNotConfigured": "Clave da API Last.fm non configurada"
|
|
}
|
|
},
|
|
"albumList": "Álbums",
|
|
"about": "Acerca de",
|
|
"playlists": "Listas de reprodución",
|
|
"sharedPlaylists": "Listas compartidas",
|
|
"librarySelector": {
|
|
"allLibraries": "Todas as bibliotecas (%{count})",
|
|
"multipleLibraries": "%{selected} de %{total} Bibliotecas",
|
|
"selectLibraries": "Seleccionar Bibliotecas",
|
|
"none": "Ningunha"
|
|
}
|
|
},
|
|
"player": {
|
|
"playListsText": "Reproducir cola",
|
|
"openText": "Abrir",
|
|
"closeText": "Pechar",
|
|
"notContentText": "Sen música",
|
|
"clickToPlayText": "Preme para reproducir",
|
|
"clickToPauseText": "Preme para deter",
|
|
"nextTrackText": "Canción seguinte",
|
|
"previousTrackText": "Canción anterior",
|
|
"reloadText": "Recargar",
|
|
"volumeText": "Volume",
|
|
"toggleLyricText": "Activar letras",
|
|
"toggleMiniModeText": "Minimizar",
|
|
"destroyText": "Destruír",
|
|
"downloadText": "Descargar",
|
|
"removeAudioListsText": "Eliminar listas de audio",
|
|
"clickToDeleteText": "Preme para eliminar %{name}",
|
|
"emptyLyricText": "Sen letra",
|
|
"playModeText": {
|
|
"order": "Na orde",
|
|
"orderLoop": "Repetir",
|
|
"singleLoop": "Repetir unha",
|
|
"shufflePlay": "Barallar"
|
|
}
|
|
},
|
|
"about": {
|
|
"links": {
|
|
"homepage": "Inicio",
|
|
"source": "Código fonte",
|
|
"featureRequests": "Solicitar funcións",
|
|
"lastInsightsCollection": "Última colección insights",
|
|
"insights": {
|
|
"disabled": "Desactivado",
|
|
"waiting": "Agardando"
|
|
}
|
|
},
|
|
"tabs": {
|
|
"about": "Sobre",
|
|
"config": "Configuración"
|
|
},
|
|
"config": {
|
|
"configName": "Nome",
|
|
"environmentVariable": "Variable de entorno",
|
|
"currentValue": "Valor actual",
|
|
"configurationFile": "Ficheiro de configuración",
|
|
"exportToml": "Exportar configuración (TOML)",
|
|
"exportSuccess": "Configuración exportada ao portapapeis no formato TOML",
|
|
"exportFailed": "Fallou a copia da configuración",
|
|
"devFlagsHeader": "Configuracións de Desenvolvemento (suxeitas a cambio/retirada)",
|
|
"devFlagsComment": "Son axustes experimentais e poden retirarse en futuras versións",
|
|
"downloadToml": "Descargar configuración (TOML)"
|
|
}
|
|
},
|
|
"activity": {
|
|
"title": "Actividade",
|
|
"totalScanned": "Número de cartafoles examinados",
|
|
"quickScan": "Escaneo rápido",
|
|
"fullScan": "Escaneo completo",
|
|
"serverUptime": "Servidor a funcionar",
|
|
"serverDown": "SEN CONEXIÓN",
|
|
"scanType": "Tipo",
|
|
"status": "Erro de escaneado",
|
|
"elapsedTime": "Tempo transcurrido",
|
|
"selectiveScan": "Selectivo"
|
|
},
|
|
"help": {
|
|
"title": "Atallos de Navidrome",
|
|
"hotkeys": {
|
|
"show_help": "Mostrar esta axuda",
|
|
"toggle_menu": "Activar Menú Barra lateral",
|
|
"toggle_play": "Reproducir / Deter",
|
|
"prev_song": "Canción anterior",
|
|
"next_song": "Canción seguinte",
|
|
"vol_up": "Máis volume",
|
|
"vol_down": "Menos volume",
|
|
"toggle_love": "Engadir canción a favoritas",
|
|
"current_song": "Ir á Canción actual "
|
|
}
|
|
},
|
|
"nowPlaying": {
|
|
"title": "En reprodución",
|
|
"empty": "Sen reprodución",
|
|
"minutesAgo": "hai %{smart_count} minuto |||| hai %{smart_count} minutos"
|
|
}
|
|
}
|