diff --git a/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt b/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt index 8f17e977..94fa8b33 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt @@ -247,14 +247,16 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) { } private fun checkSetValidServerConnectionConfig(cb: (Boolean) -> Unit) = runBlocking { - Log.d(tag, "checkSetValidServerConnectionConfig | $serverConfigIdUsed") + Log.d(tag, "checkSetValidServerConnectionConfig | serverConfigIdUsed=$serverConfigIdUsed | lastServerConnectionConfigId=${DeviceManager.deviceData.lastServerConnectionConfigId}") coroutineScope { if (!DeviceManager.checkConnectivity(ctx)) { serverUserMediaProgress = mutableListOf() + Log.d(tag, "checkSetValidServerConnectionConfig: No connectivity") cb(false) - } else if (DeviceManager.serverConnectionConfigId == "") { // If in offline mode server connection config is unset + } else if (DeviceManager.deviceData.lastServerConnectionConfigId.isNullOrBlank()) { // If in offline mode last server connection config is unset serverUserMediaProgress = mutableListOf() + Log.d(tag, "checkSetValidServerConnectionConfig: No last server connection config") cb(false) } else { var hasValidConn = false @@ -334,6 +336,7 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) { checkSetValidServerConnectionConfig { isConnected -> if (isConnected) { serverConfigIdUsed = DeviceManager.serverConnectionConfigId + Log.d(tag, "loadAndroidAutoItems: Connected to server config id=$serverConfigIdUsed") loadLibraries { libraries -> if (libraries.isEmpty()) { @@ -360,6 +363,7 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) { } } } else { // Not connected to server + Log.d(tag, "loadAndroidAutoItems: Not connected to server") cb() } } diff --git a/components/app/AudioPlayer.vue b/components/app/AudioPlayer.vue index 39b5e1a9..35c23162 100644 --- a/components/app/AudioPlayer.vue +++ b/components/app/AudioPlayer.vue @@ -652,7 +652,7 @@ export default { this.closePlayback() }, touchstart(e) { - if (!e.changedTouches) return + if (!e.changedTouches || this.$store.state.globals.isModalOpen) return const touchPosY = e.changedTouches[0].pageY // when minimized only listen to touchstart on the player if (!this.showFullscreen && touchPosY < window.innerHeight - 120) return diff --git a/plugins/i18n.js b/plugins/i18n.js index 05e88e39..e31ddbb8 100644 --- a/plugins/i18n.js +++ b/plugins/i18n.js @@ -17,6 +17,7 @@ const languageCodeMap = { 'nl': { label: 'Nederlands', dateFnsLocale: 'nl' }, 'no': { label: 'Norsk', dateFnsLocale: 'no' }, 'pl': { label: 'Polski', dateFnsLocale: 'pl' }, + 'pt-br': { label: 'Português (Brasil)', dateFnsLocale: 'ptBR' }, 'ru': { label: 'Русский', dateFnsLocale: 'ru' }, 'sv': { label: 'Svenska', dateFnsLocale: 'sv' }, 'zh-cn': { label: '简体中文 (Simplified Chinese)', dateFnsLocale: 'zhCN' }, @@ -131,4 +132,4 @@ async function initialize() { export default ({ app, store }, inject) => { $localStore = app.$localStore initialize() -} \ No newline at end of file +} diff --git a/strings/pt-br.json b/strings/pt-br.json new file mode 100644 index 00000000..7098422d --- /dev/null +++ b/strings/pt-br.json @@ -0,0 +1,292 @@ +{ + "ButtonAdd": "Adicionar", + "ButtonAddNewServer": "Adicionar Novo Servidor", + "ButtonAuthors": "Autores", + "ButtonBack": "Voltar", + "ButtonCancel": "Cancelar", + "ButtonCancelTimer": "Cancelar Timer", + "ButtonClearFilter": "Limpar Filtro", + "ButtonCloseFeed": "Fechar Feed", + "ButtonCollections": "Coleções", + "ButtonConnect": "Conectar", + "ButtonConnectToServer": "Conectar ao Servidor", + "ButtonCreate": "Criar", + "ButtonCreateBookmark": "Criar Marcador", + "ButtonCreateNewPlaylist": "Criar Nova Lista de Reprodução", + "ButtonDelete": "Apagar", + "ButtonDeleteLocalEpisode": "Apagar episódio local", + "ButtonDeleteLocalFile": "Apagar arquivo local", + "ButtonDeleteLocalItem": "Apagar item local", + "ButtonDisableAutoTimer": "Desativar Timer Automático", + "ButtonDisconnect": "Desconectar", + "ButtonHistory": "Histórico", + "ButtonHome": "Principal", + "ButtonIssues": "Problemas", + "ButtonLatest": "Mais Recentes", + "ButtonLibrary": "Biblioteca", + "ButtonLocalMedia": "Mídia Local", + "ButtonManageLocalFiles": "Gerenciar Arquivos Locais", + "ButtonNewFolder": "Nova Pasta", + "ButtonNextEpisode": "Próximo Episódio", + "ButtonOpenFeed": "Abrir Feed", + "ButtonOverride": "Sobrepor", + "ButtonPause": "Pausar", + "ButtonPlay": "Reproduzir", + "ButtonPlaying": "Reproduzindo", + "ButtonPlaylists": "Lista de Reprodução", + "ButtonRead": "Ler", + "ButtonRemove": "Remover", + "ButtonRemoveFromServer": "Remover do Servidor", + "ButtonSave": "Salvar", + "ButtonSaveOrder": "Salvar Ordem", + "ButtonSearch": "Pesquisar", + "ButtonSendEbookToDevice": "Enviar Ebook para Dispositivo", + "ButtonSeries": "Série", + "ButtonSetTimer": "Definir Timer", + "ButtonStream": "Stream", + "ButtonSubmit": "Enviar", + "ButtonSwitchServerUser": "Trocar Servidor/Usuário", + "ButtonUserStats": "Estatísticas do Usuário", + "ButtonYes": "Sim", + "HeaderAccount": "Conta", + "HeaderAdvanced": "Avançado", + "HeaderAudioTracks": "Trilhas de áudio", + "HeaderChapters": "Capítulos", + "HeaderCollection": "Coleção", + "HeaderCollectionItems": "Itens da Coleção", + "HeaderConnectionStatus": "Status da Conexão", + "HeaderDetails": "Detalhes", + "HeaderDownloads": "Downloads", + "HeaderEbookFiles": "Arquivos Ebook", + "HeaderEpisodes": "Episódios", + "HeaderEreaderSettings": "Configurações Ereader", + "HeaderLatestEpisodes": "Últimos episódios", + "HeaderLibraries": "Bibliotecas", + "HeaderLocalFolders": "Pastas Locais", + "HeaderLocalLibraryItems": "Itens de Biblioteca Locais", + "HeaderNewPlaylist": "Nova Lista de Reprodução", + "HeaderOpenRSSFeed": "Abrir Feed RSS", + "HeaderPlaybackSettings": "Configurações de Reprodução", + "HeaderPlaylist": "Lista de Reprodução", + "HeaderPlaylistItems": "Itens da lista de reprodução", + "HeaderRSSFeed": "Feed RSS", + "HeaderRSSFeedGeneral": "Detalhes RSS", + "HeaderRSSFeedIsOpen": "Feed RSS está Aberto", + "HeaderSelectDownloadLocation": "Selecione Local para Download", + "HeaderSettings": "Configurações", + "HeaderSleepTimer": "Timer", + "HeaderSleepTimerSettings": "Configurações do Timer", + "HeaderStatsMinutesListeningChart": "Minutos Escutados (últimos 7 dias)", + "HeaderStatsRecentSessions": "Sessões Recentes", + "HeaderTableOfContents": "Sumário", + "HeaderUserInterfaceSettings": "Configurações da Interface do Usuário", + "HeaderYourStats": "Suas Estatísticas", + "LabelAdded": "Acrescentado", + "LabelAddedAt": "Acrescentado Em", + "LabelAddToPlaylist": "Adicionar à Lista de Reprodução", + "LabelAll": "Todos", + "LabelAuthor": "Autor", + "LabelAuthorFirstLast": "Autor (Nome Sobrenome)", + "LabelAuthorLastFirst": "Autor (Sobrenome, Nome)", + "LabelAuthors": "Autores", + "LabelAutoDownloadEpisodes": "Download Automático de Episódios", + "LabelAutoRewindTime": "Tempo para retroceder automaticamente", + "LabelAutoSleepTimer": "Timer automático", + "LabelAutoSleepTimerAutoRewind": "Retrocesso automático do timer", + "LabelAutoSleepTimerAutoRewindHelp": "Após o timer terminar, da próxima vez que o item for reproduzido a sua posição será retrocedida automaticamente.", + "LabelAutoSleepTimerHelp": "Ao reproduzir uma mídia entre as horas especificadas como inicío e fim, um timer será iniciado automaticamente.", + "LabelBooks": "Livros", + "LabelChapters": "Capítulos", + "LabelChapterTrack": "Trilha do Capítulo", + "LabelClosePlayer": "Fechar Reprodutor", + "LabelCollapseSeries": "Fechar Série", + "LabelComplete": "Concluído", + "LabelContinueBooks": "Continuar Livros", + "LabelContinueEpisodes": "Continuar Episódios", + "LabelContinueListening": "Continuar Escutando", + "LabelContinueReading": "Continuar Lendo", + "LabelContinueSeries": "Continuar Série", + "LabelCustomTime": "Personalizar tempo", + "LabelDescription": "Descrição", + "LabelDisableAudioFadeOut": "Desativar fade out de áudio", + "LabelDisableAudioFadeOutHelp": "O volume do áudio diminuirá progressivamente quando houver menos que 1 minuto no seu timer. Ative essa configuração para não diminuir o volume.", + "LabelDisableAutoRewind": "Desativar retrocesso automático", + "LabelDisableShakeToReset": "Desativar sacudir para resetar", + "LabelDisableShakeToResetHelp": "Sacudir o seu dispositivo quando o timer estiver ativo OU em até 2 minutos após o seu fim resetará o seu timer. Ative essa configuração para desabilitar o sacudir para resetar.", + "LabelDisableVibrateOnReset": "Desativar vibração ao resetar", + "LabelDisableVibrateOnResetHelp": "Quando o timer for resetado o seu dispositivo vibrará. Ative essa configuração para não vibrar quando o timer for resetado.", + "LabelDiscover": "Descobrir", + "LabelDownload": "Download", + "LabelDownloaded": "Download realizado", + "LabelDuration": "Duração", + "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", + "LabelEnable": "Ativar", + "LabelEnableMp3IndexSeeking": "Ativar busca por índice mp3", + "LabelEnableMp3IndexSeekingHelp": "Esta configuração só deve ser ativada se a busca em arquivos mp3 não estiver funcionando corretamente. Buscas incorretas são normalmente causadas por arquivos MP3 com bitrate variável (VBR). Esta configuração forçará a busca por índice, que é uma consulta do tempo-para-byte, elaborado durante a leitura do arquivo. Em alguns casos, com arquivos MP3 maiores, haverá um atraso ao buscar perto do final do arquivo.", + "LabelEnd": "Fim", + "LabelEndOfChapter": "Fim do Chapítulo", + "LabelEndTime": "Tempo final", + "LabelEpisode": "Episódio", + "LabelFeedURL": "URL do Feed", + "LabelFile": "Arquivo", + "LabelFileBirthtime": "Criação do Arquivo", + "LabelFileModified": "Modificação do Arquivo", + "LabelFilename": "Nome do Arquivo", + "LabelFinished": "Concluído", + "LabelFolder": "Pasta", + "LabelFontScale": "Escala de fonte", + "LabelGenre": "Gênero", + "LabelGenres": "Gêneros", + "LabelHapticFeedback": "Feedback tátil", + "LabelHasEbook": "Tem ebook", + "LabelHasSupplementaryEbook": "Tem ebook complementar", + "LabelHeavy": "Pesado", + "LabelHigh": "Alta", + "LabelHost": "Host", + "LabelIncomplete": "Incompleto", + "LabelInProgress": "Em Andamento", + "LabelInternalAppStorage": "Armazenamento Interno do App", + "LabelJumpBackwardsTime": "Retroceder tempo", + "LabelJumpForwardsTime": "Adiantar tempo", + "LabelLanguage": "Idioma", + "LabelLayout": "Layout", + "LabelLayoutAuto": "Automático", + "LabelLayoutSinglePage": "Uma página", + "LabelLight": "Leve", + "LabelLineSpacing": "Espaçamento entre linhas", + "LabelListenAgain": "Escutar novamente", + "LabelLocalBooks": "Livros Locais", + "LabelLocalPodcasts": "Podcasts Locais", + "LabelLockOrientation": "Travar orientação", + "LabelLockPlayer": "Travar Reprodutor", + "LabelLow": "Baixa", + "LabelMediaType": "Tipo de Mídia", + "LabelMedium": "Média", + "LabelMore": "Mais", + "LabelMoreInfo": "Mais Informações", + "LabelName": "Nome", + "LabelNarrator": "Narrador", + "LabelNarrators": "Narradores", + "LabelNewestAuthors": "Novos Autores", + "LabelNewestEpisodes": "Episódios mais recentes", + "LabelNo": "Não", + "LabelNotFinished": "Não Concluído", + "LabelNotStarted": "Não Iniciado", + "LabelOff": "Desligado", + "LabelPassword": "Senha", + "LabelPath": "Caminho", + "LabelPlaybackDirect": "Direto", + "LabelPlaybackLocal": "Local", + "LabelPlaybackSpeed": "Velocidade de Reprodução", + "LabelPlaybackTranscode": "Transcodificar", + "LabelPodcast": "Podcast", + "LabelPodcasts": "Podcasts", + "LabelPreventIndexing": "Evitar que o seu feed seja indexado pelos diretórios de podcast do iTunes e Google", + "LabelProgress": "Progresso", + "LabelPubDate": "Data de Publicação", + "LabelPublishYear": "Ano de Publicação", + "LabelRead": "Lido", + "LabelReadAgain": "Ler Novamente", + "LabelRecentlyAdded": "Novidades", + "LabelRecentSeries": "Séries Recentes", + "LabelRSSFeedCustomOwnerEmail": "Email do dono personalizado", + "LabelRSSFeedCustomOwnerName": "Nome do dono personalizado", + "LabelRSSFeedPreventIndexing": "Impedir Indexação", + "LabelRSSFeedSlug": "Slug do Feed RSS", + "LabelScaleElapsedTimeBySpeed": "Proporcionalizar Tempo Decorrido com a Velocidade", + "LabelSeason": "Temporada", + "LabelSelectADevice": "Selecione um dispositivo", + "LabelSeries": "Série", + "LabelServerAddress": "Endereço do servidor", + "LabelSetEbookAsPrimary": "Definir como principal", + "LabelSetEbookAsSupplementary": "Definir como complementar", + "LabelShakeSensitivity": "Sensitividade do sacudir", + "LabelShowAll": "Exibir Todos", + "LabelSize": "Tamanho", + "LabelSleepTimer": "Timer", + "LabelStart": "Iniciar", + "LabelStartTime": "Iniciado Em", + "LabelStatsBestDay": "Melhor Dia", + "LabelStatsDailyAverage": "Média Diária", + "LabelStatsDays": "Dias", + "LabelStatsDaysListened": "Dias Escutando", + "LabelStatsInARow": "seguidos", + "LabelStatsItemsFinished": "Itens Concluídos", + "LabelStatsMinutes": "minutos", + "LabelStatsMinutesListening": "Minutos Escutando", + "LabelStatsWeekListening": "Tempo escutando na semana", + "LabelTag": "Etiqueta", + "LabelTags": "Etiquetas", + "LabelTheme": "Tema", + "LabelThemeDark": "Escuro", + "LabelThemeLight": "Claro", + "LabelTimeRemaining": "{0} restantes", + "LabelTitle": "Título", + "LabelTotalTrack": "Total da Trilha", + "LabelTracks": "Trilhas", + "LabelType": "Tipo", + "LabelUnlockPlayer": "Destravar Reprodutor", + "LabelUseBookshelfView": "Usar visão estante", + "LabelUser": "Usuário", + "LabelUsername": "Nome do Usuário", + "LabelVeryHigh": "Muito Alta", + "LabelVeryLow": "Muito Baixa", + "LabelYourBookmarks": "Seus Marcadores", + "LabelYourProgress": "Seu Progresso", + "MessageAndroid10Downloads": "Android 10 e versões anteriores utilizarão o armazenamento interno para downloads.", + "MessageAttemptingServerConnection": "Tentando conexão ao ...", + "MessageAudiobookshelfServerNotConnected": "Servidor Audiobookshelf não conectado", + "MessageAudiobookshelfServerRequired": "Importante! Esse aplicativo foi desenvolvido para funcionar com um servidor Audiobookshelf que você ou algum conhecido seu está mantendo. Esse aplicativo não oferece qualquer conteúdo.", + "MessageBookshelfEmpty": "Estante vazia", + "MessageConfirmDeleteLocalEpisode": "Remover episódio local \"{0}\" do seu dispositivo? O arquivo no servidor não será afetado.", + "MessageConfirmDeleteLocalFiles": "Remover arquivos locais deste item do seu dispositivo? Os arquivos no servidor e o seu progresso não serão afetados.", + "MessageConfirmDiscardProgress": "Tem certeza de que deseja restar o seu progresso?", + "MessageConfirmMarkAsFinished": "Tem certeza de que deseja marcar esse item como concluído?", + "MessageConfirmRemoveBookmark": "Tem certeza de que deseja remover o marcador?", + "MessageDiscardProgress": "Descartar Progresso", + "MessageDownloadCompleteProcessing": "Download concluído. Processando...", + "MessageDownloading": "Realizando o download...", + "MessageDownloadingEpisode": "Realizando o downloading do episódio", + "MessageEpisodesQueuedForDownload": "{0} Episódio(s) na fila de download", + "MessageFeedURLWillBe": "URL do Feed será {0}", + "MessageFetching": "Buscando...", + "MessageFollowTheProjectOnGithub": "Siga este projeto no Github", + "MessageItemDownloadCompleteFailedToCreate": "Download concluído mas não foi possível criar item da biblioteca", + "MessageLoading": "Carregando...", + "MessageLoadingServerData": "Carregando dados do servidor...", + "MessageMarkAsFinished": "Marcar como Concluído", + "MessageMediaLinkedToADifferentServer": "Mídia está associada a um servidor Audiobookshelf em um endereço diferente ({0}). O progresso será sincronizado quando conectado a esse servidor.", + "MessageMediaLinkedToADifferentUser": "Mídia está associada a este servidor mas o download foi feito por outro usuário. O progresso só será sincronizado para o usuário que realizou o download.", + "MessageMediaLinkedToServer": "Associado ao servidor {0}", + "MessageMediaLinkedToThisServer": "Mídia baixada está associada a esse servidor", + "MessageMediaNotLinkedToServer": "Mídia não está associada a um servidor Audiobookshelf. Nenhum progresso será sincronizado.", + "MessageNoBookmarks": "Sem Marcadores", + "MessageNoChapters": "Sem Capítulos", + "MessageNoItems": "Sem Itens", + "MessageNoItemsFound": "Nenhum item encontrado", + "MessageNoListeningSessions": "Sem Sessões de Escuta", + "MessageNoMediaFolders": "Sem Pastas de Mídia", + "MessageNoNetworkConnection": "Nem conexão de rede", + "MessageNoPodcastsFound": "Nenhum podcast encontrado", + "MessageNoUpdatesWereNecessary": "Nenhuma atualização é necessária", + "MessageNoUserPlaylists": "Você não tem listas de reprodução", + "MessageReportBugsAndContribute": "Reporte bugs, peça funcionalidades e contribua em", + "MessageSocketConnectedOverMeteredCellular": "Socket conectado usando rede celular limitada", + "MessageSocketConnectedOverMeteredWifi": "Socket conectado usando wifi limitada", + "MessageSocketConnectedOverUnmeteredCellular": "Socket conectado usando rede celular ilimitada", + "MessageSocketConnectedOverUnmeteredWifi": "Socket conectado usando wifi ilimitada", + "MessageSocketNotConnected": "Socket não conectado", + "NoteRSSFeedPodcastAppsHttps": "Atenção: A maioria dos aplicativos de podcasts requer que a URL do feed RSS use HTTPS", + "NoteRSSFeedPodcastAppsPubDate": "Atenção: Um ou mais dos seus episódios não tem uma data de publicação. Alguns aplicativos de podcasts requerem isto.", + "ToastBookmarkCreateFailed": "Falha ao criar marcador", + "ToastBookmarkRemoveFailed": "Falha ao remover marcador", + "ToastBookmarkUpdateFailed": "Falha ao atualizar marcador", + "ToastItemMarkedAsFinishedFailed": "Falha ao marcar como Concluído", + "ToastItemMarkedAsNotFinishedFailed": "Falha ao marcar como Não Concluído", + "ToastPlaylistCreateFailed": "Falha ao criar lista de reprodução", + "ToastPodcastCreateFailed": "Falha ao criar podcast", + "ToastPodcastCreateSuccess": "Podcast criado", + "ToastRSSFeedCloseFailed": "Falha ao fechar feed RSS", + "ToastRSSFeedCloseSuccess": "Feed RSS fechado" +}