ab8a58157a
* 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>
720 lines
28 KiB
JSON
720 lines
28 KiB
JSON
{
|
|
"languageName": "Português (Brasil)",
|
|
"resources": {
|
|
"song": {
|
|
"name": "Música |||| Músicas",
|
|
"fields": {
|
|
"albumArtist": "Artista",
|
|
"duration": "Duração",
|
|
"trackNumber": "#",
|
|
"playCount": "Execuções",
|
|
"title": "Título",
|
|
"artist": "Artista",
|
|
"album": "Álbum",
|
|
"path": "Arquivo",
|
|
"genre": "Gênero",
|
|
"compilation": "Coletânea",
|
|
"year": "Ano",
|
|
"size": "Tamanho",
|
|
"updatedAt": "Últ. Atualização",
|
|
"bitRate": "Bitrate",
|
|
"discSubtitle": "Sub-título do disco",
|
|
"starred": "Favorita",
|
|
"comment": "Comentário",
|
|
"rating": "Classificação",
|
|
"quality": "Qualidade",
|
|
"bpm": "BPM",
|
|
"playDate": "Últ. Execução",
|
|
"channels": "Canais",
|
|
"createdAt": "Adiconado em",
|
|
"grouping": "Agrupamento",
|
|
"mood": "Mood",
|
|
"participants": "Outros Participantes",
|
|
"tags": "Outras Tags",
|
|
"mappedTags": "Tags mapeadas",
|
|
"rawTags": "Tags originais",
|
|
"bitDepth": "Profundidade de bits",
|
|
"sampleRate": "Taxa de amostragem",
|
|
"missing": "Ausente",
|
|
"libraryName": "Biblioteca",
|
|
"composer": "Compositor"
|
|
},
|
|
"actions": {
|
|
"addToQueue": "Adicionar à fila",
|
|
"playNow": "Tocar agora",
|
|
"addToPlaylist": "Adicionar à playlist",
|
|
"shuffleAll": "Aleatório",
|
|
"download": "Baixar",
|
|
"playNext": "Toca a seguir",
|
|
"info": "Detalhes",
|
|
"showInPlaylist": "Ir para playlist",
|
|
"instantMix": "Mix Instantâneo"
|
|
}
|
|
},
|
|
"album": {
|
|
"name": "Álbum |||| Álbuns",
|
|
"fields": {
|
|
"albumArtist": "Artista",
|
|
"artist": "Artista",
|
|
"duration": "Duração",
|
|
"songCount": "Músicas",
|
|
"playCount": "Execuções",
|
|
"name": "Nome",
|
|
"genre": "Gênero",
|
|
"compilation": "Coletânea",
|
|
"year": "Ano",
|
|
"updatedAt": "Últ. Atualização",
|
|
"comment": "Comentário",
|
|
"rating": "Classificação",
|
|
"createdAt": "Adicionado em",
|
|
"size": "Tamanho",
|
|
"originalDate": "Original",
|
|
"releaseDate": "Data de Lançamento",
|
|
"releases": "Versão||||Versões",
|
|
"released": "Lançado",
|
|
"recordLabel": "Selo",
|
|
"catalogNum": "Nr. Catálogo",
|
|
"releaseType": "Tipo",
|
|
"grouping": "Agrupamento",
|
|
"media": "Mídia",
|
|
"mood": "Mood",
|
|
"date": "Data de Lançamento",
|
|
"missing": "Ausente",
|
|
"libraryName": "Biblioteca"
|
|
},
|
|
"actions": {
|
|
"playAll": "Tocar",
|
|
"playNext": "Tocar em seguida",
|
|
"addToQueue": "Adicionar à fila",
|
|
"shuffle": "Aleatório",
|
|
"addToPlaylist": "Adicionar à playlist",
|
|
"download": "Baixar",
|
|
"info": "Detalhes",
|
|
"share": "Compartilhar"
|
|
},
|
|
"lists": {
|
|
"all": "Todos",
|
|
"random": "Aleatório",
|
|
"recentlyAdded": "Recém-adicionados",
|
|
"recentlyPlayed": "Recém-tocados",
|
|
"mostPlayed": "Mais tocados",
|
|
"starred": "Favoritos",
|
|
"topRated": "Melhor classificados"
|
|
}
|
|
},
|
|
"artist": {
|
|
"name": "Artista |||| Artistas",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"albumCount": "Total de Álbuns",
|
|
"songCount": "Total de Músicas",
|
|
"playCount": "Execuções",
|
|
"rating": "Classificação",
|
|
"genre": "Gênero",
|
|
"size": "Tamanho",
|
|
"role": "Role",
|
|
"missing": "Ausente"
|
|
},
|
|
"roles": {
|
|
"albumartist": "Artista do Álbum |||| Artistas do Álbum",
|
|
"artist": "Artista |||| Artistas",
|
|
"composer": "Compositor |||| Compositores",
|
|
"conductor": "Maestro |||| Maestros",
|
|
"lyricist": "Letrista |||| Letristas",
|
|
"arranger": "Arranjador |||| Arranjadores",
|
|
"producer": "Produtor |||| Produtores",
|
|
"director": "Diretor |||| Diretores",
|
|
"engineer": "Engenheiro |||| Engenheiros",
|
|
"mixer": "Mixador |||| Mixadores",
|
|
"remixer": "Remixador |||| Remixadores",
|
|
"djmixer": "DJ Mixer |||| DJ Mixers",
|
|
"performer": "Músico |||| Músicos",
|
|
"maincredit": "Artista do Álbum ou Artista |||| Artistas do Álbum ou Artistas"
|
|
},
|
|
"actions": {
|
|
"shuffle": "Aleatório",
|
|
"radio": "Rádio",
|
|
"topSongs": "Mais tocadas"
|
|
}
|
|
},
|
|
"user": {
|
|
"name": "Usuário |||| Usuários",
|
|
"fields": {
|
|
"userName": "Usuário",
|
|
"isAdmin": "Admin?",
|
|
"lastLoginAt": "Últ. Login",
|
|
"updatedAt": "Últ. Atualização",
|
|
"name": "Nome",
|
|
"password": "Senha",
|
|
"createdAt": "Data de Criação",
|
|
"changePassword": "Trocar Senha?",
|
|
"currentPassword": "Senha Atual",
|
|
"newPassword": "Nova Senha",
|
|
"token": "Token",
|
|
"lastAccessAt": "Últ. Acesso",
|
|
"libraries": "Bibliotecas"
|
|
},
|
|
"helperTexts": {
|
|
"name": "Alterações no seu nome só serão refletidas no próximo login",
|
|
"libraries": "Selecione bibliotecas específicas para este usuário, ou deixe vazio para usar bibliotecas padrão"
|
|
},
|
|
"notifications": {
|
|
"created": "Novo usuário criado",
|
|
"updated": "Usuário atualizado com sucesso",
|
|
"deleted": "Usuário deletado com sucesso"
|
|
},
|
|
"message": {
|
|
"listenBrainzToken": "Entre seu token do ListenBrainz",
|
|
"clickHereForToken": "Clique aqui para obter seu token",
|
|
"selectAllLibraries": "Selecionar todas as bibliotecas",
|
|
"adminAutoLibraries": "Usuários administradores têm acesso automático a todas as bibliotecas"
|
|
},
|
|
"validation": {
|
|
"librariesRequired": "Pelo menos uma biblioteca deve ser selecionada para usuários não-administradores"
|
|
}
|
|
},
|
|
"player": {
|
|
"name": "Tocador |||| Tocadores",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"transcodingId": "Conversão",
|
|
"maxBitRate": "Bitrate máx",
|
|
"client": "Cliente",
|
|
"userName": "Usuário",
|
|
"lastSeen": "Últ. acesso",
|
|
"reportRealPath": "Use paths reais",
|
|
"scrobbleEnabled": "Enviar scrobbles para serviços externos"
|
|
}
|
|
},
|
|
"transcoding": {
|
|
"name": "Conversão |||| Conversões",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"targetFormat": "Formato",
|
|
"defaultBitRate": "Bitrate padrão",
|
|
"command": "Comando"
|
|
}
|
|
},
|
|
"playlist": {
|
|
"name": "Playlist |||| Playlists",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"duration": "Duração",
|
|
"ownerName": "Dono",
|
|
"public": "Pública",
|
|
"updatedAt": "Últ. Atualização",
|
|
"createdAt": "Data de Criação",
|
|
"songCount": "Músicas",
|
|
"comment": "Comentário",
|
|
"sync": "Auto-importar",
|
|
"path": "Importar de"
|
|
},
|
|
"actions": {
|
|
"selectPlaylist": "Selecione a playlist:",
|
|
"addNewPlaylist": "Criar \"%{name}\"",
|
|
"export": "Exportar",
|
|
"makePublic": "Pública",
|
|
"makePrivate": "Pessoal",
|
|
"saveQueue": "Salvar fila em nova Playlist",
|
|
"searchOrCreate": "Buscar playlists ou criar nova...",
|
|
"pressEnterToCreate": "Pressione Enter para criar nova playlist",
|
|
"removeFromSelection": "Remover da seleção"
|
|
},
|
|
"message": {
|
|
"duplicate_song": "Adicionar músicas duplicadas",
|
|
"song_exist": "Algumas destas músicas já existem na playlist. Você quer adicionar as duplicadas ou ignorá-las?",
|
|
"noPlaylistsFound": "Nenhuma playlist encontrada",
|
|
"noPlaylists": "Nenhuma playlist disponível"
|
|
}
|
|
},
|
|
"radio": {
|
|
"name": "Rádio |||| Rádios",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"streamUrl": "Endereço de stream",
|
|
"homePageUrl": "Home Page",
|
|
"updatedAt": "Últ. Atualização",
|
|
"createdAt": "Data de Criação"
|
|
},
|
|
"actions": {
|
|
"playNow": "Tocar agora"
|
|
}
|
|
},
|
|
"share": {
|
|
"name": "Compartilhamento |||| Compartilhamentos",
|
|
"fields": {
|
|
"username": "Compartilhado por",
|
|
"url": "Link",
|
|
"description": "Descrição",
|
|
"contents": "Conteúdo",
|
|
"expiresAt": "Dt. Expiração",
|
|
"lastVisitedAt": "Última visita",
|
|
"visitCount": "Visitas",
|
|
"format": "Formato",
|
|
"maxBitRate": "Bitrate máx",
|
|
"updatedAt": "Últ. Atualização",
|
|
"createdAt": "Data de Criação",
|
|
"downloadable": "Permitir Baixar?"
|
|
}
|
|
},
|
|
"missing": {
|
|
"name": "Arquivo ausente |||| Arquivos ausentes",
|
|
"fields": {
|
|
"path": "Caminho",
|
|
"size": "Tamanho",
|
|
"updatedAt": "Desaparecido em",
|
|
"libraryName": "Biblioteca"
|
|
},
|
|
"actions": {
|
|
"remove": "Remover",
|
|
"remove_all": "Remover todos"
|
|
},
|
|
"notifications": {
|
|
"removed": "Arquivo(s) ausente(s) removido(s)"
|
|
},
|
|
"empty": "Nenhum arquivo ausente"
|
|
},
|
|
"library": {
|
|
"name": "Biblioteca |||| Bibliotecas",
|
|
"fields": {
|
|
"name": "Nome",
|
|
"path": "Caminho",
|
|
"remotePath": "Caminho Remoto",
|
|
"lastScanAt": "Último Scan",
|
|
"songCount": "Músicas",
|
|
"albumCount": "Álbuns",
|
|
"artistCount": "Artistas",
|
|
"totalSongs": "Músicas",
|
|
"totalAlbums": "Álbuns",
|
|
"totalArtists": "Artistas",
|
|
"totalFolders": "Pastas",
|
|
"totalFiles": "Arquivos",
|
|
"totalMissingFiles": "Arquivos Ausentes",
|
|
"totalSize": "Tamanho Total",
|
|
"totalDuration": "Duração",
|
|
"defaultNewUsers": "Padrão para Novos Usuários",
|
|
"createdAt": "Data de Criação",
|
|
"updatedAt": "Últ. Atualização"
|
|
},
|
|
"sections": {
|
|
"basic": "Informações Básicas",
|
|
"statistics": "Estatísticas"
|
|
},
|
|
"actions": {
|
|
"scan": "Scanear Biblioteca",
|
|
"manageUsers": "Gerenciar Acesso do Usuário",
|
|
"viewDetails": "Ver Detalhes",
|
|
"quickScan": "Scan Rápido",
|
|
"fullScan": "Scan Completo"
|
|
},
|
|
"notifications": {
|
|
"created": "Biblioteca criada com sucesso",
|
|
"updated": "Biblioteca atualizada com sucesso",
|
|
"deleted": "Biblioteca excluída com sucesso",
|
|
"scanStarted": "Scan da biblioteca iniciada",
|
|
"scanCompleted": "Scan da biblioteca concluída",
|
|
"quickScanStarted": "Scan rápido iniciado",
|
|
"fullScanStarted": "Scan completo iniciado",
|
|
"scanError": "Erro ao iniciar o scan. Verifique os logs"
|
|
},
|
|
"validation": {
|
|
"nameRequired": "Nome da biblioteca é obrigatório",
|
|
"pathRequired": "Caminho da biblioteca é obrigatório",
|
|
"pathNotDirectory": "Caminho da biblioteca deve ser um diretório",
|
|
"pathNotFound": "Caminho da biblioteca não encontrado",
|
|
"pathNotAccessible": "Caminho da biblioteca não está acessível",
|
|
"pathInvalid": "Caminho da biblioteca inválido"
|
|
},
|
|
"messages": {
|
|
"deleteConfirm": "Tem certeza que deseja excluir esta biblioteca? Isso removerá todos os dados associados.",
|
|
"scanInProgress": "Scan em progresso...",
|
|
"noLibrariesAssigned": "Nenhuma biblioteca atribuída a este usuário"
|
|
}
|
|
},
|
|
"plugin": {
|
|
"name": "Plugin |||| Plugins",
|
|
"fields": {
|
|
"id": "ID",
|
|
"name": "Nome",
|
|
"description": "Descrição",
|
|
"version": "Versão",
|
|
"author": "Autor",
|
|
"website": "Website",
|
|
"permissions": "Permissões",
|
|
"enabled": "Habilitado",
|
|
"status": "Status",
|
|
"path": "Caminho",
|
|
"lastError": "Erro",
|
|
"hasError": "Erro",
|
|
"updatedAt": "Atualizado",
|
|
"createdAt": "Instalado",
|
|
"configKey": "Chave",
|
|
"configValue": "Valor",
|
|
"allUsers": "Permitir todos os usuários",
|
|
"selectedUsers": "Usuários selecionados",
|
|
"allLibraries": "Permitir todas as bibliotecas",
|
|
"selectedLibraries": "Bibliotecas selecionadas",
|
|
"allowWriteAccess": "Permitir acesso de escrita"
|
|
},
|
|
"sections": {
|
|
"status": "Status",
|
|
"info": "Informações do Plugin",
|
|
"configuration": "Configuração",
|
|
"manifest": "Manifesto",
|
|
"usersPermission": "Permissão de Usuários",
|
|
"libraryPermission": "Permissão de Bibliotecas"
|
|
},
|
|
"status": {
|
|
"enabled": "Habilitado",
|
|
"disabled": "Desabilitado"
|
|
},
|
|
"actions": {
|
|
"enable": "Habilitar",
|
|
"disable": "Desabilitar",
|
|
"disabledDueToError": "Corrija o erro antes de habilitar",
|
|
"disabledUsersRequired": "Selecione usuários antes de habilitar",
|
|
"disabledLibrariesRequired": "Selecione bibliotecas antes de habilitar",
|
|
"addConfig": "Adicionar configuração",
|
|
"rescan": "Rescanear"
|
|
},
|
|
"notifications": {
|
|
"enabled": "Plugin habilitado",
|
|
"disabled": "Plugin desabilitado",
|
|
"updated": "Plugin atualizado",
|
|
"error": "Erro ao atualizar plugin"
|
|
},
|
|
"validation": {
|
|
"invalidJson": "A configuração deve ser um JSON válido"
|
|
},
|
|
"messages": {
|
|
"configHelp": "Configure o plugin usando pares chave-valor. Deixe vazio se o plugin não precisa de configuração.",
|
|
"clickPermissions": "Clique em uma permissão para ver detalhes",
|
|
"noConfig": "Nenhuma configuração definida",
|
|
"allUsersHelp": "Quando habilitado, o plugin terá acesso a todos os usuários, incluindo os criados no futuro.",
|
|
"noUsers": "Nenhum usuário selecionado",
|
|
"permissionReason": "Motivo",
|
|
"usersRequired": "Este plugin requer acesso a informações de usuário. Selecione quais usuários o plugin pode acessar, ou habilite 'Permitir todos os usuários'.",
|
|
"allLibrariesHelp": "Quando habilitado, o plugin terá acesso a todas as bibliotecas, incluindo as criadas no futuro.",
|
|
"noLibraries": "Nenhuma biblioteca selecionada",
|
|
"librariesRequired": "Este plugin requer acesso a informações de bibliotecas. Selecione quais bibliotecas o plugin pode acessar, ou habilite 'Permitir todas as bibliotecas'.",
|
|
"allowWriteAccessHelp": "Quando habilitado, o plugin pode modificar arquivos nos diretórios das bibliotecas. Por padrão, plugins têm acesso somente leitura.",
|
|
"requiredHosts": "Hosts necessários",
|
|
"configValidationError": "Falha na validação da configuração:",
|
|
"schemaRenderError": "Não foi possível renderizar o formulário de configuração. O schema do plugin pode estar inválido."
|
|
},
|
|
"placeholders": {
|
|
"configKey": "chave",
|
|
"configValue": "valor"
|
|
}
|
|
}
|
|
},
|
|
"ra": {
|
|
"auth": {
|
|
"welcome1": "Obrigado por instalar Navidrome!",
|
|
"welcome2": "Para iniciar, crie um usuário admin",
|
|
"confirmPassword": "Confirme a senha",
|
|
"buttonCreateAdmin": "Criar Admin",
|
|
"auth_check_error": "Por favor, faça login para continuar",
|
|
"user_menu": "Perfil",
|
|
"username": "Usuário",
|
|
"password": "Senha",
|
|
"sign_in": "Entrar",
|
|
"sign_in_error": "Erro na autenticação, tente novamente.",
|
|
"logout": "Sair",
|
|
"insightsCollectionNote": "Navidrome coleta dados de uso anônimos para\najudar a melhorar o projeto. Clique [aqui] para\nsaber mais e para desativar se desejar"
|
|
},
|
|
"validation": {
|
|
"invalidChars": "Somente use letras e numeros",
|
|
"passwordDoesNotMatch": "Senha não confere",
|
|
"required": "Obrigatório",
|
|
"minLength": "Deve ser ter no mínimo %{min} caracteres",
|
|
"maxLength": "Deve ter no máximo %{max} caracteres",
|
|
"minValue": "Deve ser %{min} ou maior",
|
|
"maxValue": "Deve ser %{max} ou menor",
|
|
"number": "Deve ser um número",
|
|
"email": "Deve ser um email válido",
|
|
"oneOf": "Deve ser uma das seguintes opções: %{options}",
|
|
"regex": "Deve ter o formato específico (regexp): %{pattern}",
|
|
"unique": "Deve ser único",
|
|
"url": "URL inválida"
|
|
},
|
|
"action": {
|
|
"add_filter": "Adicionar Filtro",
|
|
"add": "Adicionar",
|
|
"back": "Voltar",
|
|
"bulk_actions": "1 item selecionado |||| %{smart_count} itens selecionados",
|
|
"cancel": "Cancelar",
|
|
"clear_input_value": "Limpar campo",
|
|
"clone": "Duplicar",
|
|
"confirm": "Confirmar",
|
|
"create": "Novo",
|
|
"delete": "Deletar",
|
|
"edit": "Editar",
|
|
"export": "Exportar",
|
|
"list": "Listar",
|
|
"refresh": "Atualizar",
|
|
"remove_filter": "Cancelar filtro",
|
|
"remove": "Remover",
|
|
"save": "Salvar",
|
|
"search": "Buscar",
|
|
"show": "Exibir",
|
|
"sort": "Ordenar",
|
|
"undo": "Desfazer",
|
|
"expand": "Expandir",
|
|
"close": "Fechar",
|
|
"open_menu": "Abrir menu",
|
|
"close_menu": "Fechar menu",
|
|
"unselect": "Deselecionar",
|
|
"skip": "Ignorar",
|
|
"bulk_actions_mobile": "1 |||| %{smart_count}",
|
|
"share": "Compartilhar",
|
|
"download": "Baixar"
|
|
},
|
|
"boolean": {
|
|
"true": "Sim",
|
|
"false": "Não"
|
|
},
|
|
"page": {
|
|
"create": "Criar %{name}",
|
|
"dashboard": "Painel de Controle",
|
|
"edit": "%{name} #%{id}",
|
|
"error": "Um erro ocorreu",
|
|
"list": "Listar %{name}",
|
|
"loading": "Carregando",
|
|
"not_found": "Não encontrado",
|
|
"show": "%{name} #%{id}",
|
|
"empty": "Ainda não há nenhum registro em %{name}",
|
|
"invite": "Gostaria de criar um novo?"
|
|
},
|
|
"input": {
|
|
"file": {
|
|
"upload_several": "Arraste alguns arquivos para fazer o upload, ou clique para selecioná-los.",
|
|
"upload_single": "Arraste o arquivo para fazer o upload, ou clique para selecioná-lo."
|
|
},
|
|
"image": {
|
|
"upload_several": "Arraste algumas imagens para fazer o upload ou clique para selecioná-las",
|
|
"upload_single": "Arraste um arquivo para upload ou clique em selecionar arquivo."
|
|
},
|
|
"references": {
|
|
"all_missing": "Não foi possível encontrar os dados das referencias.",
|
|
"many_missing": "Pelo menos uma das referências passadas não está mais disponível.",
|
|
"single_missing": "A referência passada aparenta não estar mais disponível."
|
|
},
|
|
"password": {
|
|
"toggle_visible": "Esconder senha",
|
|
"toggle_hidden": "Mostrar senha"
|
|
}
|
|
},
|
|
"message": {
|
|
"about": "Sobre",
|
|
"are_you_sure": "Tem certeza?",
|
|
"bulk_delete_content": "Você tem certeza que deseja excluir %{name}? |||| Você tem certeza que deseja excluir estes %{smart_count} itens?",
|
|
"bulk_delete_title": "Excluir %{name} |||| Excluir %{smart_count} %{name} itens",
|
|
"delete_content": "Você tem certeza que deseja excluir?",
|
|
"delete_title": "Excluir %{name} #%{id}",
|
|
"details": "Detalhes",
|
|
"error": "Um erro ocorreu e a sua requisição não pôde ser completada.",
|
|
"invalid_form": "Este formulário não está valido. Certifique-se de corrigir os erros",
|
|
"loading": "A página está carregando. Um momento, por favor",
|
|
"no": "Não",
|
|
"not_found": "Foi digitada uma URL inválida, ou o link pode estar quebrado.",
|
|
"yes": "Sim",
|
|
"unsaved_changes": "Algumas das suas mudanças não foram salvas, deseja realmente ignorá-las?"
|
|
},
|
|
"navigation": {
|
|
"no_results": "Nenhum resultado encontrado",
|
|
"no_more_results": "A página numero %{page} está fora dos limites. Tente a página anterior.",
|
|
"page_out_of_boundaries": "Página %{page} fora do limite",
|
|
"page_out_from_end": "Não é possível ir após a última página",
|
|
"page_out_from_begin": "Não é possível ir antes da primeira página",
|
|
"page_range_info": "%{offsetBegin}-%{offsetEnd} de %{total}",
|
|
"page_rows_per_page": "Resultados por página:",
|
|
"next": "Próximo",
|
|
"prev": "Anterior",
|
|
"skip_nav": "Pular para o conteúdo"
|
|
},
|
|
"notification": {
|
|
"updated": "Item atualizado com sucesso |||| %{smart_count} itens foram atualizados com sucesso",
|
|
"created": "Item criado com sucesso",
|
|
"deleted": "Item removido com sucesso! |||| %{smart_count} itens foram removidos com sucesso",
|
|
"bad_item": "Item incorreto",
|
|
"item_doesnt_exist": "Esse item não existe mais",
|
|
"http_error": "Erro na comunicação com servidor",
|
|
"data_provider_error": "Erro interno do servidor. Entre em contato",
|
|
"i18n_error": "Não foi possível carregar as traduções para o idioma especificado",
|
|
"canceled": "Ação cancelada",
|
|
"logged_out": "Sua sessão foi encerrada. Por favor, reconecte",
|
|
"new_version": "Nova versão disponível! Por favor recarregue esta janela."
|
|
},
|
|
"toggleFieldsMenu": {
|
|
"columnsToDisplay": "Colunas visíveis",
|
|
"layout": "Layout",
|
|
"grid": "Grade",
|
|
"table": "Tabela"
|
|
}
|
|
},
|
|
"message": {
|
|
"uploadCover": "Enviar Capa",
|
|
"removeCover": "Remover Capa",
|
|
"coverUploaded": "Capa atualizada",
|
|
"coverRemoved": "Capa removida",
|
|
"coverUploadError": "Erro ao enviar capa",
|
|
"coverRemoveError": "Erro ao remover capa",
|
|
"note": "ATENÇÃO",
|
|
"transcodingDisabled": "Por questão de segurança, esta tela de configuração está desabilitada. Se você quiser alterar estas configurações, reinicie o servidor com a opção %{config}",
|
|
"transcodingEnabled": "Navidrome está sendo executado com a opção %{config}. Isto permite que potencialmente se execute comandos do sistema pela interface Web. É recomendado que vc mantenha esta opção desabilitada, e só a habilite quando precisar configurar opções de Conversão",
|
|
"songsAddedToPlaylist": "Música adicionada à playlist |||| %{smart_count} músicas adicionadas à playlist",
|
|
"noPlaylistsAvailable": "Nenhuma playlist",
|
|
"delete_user_title": "Excluir usuário '%{name}'",
|
|
"delete_user_content": "Você tem certeza que deseja excluir o usuário e todos os seus dados (incluindo suas playlists e preferências)?",
|
|
"notifications_blocked": "Você bloqueou notificações para este site nas configurações do seu browser",
|
|
"notifications_not_available": "Este navegador não suporta notificações",
|
|
"lastfmLinkSuccess": "Sua conta no Last.fm foi conectada com sucesso",
|
|
"lastfmLinkFailure": "Sua conta no Last.fm não pode ser conectada",
|
|
"lastfmUnlinkSuccess": "Sua conta no Last.fm foi desconectada",
|
|
"lastfmUnlinkFailure": "Sua conta no Last.fm não pode ser desconectada",
|
|
"openIn": {
|
|
"lastfm": "Abrir em Last.fm",
|
|
"musicbrainz": "Abrir em MusicBrainz"
|
|
},
|
|
"lastfmLink": "Leia mais",
|
|
"listenBrainzLinkSuccess": "Sua conta no ListenBrainz foi conectada com sucesso",
|
|
"listenBrainzLinkFailure": "Sua conta no ListenBrainz não pode ser conectada",
|
|
"listenBrainzUnlinkSuccess": "Sua conta no ListenBrainz foi desconectada",
|
|
"listenBrainzUnlinkFailure": "Sua conta no ListenBrainz não pode ser desconectada",
|
|
"downloadOriginalFormat": "Baixar no formato original",
|
|
"shareOriginalFormat": "Compartilhar no formato original",
|
|
"shareDialogTitle": "Compartilhar %{resource} '%{name}'",
|
|
"shareBatchDialogTitle": "Compartilhar 1 %{resource} |||| Compartilhar %{smart_count} %{resource}",
|
|
"shareSuccess": "Link copiado para o clipboard : %{url}",
|
|
"shareFailure": "Erro ao copiar o link %{url} para o clipboard",
|
|
"downloadDialogTitle": "Baixar %{resource} '%{name}' (%{size})",
|
|
"shareCopyToClipboard": "Copie para o clipboard: Ctrl+C, Enter",
|
|
"remove_missing_title": "Remover arquivos ausentes",
|
|
"remove_missing_content": "Você tem certeza que deseja remover os arquivos selecionados do banco de dados? Isso removerá permanentemente qualquer referência a eles, incluindo suas contagens de reprodução e classificações.",
|
|
"remove_all_missing_title": "Remover todos os arquivos ausentes",
|
|
"remove_all_missing_content": "Você tem certeza que deseja remover todos os arquivos ausentes do banco de dados? Isso removerá permanentemente qualquer referência a eles, incluindo suas contagens de reprodução e classificações.",
|
|
"noSimilarSongsFound": "Nenhuma música semelhante encontrada",
|
|
"noTopSongsFound": "Nenhuma música mais tocada encontrada",
|
|
"startingInstantMix": "Carregando Mix Instantâneo..."
|
|
},
|
|
"menu": {
|
|
"library": "Biblioteca",
|
|
"settings": "Configurações",
|
|
"version": "Versão",
|
|
"theme": "Tema",
|
|
"personal": {
|
|
"name": "Pessoal",
|
|
"options": {
|
|
"theme": "Tema",
|
|
"language": "Língua",
|
|
"defaultView": "Tela inicial",
|
|
"desktop_notifications": "Notificações",
|
|
"lastfmScrobbling": "Enviar scrobbles para Last.fm",
|
|
"listenBrainzScrobbling": "Enviar scrobbles para ListenBrainz",
|
|
"replaygain": "Modo ReplayGain",
|
|
"preAmp": "PreAmp ReplayGain (dB)",
|
|
"gain": {
|
|
"none": "Desligado",
|
|
"album": "Usar ganho do álbum",
|
|
"track": "Usar ganho do faixa"
|
|
},
|
|
"lastfmNotConfigured": "A API-Key do Last.fm não está configurada"
|
|
}
|
|
},
|
|
"albumList": "Álbuns",
|
|
"about": "Info",
|
|
"playlists": "Playlists",
|
|
"sharedPlaylists": "Compartilhadas",
|
|
"librarySelector": {
|
|
"allLibraries": "Todas as Bibliotecas (%{count})",
|
|
"multipleLibraries": "%{selected} de %{total} Bibliotecas",
|
|
"selectLibraries": "Selecionar Bibliotecas",
|
|
"none": "Nenhuma"
|
|
}
|
|
},
|
|
"player": {
|
|
"playListsText": "Fila de Execução",
|
|
"openText": "Abrir",
|
|
"closeText": "Fechar",
|
|
"notContentText": "Nenhum música",
|
|
"clickToPlayText": "Clique para tocar",
|
|
"clickToPauseText": "Clique para pausar",
|
|
"nextTrackText": "Próxima faixa",
|
|
"previousTrackText": "Faixa anterior",
|
|
"reloadText": "Recarregar",
|
|
"volumeText": "Volume",
|
|
"toggleLyricText": "Letra",
|
|
"toggleMiniModeText": "Minimizar",
|
|
"destroyText": "Destruir",
|
|
"downloadText": "Baixar",
|
|
"removeAudioListsText": "Limpar fila de execução",
|
|
"clickToDeleteText": "Clique para remover %{name}",
|
|
"emptyLyricText": "Letra não disponível",
|
|
"playModeText": {
|
|
"order": "Em ordem",
|
|
"orderLoop": "Repetir tudo",
|
|
"singleLoop": "Repetir",
|
|
"shufflePlay": "Aleatório"
|
|
}
|
|
},
|
|
"about": {
|
|
"links": {
|
|
"homepage": "Website",
|
|
"source": "Código fonte",
|
|
"featureRequests": "Solicitar funcionalidade",
|
|
"lastInsightsCollection": "Última coleta de dados",
|
|
"insights": {
|
|
"disabled": "Desligado",
|
|
"waiting": "Aguardando"
|
|
}
|
|
},
|
|
"tabs": {
|
|
"about": "Sobre",
|
|
"config": "Configuração"
|
|
},
|
|
"config": {
|
|
"configName": "Nome da Configuração",
|
|
"environmentVariable": "Variável de Ambiente",
|
|
"currentValue": "Valor Atual",
|
|
"configurationFile": "Arquivo de Configuração",
|
|
"exportToml": "Exportar Configuração (TOML)",
|
|
"exportSuccess": "Configuração exportada para o clipboard em formato TOML",
|
|
"exportFailed": "Falha ao copiar configuração",
|
|
"devFlagsHeader": "Flags de Desenvolvimento (sujeitas a mudança/remoção)",
|
|
"devFlagsComment": "Estas são configurações experimentais e podem ser removidas em versões futuras",
|
|
"downloadToml": "Baixar configuração (TOML)"
|
|
}
|
|
},
|
|
"activity": {
|
|
"title": "Atividade",
|
|
"totalScanned": "Total de pastas scaneadas",
|
|
"quickScan": "Rápido",
|
|
"fullScan": "Completo",
|
|
"serverUptime": "Uptime do servidor",
|
|
"serverDown": "DESCONECTADO",
|
|
"scanType": "Último Scan",
|
|
"status": "Erro",
|
|
"elapsedTime": "Duração",
|
|
"selectiveScan": "Seletivo"
|
|
},
|
|
"help": {
|
|
"title": "Teclas de atalho",
|
|
"hotkeys": {
|
|
"show_help": "Mostra esta janela",
|
|
"toggle_menu": "Mostra o menu lateral",
|
|
"toggle_play": "Tocar / pausar",
|
|
"prev_song": "Música anterior",
|
|
"next_song": "Próxima música",
|
|
"vol_up": "Aumenta volume",
|
|
"vol_down": "Diminui volume",
|
|
"toggle_love": "Marcar/desmarcar favorita",
|
|
"current_song": "Vai para música atual"
|
|
}
|
|
},
|
|
"nowPlaying": {
|
|
"title": "Tocando agora",
|
|
"empty": "Nada tocando",
|
|
"minutesAgo": "%{smart_count} minuto atrás |||| %{smart_count} minutos atrás"
|
|
}
|
|
} |