## Summary **What is the goal of this PR?** Adds OPDS search support, allowing users to search a catalog directly from the book browser when the server exposes an OpenSearch template. **What changes are included?** - `OpdsParser`: parses the OpenSearch template URL from feed-level `<link rel="search">` elements and exposes it via `getSearchTemplate()` - `OpdsBookBrowserActivity`: fetches and stores the search template after each feed load; shows a Search hint on the Left button when a template is available; launches the existing `KeyboardEntryActivity` for query input; URL-encodes the query and fetches the result feed - Absolute search result URLs are handled correctly in `fetchFeed` (skips prepending the server base URL) - A `consumeConfirm` guard prevents the Confirm release that submits the keyboard from immediately triggering a book download on the first browsing frame after search results load ## Additional Context - Search is silently unavailable if the server does not advertise an OpenSearch template — no UI change in that case - Tested against a Calibre-Web OPDS endpoint which exposes `<link rel="search" type="application/opensearchdescription+xml">` - The inline URL encoder in `performSearch` was necessary as `StringUtils` has no such utility; worth considering extracting to `StringUtils` in a follow-up - No new dependencies introduced --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO**_ --------- Co-authored-by: kira <rammah@tuta.io> Co-authored-by: Justin Mitchell <justin@jmitch.com>
264 lines
9.6 KiB
YAML
264 lines
9.6 KiB
YAML
_language_name: "Português (Brasil)"
|
||
_language_code: "PT"
|
||
_order: "5"
|
||
|
||
STR_CROSSPOINT: "CrossPoint"
|
||
STR_BOOTING: "INICIANDO"
|
||
STR_SLEEPING: "EM REPOUSO"
|
||
STR_ENTERING_SLEEP: "Entrando em repouso"
|
||
STR_BROWSE_FILES: "Arquivos"
|
||
STR_FILE_TRANSFER: "Transferência"
|
||
STR_SETTINGS_TITLE: "Configurações"
|
||
STR_CONTINUE_READING: "Continuar lendo"
|
||
STR_NO_OPEN_BOOK: "Nenhum livro aberto"
|
||
STR_START_READING: "Comece a ler abaixo"
|
||
STR_NO_FILES_FOUND: "Nenhum arquivo encontrado"
|
||
STR_SELECT_CHAPTER: "Escolher capítulo"
|
||
STR_NO_CHAPTERS: "Sem capítulos"
|
||
STR_END_OF_BOOK: "Fim do livro"
|
||
STR_EMPTY_CHAPTER: "Capítulo vazio"
|
||
STR_INDEXING: "Indexando"
|
||
STR_MEMORY_ERROR: "Erro de memória"
|
||
STR_PAGE_LOAD_ERROR: "Erro página"
|
||
STR_EMPTY_FILE: "Arquivo vazio"
|
||
STR_OUT_OF_BOUNDS: "Fora dos limites"
|
||
STR_LOADING: "Carregando..."
|
||
STR_LOADING_POPUP: "Carregando"
|
||
STR_WIFI_NETWORKS: "Redes Wi‑Fi"
|
||
STR_NO_NETWORKS: "Sem redes"
|
||
STR_NETWORKS_FOUND: "%zu redes encontradas"
|
||
STR_SCANNING: "Procurando..."
|
||
STR_CONNECTING: "Conectando..."
|
||
STR_CONNECTED: "Conectado!"
|
||
STR_CONNECTION_FAILED: "Falha na conexão"
|
||
STR_FORGET_NETWORK: "Esquecer rede?"
|
||
STR_SAVE_PASSWORD: "Salvar senha a próxima vez?"
|
||
STR_PRESS_OK_SCAN: "Pressione OK procurar novamente"
|
||
STR_JOIN_NETWORK: "Entrar em uma rede"
|
||
STR_CREATE_HOTSPOT: "Criar hotspot"
|
||
STR_JOIN_DESC: "Conecte-se a uma rede Wi‑Fi existente"
|
||
STR_HOTSPOT_DESC: "Crie uma rede Wi‑Fi outras pessoas entrarem"
|
||
STR_STARTING_HOTSPOT: "Iniciando hotspot..."
|
||
STR_HOTSPOT_MODE: "Modo hotspot"
|
||
STR_CONNECT_WIFI_HINT: "Conecte seu dispositivo a esta rede Wi‑Fi"
|
||
STR_OPEN_URL_HINT: "Abra este URL seu navegador"
|
||
STR_OR_HTTP_PREFIX: "ou http://"
|
||
STR_SCAN_QR_HINT: "ou escaneie o QR code com seu celular:"
|
||
STR_CALIBRE_WIRELESS: "Calibre sem fio"
|
||
STR_CALIBRE_WEB_URL: "OPDS URL"
|
||
STR_NETWORK_LEGEND: "* = Criptografada | + = Salva"
|
||
STR_MAC_ADDRESS: "Endereço MAC:"
|
||
STR_CHECKING_WIFI: "Verificando Wi‑Fi..."
|
||
STR_ENTER_WIFI_PASSWORD: "Digite a senha Wi‑Fi"
|
||
STR_TO_PREFIX: "para"
|
||
STR_CALIBRE_RECEIVING: "Recebendo:"
|
||
STR_CALIBRE_RECEIVED: "Recebido:"
|
||
STR_CALIBRE_INSTRUCTION_1: "1) Instale o plugin CrossPoint Reader"
|
||
STR_CALIBRE_INSTRUCTION_2: "2) Esteja mesma rede Wi‑Fi"
|
||
STR_CALIBRE_INSTRUCTION_3: "3) No Calibre: \"Enviar o dispositivo\""
|
||
STR_CALIBRE_INSTRUCTION_4: "\"Mantenha esta tela aberta durante o envio\""
|
||
STR_CAT_DISPLAY: "Tela"
|
||
STR_CAT_READER: "Leitor"
|
||
STR_CAT_CONTROLS: "Controles"
|
||
STR_CAT_SYSTEM: "Sistema"
|
||
STR_SLEEP_SCREEN: "Tela de repouso"
|
||
STR_SLEEP_COVER_MODE: "Modo capa tela repouso"
|
||
STR_HIDE_BATTERY: "Ocultar % da bateria"
|
||
STR_EXTRA_SPACING: "Espaço de parágrafos extra"
|
||
STR_TEXT_AA: "Suavização de texto"
|
||
STR_SHORT_PWR_BTN: "Clique curto botão ligar"
|
||
STR_ORIENTATION: "Orientação de leitura"
|
||
STR_SIDE_BTN_LAYOUT: "Disposição botões laterais"
|
||
STR_LONG_PRESS_SKIP: "Pular capítulo com pressão longa"
|
||
STR_FONT_FAMILY: "Fonte do leitor"
|
||
STR_FONT_SIZE: "Tam. fonte UI"
|
||
STR_LINE_SPACING: "Espaçamento entre linhas"
|
||
STR_SCREEN_MARGIN: "Margens da tela"
|
||
STR_PARA_ALIGNMENT: "Alinhamento parágrafo"
|
||
STR_HYPHENATION: "Hifenização"
|
||
STR_TIME_TO_SLEEP: "Tempo para repousar"
|
||
STR_REFRESH_FREQ: "Frequência atualização"
|
||
STR_KOREADER_SYNC: "Sincronização KOReader"
|
||
STR_CHECK_UPDATES: "Verificar atualizações"
|
||
STR_LANGUAGE: "Idioma"
|
||
STR_CLEAR_READING_CACHE: "Limpar cache de leitura"
|
||
STR_USERNAME: "Nome de usuário"
|
||
STR_PASSWORD: "Senha"
|
||
STR_SYNC_SERVER_URL: "URL servidor sincronização"
|
||
STR_DOCUMENT_MATCHING: "Documento correspondente"
|
||
STR_AUTHENTICATE: "Autenticar"
|
||
STR_KOREADER_USERNAME: "Usuário do KOReader"
|
||
STR_KOREADER_PASSWORD: "Senha do KOReader"
|
||
STR_FILENAME: "Nome do arquivo"
|
||
STR_BINARY: "Binário"
|
||
STR_SET_CREDENTIALS_FIRST: "Defina as credenciais primeiro"
|
||
STR_WIFI_CONN_FAILED: "Falha na conexão Wi‑Fi"
|
||
STR_AUTHENTICATING: "Autenticando..."
|
||
STR_AUTH_SUCCESS: "Autenticado com sucesso!"
|
||
STR_KOREADER_AUTH: "Autenticação KOReader"
|
||
STR_SYNC_READY: "A sincronização KOReader está pronta uso"
|
||
STR_AUTH_FAILED: "Falha na autenticação"
|
||
STR_DONE: "Feito"
|
||
STR_CLEAR_CACHE_WARNING_1: "Isso vai limpar todos os dados livros em cache."
|
||
STR_CLEAR_CACHE_WARNING_2: "Todo o progresso de leitura será perdido!"
|
||
STR_CLEAR_CACHE_WARNING_3: "Os livros precisarão ser reindexados"
|
||
STR_CLEAR_CACHE_WARNING_4: "quando forem abertos novamente."
|
||
STR_CLEARING_CACHE: "Limpando cache..."
|
||
STR_CACHE_CLEARED: "Cache limpo"
|
||
STR_ITEMS_REMOVED: "itens removidos"
|
||
STR_FAILED_LOWER: "falhou"
|
||
STR_CLEAR_CACHE_FAILED: "Falha ao limpar o cache"
|
||
STR_CHECK_SERIAL_OUTPUT: "Ver saída serial"
|
||
STR_DARK: "Escuro"
|
||
STR_LIGHT: "Claro"
|
||
STR_CUSTOM: "Personalizado"
|
||
STR_COVER: "Capa"
|
||
STR_NONE_OPT: "Nenhum"
|
||
STR_FIT: "Ajustar"
|
||
STR_CROP: "Recortar"
|
||
STR_NEVER: "Nunca"
|
||
STR_IN_READER: "No leitor"
|
||
STR_ALWAYS: "Sempre"
|
||
STR_IGNORE: "Ignorar"
|
||
STR_SLEEP: "Repouso"
|
||
STR_PAGE_TURN: "Virar página"
|
||
STR_PORTRAIT: "Retrato"
|
||
STR_LANDSCAPE_CW: "Paisagem H"
|
||
STR_INVERTED: "Invertido"
|
||
STR_LANDSCAPE_CCW: "Paisagem AH"
|
||
STR_PREV_NEXT: "Ant/Próx"
|
||
STR_NEXT_PREV: "Próx/Ant"
|
||
STR_BOOKERLY: "Bookerly"
|
||
STR_NOTO_SANS: "Noto Sans"
|
||
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
||
STR_SMALL: "Pequeno"
|
||
STR_MEDIUM: "Médio"
|
||
STR_LARGE: "Grande"
|
||
STR_X_LARGE: "Extra grande"
|
||
STR_TIGHT: "Apertado"
|
||
STR_NORMAL: "Normal"
|
||
STR_WIDE: "Largo"
|
||
STR_JUSTIFY: "Justificar"
|
||
STR_ALIGN_LEFT: "Esquerda"
|
||
STR_CENTER: "Centralizar"
|
||
STR_ALIGN_RIGHT: "Direita"
|
||
STR_MIN_1: "1 min"
|
||
STR_MIN_5: "5 min"
|
||
STR_MIN_10: "10 min"
|
||
STR_MIN_15: "15 min"
|
||
STR_MIN_30: "30 min"
|
||
STR_PAGES_1: "1 página"
|
||
STR_PAGES_5: "5 páginas"
|
||
STR_PAGES_10: "10 páginas"
|
||
STR_PAGES_15: "15 páginas"
|
||
STR_PAGES_30: "30 páginas"
|
||
STR_UPDATE: "Atualizar"
|
||
STR_CHECKING_UPDATE: "Verificando atualização..."
|
||
STR_NEW_UPDATE: "Nova atualização disponível!"
|
||
STR_CURRENT_VERSION: "Versão atual:"
|
||
STR_NEW_VERSION: "Nova versão:"
|
||
STR_UPDATING: "Atualizando..."
|
||
STR_NO_UPDATE: "Nenhuma atualização disponível"
|
||
STR_UPDATE_FAILED: "Falha na atualização"
|
||
STR_UPDATE_COMPLETE: "Atualização concluída"
|
||
STR_POWER_ON_HINT: "Pressione e segure o botão energia ligar novamente"
|
||
STR_NO_ENTRIES: "Nenhum entries encontrado"
|
||
STR_DOWNLOADING: "Baixando..."
|
||
STR_DOWNLOAD_FAILED: "Falha no download"
|
||
STR_ERROR_MSG: "Erro:"
|
||
STR_UNNAMED: "Sem nome"
|
||
STR_NO_SERVER_URL: "Nenhum URL servidor configurado"
|
||
STR_FETCH_FEED_FAILED: "Falha ao buscar o feed"
|
||
STR_PARSE_FEED_FAILED: "Falha ao interpretar o feed"
|
||
STR_NETWORK_PREFIX: "Rede:"
|
||
STR_IP_ADDRESS_PREFIX: "Endereço IP:"
|
||
STR_ERROR_GENERAL_FAILURE: "Erro: falha geral"
|
||
STR_ERROR_NETWORK_NOT_FOUND: "Erro: rede não encontrada"
|
||
STR_ERROR_CONNECTION_TIMEOUT: "Erro: tempo limite conexão"
|
||
STR_SD_CARD: "Cartão SD"
|
||
STR_BACK: "« Voltar"
|
||
STR_EXIT: "« Sair"
|
||
STR_HOME: "« Início"
|
||
STR_SELECT: "Escolher"
|
||
STR_TOGGLE: "Alternar"
|
||
STR_CONFIRM: "Confirmar"
|
||
STR_CANCEL: "Cancelar"
|
||
STR_CONNECT: "Conectar"
|
||
STR_OPEN: "Abrir"
|
||
STR_DOWNLOAD: "Baixar"
|
||
STR_RETRY: "Tentar novamente"
|
||
STR_YES: "Sim"
|
||
STR_NO: "Não"
|
||
STR_STATE_ON: "LIG."
|
||
STR_STATE_OFF: "DESL."
|
||
STR_NOT_SET: "Não definido"
|
||
STR_DIR_LEFT: "Esquerda"
|
||
STR_DIR_RIGHT: "Direita"
|
||
STR_DIR_UP: "Cima"
|
||
STR_DIR_DOWN: "Baixo"
|
||
STR_OK_BUTTON: "OK"
|
||
STR_SLEEP_COVER_FILTER: "Filtro capa tela repouso"
|
||
STR_FILTER_CONTRAST: "Contraste"
|
||
STR_UI_THEME: "Tema da interface"
|
||
STR_THEME_CLASSIC: "Clássico"
|
||
STR_THEME_LYRA: "Lyra"
|
||
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
|
||
STR_SUNLIGHT_FADING_FIX: "Ajuste desbotamento ao sol"
|
||
STR_REMAP_FRONT_BUTTONS: "Remapear botões frontais"
|
||
STR_OPDS_BROWSER: "Navegador OPDS"
|
||
STR_COVER_CUSTOM: "Capa + personalizado"
|
||
STR_MENU_RECENT_BOOKS: "Livros recentes"
|
||
STR_NO_RECENT_BOOKS: "Sem livros recentes"
|
||
STR_CALIBRE_DESC: "Usar transferências sem fio Calibre"
|
||
STR_FORGET_AND_REMOVE: "Esquecer a rede e remover a senha salva?"
|
||
STR_FORGET_BUTTON: "Esquecer"
|
||
STR_CALIBRE_STARTING: "Iniciando Calibre..."
|
||
STR_CALIBRE_SETUP: "Configuração"
|
||
STR_CALIBRE_STATUS: "Status"
|
||
STR_CLEAR_BUTTON: "Limpar"
|
||
STR_DEFAULT_VALUE: "Padrão"
|
||
STR_REMAP_PROMPT: "Pressione um botão frontal cada função"
|
||
STR_UNASSIGNED: "Não atribuído"
|
||
STR_ALREADY_ASSIGNED: "Já atribuído"
|
||
STR_REMAP_RESET_HINT: "Botão lateral cima: redefinir o disposição padrão"
|
||
STR_REMAP_CANCEL_HINT: "Botão lateral baixo: cancelar remapeamento"
|
||
STR_HW_BACK_LABEL: "Voltar (1º botão)"
|
||
STR_HW_CONFIRM_LABEL: "Confirmar (2º botão)"
|
||
STR_HW_LEFT_LABEL: "Esquerda (3º botão)"
|
||
STR_HW_RIGHT_LABEL: "Direita (4º botão)"
|
||
STR_GO_TO_PERCENT: "Ir para %"
|
||
STR_GO_HOME_BUTTON: "Ir para o início"
|
||
STR_SYNC_PROGRESS: "Sincronizar progresso"
|
||
STR_DELETE_CACHE: "Excluir cache do livro"
|
||
STR_DELETE: "Excluir"
|
||
STR_CHAPTER_PREFIX: "Capítulo:"
|
||
STR_PAGES_SEPARATOR: "páginas |"
|
||
STR_BOOK_PREFIX: "Livro:"
|
||
STR_CALIBRE_URL_HINT: "Para o Calibre, adicione /opds ao seu URL"
|
||
STR_PERCENT_STEP_HINT: "Esq/Dir: 1% Cima/Baixo: 10%"
|
||
STR_SYNCING_TIME: "Sincronizando horário..."
|
||
STR_CALC_HASH: "Calculando hash documento..."
|
||
STR_HASH_FAILED: "Falha ao calcular o hash documento"
|
||
STR_FETCH_PROGRESS: "Buscando progresso remoto..."
|
||
STR_UPLOAD_PROGRESS: "Enviando progresso..."
|
||
STR_NO_CREDENTIALS_MSG: "Nenhuma credencial configurada"
|
||
STR_KOREADER_SETUP_HINT: "Configure a conta do KOReader em Config."
|
||
STR_PROGRESS_FOUND: "Progresso encontrado!"
|
||
STR_REMOTE_LABEL: "Remoto:"
|
||
STR_LOCAL_LABEL: "Local:"
|
||
STR_PAGE_OVERALL_FORMAT: "Página %d, %.2f%% total"
|
||
STR_PAGE_TOTAL_OVERALL_FORMAT: "Página %d/%d, %.2f%% total"
|
||
STR_DEVICE_FROM_FORMAT: "De: %s"
|
||
STR_APPLY_REMOTE: "Aplicar progresso remoto"
|
||
STR_UPLOAD_LOCAL: "Enviar progresso local"
|
||
STR_NO_REMOTE_MSG: "Nenhum progresso remoto encontrado"
|
||
STR_UPLOAD_PROMPT: "Enviar posição atual?"
|
||
STR_UPLOAD_SUCCESS: "Progresso enviado!"
|
||
STR_SYNC_FAILED_MSG: "Falha na sincronização"
|
||
STR_SECTION_PREFIX: "Seção"
|
||
STR_UPLOAD: "Enviar"
|
||
STR_BOOK_S_STYLE: "Estilo do livro"
|
||
STR_EMBEDDED_STYLE: "Estilo embutido"
|
||
STR_OPDS_SERVER_URL: "URL do servidor OPDS"
|
||
STR_SCREENSHOT_BUTTON: "Capturar tela"
|