mirror of
https://github.com/navidrome/navidrome.git
synced 2026-11-12 05:08:45 +01:00
* feat(scrobbler): add scrobble_filter column to user * feat(scrobbler): validate scrobble filter criteria on user save * refactor(persistence): make smart playlist join helpers package-level * feat(scrobbler): add MediaFileRepository.MatchesCriteria * feat(scrobbler): filter external scrobbles with per-user criteria * feat(ui): add scrobble filter field to user form * fix(scrobbler): default scrobble_filter to empty string for existing users * refactor(scrobbler): also gate playback reports on the scrobble filter Playback reports carry the same track metadata to plugin scrobblers, so a filtered track leaked through that third dispatch path. Skip the filter evaluation entirely when no scrobbler is active. * refactor(persistence): move criteria join building into criteria_sql.go The join set a criteria needs was decided in criteria_sql.go but built in smart_playlist_repository.go, so both callers had to pair the two by hand. * refactor(persistence): unexport smartPlaylistCriteria methods The type never leaves the package, so the exported names advertised an API that callers outside persistence could never reach. Also disambiguates where/orderBy from squirrel's SelectBuilder methods of the same name. * fix(ui): cap the scrobble filter field width fullWidth stretched it across the whole page next to 256px inputs. Bounded at 40em, with two rows and a resize handle so JSON rules stay readable. * refactor(ui): move scrobble filter input in UserEdit component * feat(ui): add pt-BR translations for the scrobble filter * fix(scrobbler): take the filter verdict before incPlay incPlay mutates play counts and dates a filter can test on, so evaluating at dispatch time let one play decide differently on either side of the increment: a track could be scrobbled despite matching, or lose only its stopped report and strand presence plugins. Reject limit/offset too, rather than silently ignoring part of a rule copied from a smart playlist. * fix(scrobbler): filter the report from an expired session The expiry callback runs with a stub user carrying no filter, so evaluating there always returned false and leaked the track to plugin scrobblers. That is the normal path for clients that never send stopped, such as legacy Subsonic now-playing. Carry the last verdict on the session instead. * refactor(scrobbler): skip the now-playing enqueue instead of threading the verdict Queuing an entry only to drop it at dispatch also cancelled a pending announcement for the previous, unfiltered track, since the queue is keyed by player and a new entry replaces the old one. * fix(scrobbler): evaluate the filter regardless of active scrobblers The verdict is stored on the session and dispatched at expiry, so skipping evaluation when no scrobbler was active let a plugin enabled mid-session receive a filtered track. The empty-filter guard above already gives servers without scrobbling the same free path, so the shortcut only ever applied to users who had a filter set.
726 lines
No EOL
29 KiB
JSON
726 lines
No EOL
29 KiB
JSON
{
|
|
"languageName": "Português (Brasil)",
|
|
"resources": {
|
|
"song": {
|
|
"name": "Música |||| Músicas",
|
|
"fields": {
|
|
"albumArtist": "Artista do Álbum",
|
|
"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",
|
|
"albumGain": "Ganho do álbum",
|
|
"trackGain": "Ganho da faixa",
|
|
"missing": "Ausente",
|
|
"libraryName": "Biblioteca",
|
|
"composer": "Compositor",
|
|
"disc": "Disco %{discNumber}"
|
|
},
|
|
"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 do Álbum",
|
|
"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",
|
|
"scrobbleFilter": "Filtro de scrobble"
|
|
},
|
|
"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",
|
|
"scrobbleFilter": "Músicas que correspondem a estas regras de playlist inteligente não são enviadas ao Last.fm, ListenBrainz ou plugins de scrobble. Usa a mesma sintaxe JSON e o mesmo comportamento das playlists inteligentes. Exemplo: {\"all\":[{\"lt\":{\"rating\":4}}]}. Deixe vazio para enviar scrobbles de todas as músicas. As contagens de reprodução locais não são afetadas."
|
|
},
|
|
"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",
|
|
"invalidScrobbleFilter": "Devem ser regras válidas de playlist inteligente. Limite, deslocamento e intervalo de atualização não são suportados."
|
|
}
|
|
},
|
|
"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'.",
|
|
"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.",
|
|
"allowWriteAccessHelp": "Quando habilitado, o plugin pode modificar arquivos nos diretórios das bibliotecas. Por padrão, plugins têm acesso somente leitura."
|
|
},
|
|
"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...",
|
|
"uploadCover": "Enviar Capa",
|
|
"removeCover": "Remover Capa",
|
|
"coverUploaded": "Capa atualizada",
|
|
"coverRemoved": "Capa removida",
|
|
"coverUploadError": "Erro ao enviar capa",
|
|
"coverRemoveError": "Erro ao remover capa"
|
|
},
|
|
"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"
|
|
}
|
|
} |