## Summary This PR introduces **Focus Reading**, a generic implementation of artificial fixation points (similar to Bionic Reading) designed to improve reading speed and focus by bolding the initial characters of words. This is achieved by dynamically bolding characters during indexing. <img width="500" alt="Focus Reading on X3" src="https://github.com/user-attachments/assets/94a632a5-82da-47be-957c-538b35bf84d9" /> ### Implementation Details #### Core Text Engine (`ParsedText`) - Modified `ParsedText::addWord` to implement a custom bolding algorithm. It uses a 45% ratio for bolding, with a minimum of 1 character and a maximum of 9. - UTF-8 Safety: Integrated `utf8NextCodepoint` to ensure character counting and string slicing occur at safe byte boundaries, preventing corruption of multi-byte characters (e.g., accented letters or smart quotes). - Intelligent Tokenization: This correctly identifies and separates "word" characters (letters, apostrophes, hyphens) from "non-word" characters (numbers, brackets, smart quotes). - Formatting Preservation: The logic ensures that punctuation is not "stolen" for the bolding count and that existing styles (like italics or underlines) are preserved across the bold/regular split. - Processing at indexing stage reduces CPU load at render-time and ensures layout/fit is unaffected. - Split details are tracked with `wordIsFocusSuffix`. After splitting and layout, suffixes are merged back into their preceding word entries to prevent a doubling of RAM usage. #### Settings and UI - Version Management: Bumped `SECTION_FILE_VERSION` to `21` - Global Settings: Added `focusReadingEnabled` to `CrossPointSettings`. - User Interface: Added a new toggle in the "Reader" section of the settings menu, positioned after the "Embedded Style" option. - Localization: Added the `STR_FOCUS_READING` string #### Plumbing - Plumbed the `focusReadingEnabled` boolean through `EpubReaderActivity`, `Section`, and `ChapterHtmlSlimParser` to ensure the user's setting reaches the `ParsedText` constructor during chapter indexing. ## Additional Context ### Files Changed - `lib/Epub/Epub/ParsedText.h / .cpp`: Core fixation logic and UTF-8 tokenization. - `lib/Epub/Epub/Section.h / .cpp`: Cache header updates and invalidation logic. - `lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h / .cpp`: Plumbing the setting to text blocks. - `src/CrossPointSettings.h`: Data persistence for the new setting. - `src/SettingsList.h`: UI toggle implementation. - `src/activities/reader/EpubReaderActivity.cpp`: Handling settings changes during reading sessions. - `lib/I18n/translations/*.yaml`: UI strings. --- ### 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? _**YES**_
300 lines
11 KiB
YAML
300 lines
11 KiB
YAML
_language_name: "Italiano"
|
|
_language_code: "IT"
|
|
_order: "12"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "AVVIO IN CORSO"
|
|
STR_SLEEPING: "SOSPENSIONE"
|
|
STR_ENTERING_SLEEP: "Sospensione..."
|
|
STR_BROWSE_FILES: "Sfoglia file"
|
|
STR_FILE_TRANSFER: "Trasferimento file"
|
|
STR_SETTINGS_TITLE: "Impostazioni"
|
|
STR_CONTINUE_READING: "Continua a leggere"
|
|
STR_NO_OPEN_BOOK: "Nessun libro aperto"
|
|
STR_START_READING: "Inizia a leggere di seguito"
|
|
STR_NO_FILES_FOUND: "Nessun file trovato"
|
|
STR_SELECT_CHAPTER: "Seleziona capitolo"
|
|
STR_NO_CHAPTERS: "Nessun capitolo"
|
|
STR_END_OF_BOOK: "Fine del libro"
|
|
STR_EMPTY_CHAPTER: "Capitolo vuoto"
|
|
STR_INDEXING: "Indicizzazione..."
|
|
STR_MEMORY_ERROR: "Errore di memoria"
|
|
STR_PAGE_LOAD_ERROR: "Errore caricamento pagina"
|
|
STR_EMPTY_FILE: "File vuoto"
|
|
STR_OUT_OF_BOUNDS: "Fuori dai limiti"
|
|
STR_LOADING: "Caricamento..."
|
|
STR_LOADING_POPUP: "Caricamento"
|
|
STR_WIFI_NETWORKS: "Reti WiFi"
|
|
STR_NO_NETWORKS: "Nessuna rete trovata"
|
|
STR_NETWORKS_FOUND: "%zu reti trovate"
|
|
STR_SCANNING: "Scansione..."
|
|
STR_CONNECTING: "Connessione..."
|
|
STR_CONNECTED: "Connesso!"
|
|
STR_CONNECTION_FAILED: "Connessione non riuscita"
|
|
STR_FORGET_NETWORK: "Eliminare la rete?"
|
|
STR_SAVE_PASSWORD: "Salvare la password?"
|
|
STR_PRESS_OK_SCAN: "Premere OK per ripetere scansione"
|
|
STR_JOIN_NETWORK: "Connetti a una rete"
|
|
STR_CREATE_HOTSPOT: "Crea Hotspot"
|
|
STR_JOIN_DESC: "Connessione ad una rete WiFi"
|
|
STR_HOTSPOT_DESC: "Creazione di una rete WiFi"
|
|
STR_STARTING_HOTSPOT: "Avvio Hotspot..."
|
|
STR_HOTSPOT_MODE: "Modalità Hotspot"
|
|
STR_CONNECT_WIFI_HINT: "Connettere il dispositivo a questa rete WiFi"
|
|
STR_OPEN_URL_HINT: "Aprire questo URL nel browser"
|
|
STR_OR_HTTP_PREFIX: "o http://"
|
|
STR_SCAN_QR_HINT: "oppure scansionare il codice QR col telefono:"
|
|
STR_CALIBRE_WIRELESS: "Calibre wireless"
|
|
STR_CALIBRE_WEB_URL: "URL Web Calibre"
|
|
STR_NETWORK_LEGEND: "* = Protetta | + = Salvata"
|
|
STR_MAC_ADDRESS: "Indirizzo MAC:"
|
|
STR_CHECKING_WIFI: "Verifica WiFi..."
|
|
STR_ENTER_WIFI_PASSWORD: "Inserire password WiFi"
|
|
STR_TO_PREFIX: "a "
|
|
STR_CALIBRE_RECEIVING: "Ricezione: "
|
|
STR_CALIBRE_RECEIVED: "Ricevuto: "
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Installare il plugin CrossPoint Reader"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Collegarsi sulla stessa rete WiFi"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Invia al dispositivo\""
|
|
STR_CALIBRE_INSTRUCTION_4: "\"Tenere questa schermata aperta durante l'invio\""
|
|
STR_CAT_DISPLAY: "Schermo"
|
|
STR_CAT_READER: "Lettore"
|
|
STR_CAT_CONTROLS: "Controlli"
|
|
STR_CAT_SYSTEM: "Sistema"
|
|
STR_SLEEP_SCREEN: "Schermata di sospensione"
|
|
STR_SLEEP_COVER_MODE: "Copertina in sospensione"
|
|
STR_HIDE_BATTERY: "Nascondi % batteria"
|
|
STR_EXTRA_SPACING: "Spaziatura extra paragrafi"
|
|
STR_TEXT_AA: "Anti-aliasing testo"
|
|
STR_IMAGES: "Immagini"
|
|
STR_IMAGES_DISPLAY: "Visualizza"
|
|
STR_IMAGES_PLACEHOLDER: "Segnaposto"
|
|
STR_IMAGES_SUPPRESS: "Nascondi"
|
|
STR_SHORT_PWR_BTN: "Pressione breve tasto accensione"
|
|
STR_ORIENTATION: "Orientamento lettura"
|
|
STR_SIDE_BTN_LAYOUT: "Pulsanti laterali (lettore)"
|
|
STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior"
|
|
STR_LONG_PRESS_BEHAVIOR_OFF: "OFF"
|
|
STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip"
|
|
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Orientation change"
|
|
STR_LONG_PRESS_SKIP: "Pressione lunga: salta capitolo"
|
|
STR_FONT_FAMILY: "Font lettore"
|
|
STR_FONT_SIZE: "Dimensione font lettore"
|
|
STR_LINE_SPACING: "Interlinea lettore"
|
|
STR_SCREEN_MARGIN: "Margine schermo lettore"
|
|
STR_PARA_ALIGNMENT: "Allineamento paragrafo"
|
|
STR_HYPHENATION: "Sillabazione"
|
|
STR_TIME_TO_SLEEP: "Timeout sospensione"
|
|
STR_SHOW_HIDDEN_FILES: "Mostra file nascosti"
|
|
STR_REFRESH_FREQ: "Frequenza di aggiornamento"
|
|
STR_KOREADER_SYNC: "Sincronizzazione KOReader"
|
|
STR_CHECK_UPDATES: "Cerca aggiornamenti"
|
|
STR_LANGUAGE: "Lingua"
|
|
STR_CLEAR_READING_CACHE: "Svuota cache di lettura"
|
|
STR_USERNAME: "Nome utente"
|
|
STR_PASSWORD: "Password"
|
|
STR_SYNC_SERVER_URL: "URL server di sincronizzazione"
|
|
STR_DOCUMENT_MATCHING: "Corrispondenza documenti"
|
|
STR_AUTHENTICATE: "Autentica"
|
|
STR_KOREADER_USERNAME: "Nome utente KOReader"
|
|
STR_KOREADER_PASSWORD: "Password KOReader"
|
|
STR_FILENAME: "Nome file"
|
|
STR_BINARY: "Binario"
|
|
STR_SET_CREDENTIALS_FIRST: "Impostare prima le credenziali"
|
|
STR_WIFI_CONN_FAILED: "Connessione WiFi non riuscita"
|
|
STR_AUTHENTICATING: "Autenticazione..."
|
|
STR_AUTH_SUCCESS: "Autenticazione riuscita!"
|
|
STR_KOREADER_AUTH: "Autenticazione KOReader"
|
|
STR_SYNC_READY: "Sincronizzazione KOReader pronta"
|
|
STR_AUTH_FAILED: "Autenticazione non riuscita"
|
|
STR_DONE: "Fatto"
|
|
STR_CLEAR_CACHE_WARNING_1: "Verranno cancellati tutti i dati in cache."
|
|
STR_CLEAR_CACHE_WARNING_2: "Gli avanzamenti di lettura andranno persi!"
|
|
STR_CLEAR_CACHE_WARNING_3: "I libri dovranno essere reindicizzati"
|
|
STR_CLEAR_CACHE_WARNING_4: "alla riapertura."
|
|
STR_CLEARING_CACHE: "Svuotamento cache..."
|
|
STR_CACHE_CLEARED: "Cache svuotata"
|
|
STR_ITEMS_REMOVED: "elementi rimossi"
|
|
STR_FAILED_LOWER: "non riuscito"
|
|
STR_CLEAR_CACHE_FAILED: "Impossibile svuotare la cache"
|
|
STR_CHECK_SERIAL_OUTPUT: "Controllare l'output seriale per dettagli"
|
|
STR_DARK: "Scuro"
|
|
STR_LIGHT: "Chiaro"
|
|
STR_CUSTOM: "Wallpaper"
|
|
STR_COVER: "Copertina"
|
|
STR_NONE_OPT: "Nessuno"
|
|
STR_FIT: "Adatta"
|
|
STR_CROP: "Ritaglia"
|
|
STR_NEVER: "Mai"
|
|
STR_IN_READER: "Nel lettore"
|
|
STR_ALWAYS: "Sempre"
|
|
STR_IGNORE: "Ignora"
|
|
STR_SLEEP: "Sospendi"
|
|
STR_PAGE_TURN: "Cambio pagina"
|
|
STR_PORTRAIT: "Verticale"
|
|
STR_LANDSCAPE_CW: "Orizzontale ↻"
|
|
STR_INVERTED: "Invertito"
|
|
STR_LANDSCAPE_CCW: "Orizzontale ↺"
|
|
STR_PREV_NEXT: "Prec/Succ"
|
|
STR_NEXT_PREV: "Succ/Prec"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
|
STR_SMALL: "Piccolo"
|
|
STR_MEDIUM: "Medio"
|
|
STR_LARGE: "Grande"
|
|
STR_X_LARGE: "Molto grande"
|
|
STR_TIGHT: "Stretto"
|
|
STR_NORMAL: "Normale"
|
|
STR_WIDE: "Largo"
|
|
STR_JUSTIFY: "Giustificato"
|
|
STR_ALIGN_LEFT: "Sinistra"
|
|
STR_CENTER: "Centrato"
|
|
STR_ALIGN_RIGHT: "Destra"
|
|
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 pagina"
|
|
STR_PAGES_5: "5 pagine"
|
|
STR_PAGES_10: "10 pagine"
|
|
STR_PAGES_15: "15 pagine"
|
|
STR_PAGES_30: "30 pagine"
|
|
STR_UPDATE: "Aggiorna"
|
|
STR_CHECKING_UPDATE: "Ricerca aggiornamenti..."
|
|
STR_NEW_UPDATE: "Nuovo aggiornamento disponibile!"
|
|
STR_CURRENT_VERSION: "Versione attuale: "
|
|
STR_NEW_VERSION: "Nuova versione: "
|
|
STR_UPDATING: "Aggiornamento..."
|
|
STR_NO_UPDATE: "Nessun aggiornamento disponibile"
|
|
STR_UPDATE_FAILED: "Aggiornamento non riuscito"
|
|
STR_UPDATE_COMPLETE: "Aggiornamento completato"
|
|
STR_POWER_ON_HINT: "Tenere premuto il tasto di accensione per riavviare"
|
|
STR_NO_ENTRIES: "Nessuna voce trovata"
|
|
STR_DOWNLOADING: "Download..."
|
|
STR_DOWNLOAD_FAILED: "Download non riuscito"
|
|
STR_ERROR_MSG: "Errore:"
|
|
STR_UNNAMED: "Senza nome"
|
|
STR_NO_SERVER_URL: "Nessun Server configurato"
|
|
STR_FETCH_FEED_FAILED: "Impossibile recuperare il feed"
|
|
STR_PARSE_FEED_FAILED: "Impossibile analizzare il feed"
|
|
STR_NETWORK_PREFIX: "Rete: "
|
|
STR_IP_ADDRESS_PREFIX: "Indirizzo IP: "
|
|
STR_ERROR_GENERAL_FAILURE: "Errore: operazione non riuscita"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Errore: rete non trovata"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Errore: timeout connessione"
|
|
STR_SD_CARD: "Scheda SD"
|
|
STR_BACK: "« Indietro"
|
|
STR_EXIT: "« Esci"
|
|
STR_HOME: "« Home"
|
|
STR_SELECT: "Seleziona"
|
|
STR_SELECTED: "Selezionato"
|
|
STR_TOGGLE: "Cambia"
|
|
STR_CONFIRM: "Conferma"
|
|
STR_CANCEL: "Annulla"
|
|
STR_CONNECT: "Connetti"
|
|
STR_OPEN: "Apri"
|
|
STR_DOWNLOAD: "Scarica"
|
|
STR_RETRY: "Riprova"
|
|
STR_YES: "Sì"
|
|
STR_NO: "No"
|
|
STR_SHOW: "Mostra"
|
|
STR_HIDE: "Nascondi"
|
|
STR_STATE_ON: "ON"
|
|
STR_STATE_OFF: "OFF"
|
|
STR_NOT_SET: "Non impostato"
|
|
STR_DIR_LEFT: "Sinistra"
|
|
STR_DIR_RIGHT: "Destra"
|
|
STR_DIR_UP: "Su"
|
|
STR_DIR_DOWN: "Giù"
|
|
STR_OK_BUTTON: "OK"
|
|
STR_SLEEP_COVER_FILTER: "Filtro copertina"
|
|
STR_FILTER_CONTRAST: "Contrasto"
|
|
STR_CUSTOMISE_STATUS_BAR: "Personalizza barra di stato"
|
|
STR_CHAPTER_PAGE_COUNT: "Conteggio pagine capitolo"
|
|
STR_BOOK_PROGRESS_PERCENTAGE: "Percentuale avanzamento lettura"
|
|
STR_PROGRESS_BAR: "Barra di avanzamento"
|
|
STR_PROGRESS_BAR_THICKNESS: "Spessore barra di avanzamento"
|
|
STR_PROGRESS_BAR_THIN: "Sottile"
|
|
STR_PROGRESS_BAR_MEDIUM: "Medio"
|
|
STR_PROGRESS_BAR_THICK: "Spesso"
|
|
STR_BOOK: "Libro"
|
|
STR_CHAPTER: "Capitolo"
|
|
STR_EXAMPLE_CHAPTER: "Capitolo 21"
|
|
STR_EXAMPLE_BOOK: "Titolo del libro"
|
|
STR_PREVIEW: "Anteprima"
|
|
STR_TITLE: "Titolo"
|
|
STR_BATTERY: "Batteria"
|
|
STR_UI_THEME: "Tema interfaccia"
|
|
STR_THEME_CLASSIC: "Classico"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra esteso"
|
|
STR_SUNLIGHT_FADING_FIX: "Correzione luce solare"
|
|
STR_REMAP_FRONT_BUTTONS: "Rimappa pulsanti frontali"
|
|
STR_OPDS_BROWSER: "Browser OPDS"
|
|
STR_COVER_CUSTOM: "Copertina + Wallpaper"
|
|
STR_MENU_RECENT_BOOKS: "Libri recenti"
|
|
STR_NO_RECENT_BOOKS: "Nessun libro recente"
|
|
STR_CALIBRE_DESC: "Trasferimento wireless con Calibre"
|
|
STR_FORGET_AND_REMOVE: "Eliminare la rete e la password salvata?"
|
|
STR_FORGET_BUTTON: "Elimina"
|
|
STR_CALIBRE_STARTING: "Avvio Calibre..."
|
|
STR_CALIBRE_SETUP: "Configurazione"
|
|
STR_CALIBRE_STATUS: "Stato"
|
|
STR_CLEAR_BUTTON: "Elimina"
|
|
STR_DEFAULT_VALUE: "Predefinito"
|
|
STR_REMAP_PROMPT: "Premere un pulsante frontale per ogni funzione"
|
|
STR_UNASSIGNED: "Non assegnato"
|
|
STR_ALREADY_ASSIGNED: "Già assegnato"
|
|
STR_REMAP_RESET_HINT: "Laterale Su: ripristina layout predefinito"
|
|
STR_REMAP_CANCEL_HINT: "Laterale Giù: annulla rimappatura"
|
|
STR_HW_BACK_LABEL: "Indietro (1° pulsante)"
|
|
STR_HW_CONFIRM_LABEL: "Conferma (2° pulsante)"
|
|
STR_HW_LEFT_LABEL: "Sinistra (3° pulsante)"
|
|
STR_HW_RIGHT_LABEL: "Destra (4° pulsante)"
|
|
STR_GO_TO_PERCENT: "Vai al %"
|
|
STR_GO_HOME_BUTTON: "Vai alla home"
|
|
STR_SYNC_PROGRESS: "Sincronizza avanzamento"
|
|
STR_DELETE_CACHE: "Elimina cache libro"
|
|
STR_DELETE: "Elimina"
|
|
STR_DISPLAY_QR: "Mostra pagina come QR"
|
|
STR_CHAPTER_PREFIX: "Capitolo: "
|
|
STR_PAGES_SEPARATOR: " pagine | "
|
|
STR_BOOK_PREFIX: "Libro: "
|
|
STR_CALIBRE_URL_HINT: "Per Calibre, aggiungere /opds all'URL"
|
|
STR_PERCENT_STEP_HINT: "Sinistra/Destra: 1% Su/Giù: 10%"
|
|
STR_SYNCING_TIME: "Sincronizzazione orario..."
|
|
STR_CALC_HASH: "Calcolo hash documento..."
|
|
STR_HASH_FAILED: "Impossibile calcolare l'hash del documento"
|
|
STR_FETCH_PROGRESS: "Recupero avanzamenti..."
|
|
STR_UPLOAD_PROGRESS: "Invio avanzamenti..."
|
|
STR_NO_CREDENTIALS_MSG: "Nessuna credenziale impostata"
|
|
STR_KOREADER_SETUP_HINT: "Configurare account KOReader in Impostazioni"
|
|
STR_PROGRESS_FOUND: "Avanzamenti trovati!"
|
|
STR_REMOTE_LABEL: "Remoto:"
|
|
STR_LOCAL_LABEL: "Locale:"
|
|
STR_PAGE_OVERALL_FORMAT: "Pagina %d, %.2f%% totale"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "Pagina %d/%d, %.2f%% totale"
|
|
STR_DEVICE_FROM_FORMAT: " Da: %s"
|
|
STR_APPLY_REMOTE: "Applica avanzamenti remoti"
|
|
STR_UPLOAD_LOCAL: "Invia avanzamenti locali"
|
|
STR_NO_REMOTE_MSG: "Nessun avanzamento remoto trovato"
|
|
STR_UPLOAD_PROMPT: "Inviare la posizione attuale?"
|
|
STR_UPLOAD_SUCCESS: "Avanzamenti inviati!"
|
|
STR_SYNC_FAILED_MSG: "Sincronizzazione non riuscita"
|
|
STR_SAVE_PROGRESS_FAILED: "Impossibile salvare il progresso"
|
|
STR_SECTION_PREFIX: "Sezione "
|
|
STR_UPLOAD: "Carica"
|
|
STR_BOOK_S_STYLE: "Stile libro"
|
|
STR_EMBEDDED_STYLE: "Stile integrato dell'epub"
|
|
STR_FOCUS_READING: "Lettura focalizzata"
|
|
STR_OPDS_SERVER_URL: "Server OPDS"
|
|
STR_FOOTNOTES: "Note a piè pagina"
|
|
STR_NO_FOOTNOTES: "Nessuna nota in questa pagina"
|
|
STR_LINK: "[link]"
|
|
STR_SCREENSHOT_BUTTON: "Screenshot"
|
|
STR_AUTO_TURN_ENABLED: "Cambio pagina automatico: "
|
|
STR_AUTO_TURN_PAGES_PER_MIN: "Cambio pagina automatico (pag/min)"
|
|
STR_TILT_PAGE_TURN: "Gira pagina con inclinazione"
|