Files
navidrome/resources/i18n/pt-br.json
T
adrbn d004f99f8f feat(playlist): add custom playlist cover art upload (#5110)
* feat(playlist): add custom playlist cover art upload - #406

Allow users to upload, view, and remove custom cover images for playlists.
Custom images take priority over the auto-generated tiled artwork.

Backend:
- Add `image_path` column to playlist table (migration with proper rollback)
- Add `SetImage`/`RemoveImage` methods to playlist service
- Add `POST/DELETE /api/playlist/{id}/image` endpoints
- Prioritize custom image in artwork reader pipeline
- Clean up image files on playlist deletion
- Use glob-based cleanup to prevent orphaned files across format changes
- Reject uploads with undetermined image type (400)

Frontend:
- Hover overlay on playlist cover with upload (camera) and remove (trash) buttons
- Lightbox for full-size cover art viewing
- Cover art thumbnails in the playlist list view
- Loading/error states and i18n strings

Closes #406

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: adrbn <128328324+adrbn@users.noreply.github.com>

* refactor: rename playlist image path migration file

Signed-off-by: Deluan <deluan@navidrome.org>

* fix(playlist): address review feedback for cover art upload - #406

- Use httpClient instead of raw fetch for image upload/remove
- Revert glob cleanup to simple imagePath check
- Add log.Error before all error HTTP responses
- Add backend tests for SetImage and RemoveImage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: adrbn <128328324+adrbn@users.noreply.github.com>

* refactor(playlist): use Playlist.ArtworkPath() for image storage

Migrate all playlist image path handling to use the new
Playlist.ArtworkPath() method as the single source of truth. The DB now
stores only the filename (e.g. "pls-1.jpg") instead of a relative path,
and images are stored under {DataFolder}/artwork/playlist/ instead of
{DataFolder}/playlist_images/. The artwork root directory is created at
startup alongside DataFolder and CacheFolder. This also removes the
conf dependency from reader_playlist.go since path resolution is now
fully encapsulated in the model.

Signed-off-by: Deluan <deluan@navidrome.org>

* refactor(playlist): streamline artwork image selection logic

Signed-off-by: Deluan <deluan@navidrome.org>

* refactor: move translation keys, add pt-BR translations

Signed-off-by: Deluan <deluan@navidrome.org>

* refactor(playlist): rename image_path to image_file

Rename the playlist cover art column and field from image_path/ImagePath
to image_file/ImageFile across the migration, model, service, tests, and
UI. The new name more accurately describes what the field stores (a
filename, not a path) and aligns with the existing ImageFiles/IsImageFile
naming conventions in the codebase.

---------

Signed-off-by: adrbn <128328324+adrbn@users.noreply.github.com>
Signed-off-by: Deluan <deluan@navidrome.org>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Deluan Quintão <deluan@navidrome.org>
2026-03-01 14:07:18 -05:00

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",
"uploadCover": "Enviar Capa",
"removeCover": "Remover Capa"
},
"message": {
"coverUploaded": "Capa atualizada",
"coverRemoved": "Capa removida",
"coverUploadError": "Erro ao enviar capa",
"coverRemoveError": "Erro ao remover capa",
"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": {
"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"
}
}