## 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**_
296 lines
9.7 KiB
YAML
296 lines
9.7 KiB
YAML
_language_name: "Lietuvių"
|
|
_language_code: "LT"
|
|
_order: "20"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "KRAUNASI"
|
|
STR_SLEEPING: "MIEGA"
|
|
STR_ENTERING_SLEEP: "Užmiegama"
|
|
STR_BROWSE_FILES: "Failai"
|
|
STR_FILE_TRANSFER: "Siųsti failus"
|
|
STR_SETTINGS_TITLE: "Nustatymai"
|
|
STR_CONTINUE_READING: "Tęsti skaitymą"
|
|
STR_NO_OPEN_BOOK: "Nėra atidarytos knygos"
|
|
STR_START_READING: "Pradėkite skaityti žemiau"
|
|
STR_NO_FILES_FOUND: "Failų nerasta"
|
|
STR_SELECT_CHAPTER: "Rinktis skyrių"
|
|
STR_NO_CHAPTERS: "Skyrių nėra"
|
|
STR_END_OF_BOOK: "Knygos pabaiga"
|
|
STR_EMPTY_CHAPTER: "Tuščias skyrius"
|
|
STR_INDEXING: "Indeksuojama"
|
|
STR_MEMORY_ERROR: "Atminties klaida"
|
|
STR_PAGE_LOAD_ERROR: "Puslapio klaida"
|
|
STR_EMPTY_FILE: "Tuščias failas"
|
|
STR_OUT_OF_BOUNDS: "Už ribų"
|
|
STR_LOADING: "Kraunama..."
|
|
STR_LOADING_POPUP: "Kraunama"
|
|
STR_WIFI_NETWORKS: "WiFi tinklai"
|
|
STR_NO_NETWORKS: "Tinklų nerasta"
|
|
STR_NETWORKS_FOUND: "Rasta: %zu"
|
|
STR_SCANNING: "Ieškoma..."
|
|
STR_CONNECTING: "Jungiamasi..."
|
|
STR_CONNECTED: "Prisijungta!"
|
|
STR_CONNECTION_FAILED: "Klaida jungiantis"
|
|
STR_FORGET_NETWORK: "Pamiršti tinklą?"
|
|
STR_SAVE_PASSWORD: "Išsaugoti slaptažodį?"
|
|
STR_PRESS_OK_SCAN: "Ieškoti iš naujo (OK)"
|
|
STR_JOIN_NETWORK: "Prisijungti"
|
|
STR_CREATE_HOTSPOT: "Sukurti prieigą"
|
|
STR_JOIN_DESC: "Jungtis prie esamo WiFi"
|
|
STR_HOTSPOT_DESC: "Sukurti WiFi kitiems"
|
|
STR_STARTING_HOTSPOT: "Kuriamas ryšys..."
|
|
STR_HOTSPOT_MODE: "Prieigos režimas"
|
|
STR_CONNECT_WIFI_HINT: "Prijunkite įrenginį prie šio WiFi"
|
|
STR_OPEN_URL_HINT: "Atidarykite šį adresą naršyklėje"
|
|
STR_OR_HTTP_PREFIX: "arba http://"
|
|
STR_SCAN_QR_HINT: "arba nuskaitykite QR kodą:"
|
|
STR_CALIBRE_WIRELESS: "Calibre belaidis"
|
|
STR_CALIBRE_WEB_URL: "OPDS URL"
|
|
STR_NETWORK_LEGEND: "* = Užšifruota | + = Išsaugota"
|
|
STR_MAC_ADDRESS: "MAC adresas:"
|
|
STR_CHECKING_WIFI: "Tikrinamas WiFi..."
|
|
STR_ENTER_WIFI_PASSWORD: "WiFi slaptažodis"
|
|
STR_TO_PREFIX: "į "
|
|
STR_CALIBRE_RECEIVING: "Gaunama: "
|
|
STR_CALIBRE_RECEIVED: "Gauta: "
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Įdiekite CrossPoint įskiepį"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Naudokite tą patį WiFi"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) Calibre: „Send to device“"
|
|
STR_CALIBRE_INSTRUCTION_4: "Neišjunkite šio ekrano"
|
|
STR_CAT_DISPLAY: "Ekranas"
|
|
STR_CAT_READER: "Skaitytuvas"
|
|
STR_CAT_CONTROLS: "Valdymas"
|
|
STR_CAT_SYSTEM: "Sistema"
|
|
STR_SLEEP_SCREEN: "Miego ekranas"
|
|
STR_SLEEP_COVER_MODE: "Viršelio režimas"
|
|
STR_HIDE_BATTERY: "Slėpti baterijos %"
|
|
STR_EXTRA_SPACING: "Tarpai tarp pastraipų"
|
|
STR_TEXT_AA: "Teksto glotninimas"
|
|
STR_IMAGES: "Paveikslėliai"
|
|
STR_IMAGES_DISPLAY: "Rodyti"
|
|
STR_IMAGES_PLACEHOLDER: "Vietaženklis"
|
|
STR_IMAGES_SUPPRESS: "Slėpti"
|
|
STR_SHORT_PWR_BTN: "Trumpas įjungimo pasp."
|
|
STR_ORIENTATION: "Orientacija"
|
|
STR_SIDE_BTN_LAYOUT: "Šoniniai mygtukai"
|
|
STR_LONG_PRESS_SKIP: "Praleisti skyrių (ilgai)"
|
|
STR_FONT_FAMILY: "Šriftas"
|
|
STR_FONT_SIZE: "Šrifto dydis"
|
|
STR_LINE_SPACING: "Tarpai tarp eilučių"
|
|
STR_SCREEN_MARGIN: "Ekrano paraštės"
|
|
STR_PARA_ALIGNMENT: "Lygiavimas"
|
|
STR_HYPHENATION: "Skiemenuoti"
|
|
STR_TIME_TO_SLEEP: "Užmigti po"
|
|
STR_SHOW_HIDDEN_FILES: "Rod. paslėptus failus"
|
|
STR_REFRESH_FREQ: "Atnaujinimo dažnis"
|
|
STR_KOREADER_SYNC: "KOReader sinchr."
|
|
STR_CHECK_UPDATES: "Atnaujinimai"
|
|
STR_LANGUAGE: "Kalba"
|
|
STR_CLEAR_READING_CACHE: "Valyti talpyklą"
|
|
STR_USERNAME: "Vartotojas"
|
|
STR_PASSWORD: "Slaptažodis"
|
|
STR_SYNC_SERVER_URL: "Serverio URL"
|
|
STR_DOCUMENT_MATCHING: "Atpažinimas"
|
|
STR_AUTHENTICATE: "Prisijungti"
|
|
STR_KOREADER_USERNAME: "KOReader vartotojas"
|
|
STR_KOREADER_PASSWORD: "KOReader slaptažodis"
|
|
STR_FILENAME: "Failas"
|
|
STR_BINARY: "Dvejetainis"
|
|
STR_SET_CREDENTIALS_FIRST: "Nustatykite duomenis"
|
|
STR_WIFI_CONN_FAILED: "WiFi ryšys nutrūko"
|
|
STR_AUTHENTICATING: "Jungiamasi..."
|
|
STR_AUTH_SUCCESS: "Prisijungta!"
|
|
STR_KOREADER_AUTH: "KOReader Login"
|
|
STR_SYNC_READY: "Sinchronizacija paruošta"
|
|
STR_AUTH_FAILED: "Prisijungti nepavyko"
|
|
STR_DONE: "Baigta"
|
|
STR_CLEAR_CACHE_WARNING_1: "Ištrins visą knygų talpyklą."
|
|
STR_CLEAR_CACHE_WARNING_2: "Progresas bus prarastas!"
|
|
STR_CLEAR_CACHE_WARNING_3: "Knygas reikės"
|
|
STR_CLEAR_CACHE_WARNING_4: "perindeksuoti."
|
|
STR_CLEARING_CACHE: "Valoma..."
|
|
STR_CACHE_CLEARED: "Išvalyta"
|
|
STR_ITEMS_REMOVED: "pašalinta"
|
|
STR_FAILED_LOWER: "nepavyko"
|
|
STR_CLEAR_CACHE_FAILED: "Nepavyko išvalyti"
|
|
STR_CHECK_SERIAL_OUTPUT: "Žr. „serial“ išvestį"
|
|
STR_DARK: "Tamsi"
|
|
STR_LIGHT: "Šviesi"
|
|
STR_CUSTOM: "Kita"
|
|
STR_COVER: "Viršelis"
|
|
STR_NONE_OPT: "Nėra"
|
|
STR_FIT: "Talpinti"
|
|
STR_CROP: "Kirpti"
|
|
STR_NEVER: "Niekada"
|
|
STR_IN_READER: "Skaitytuve"
|
|
STR_ALWAYS: "Visada"
|
|
STR_IGNORE: "Nepaisyti"
|
|
STR_SLEEP: "Miegas"
|
|
STR_PAGE_TURN: "Versti psl."
|
|
STR_PORTRAIT: "Stačias"
|
|
STR_LANDSCAPE_CW: "Gulsčias (P)"
|
|
STR_INVERTED: "Apverstas"
|
|
STR_LANDSCAPE_CCW: "Gulsčias (A)"
|
|
STR_PREV_NEXT: "Atgal/Pirmyn"
|
|
STR_NEXT_PREV: "Pirmyn/Atgal"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_OPEN_DYSLEXIC: "O. Dyslexic"
|
|
STR_SMALL: "Mažas"
|
|
STR_MEDIUM: "Vidut."
|
|
STR_LARGE: "Didelis"
|
|
STR_X_LARGE: "X Didelis"
|
|
STR_TIGHT: "Siaura"
|
|
STR_NORMAL: "Norm."
|
|
STR_WIDE: "Platu"
|
|
STR_JUSTIFY: "Abipusis"
|
|
STR_ALIGN_LEFT: "Kairė"
|
|
STR_CENTER: "Centras"
|
|
STR_ALIGN_RIGHT: "Dešinė"
|
|
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 psl."
|
|
STR_PAGES_5: "5 psl."
|
|
STR_PAGES_10: "10 psl."
|
|
STR_PAGES_15: "15 psl."
|
|
STR_PAGES_30: "30 psl."
|
|
STR_UPDATE: "Atnaujinti"
|
|
STR_CHECKING_UPDATE: "Ieškoma..."
|
|
STR_NEW_UPDATE: "Rastas naujinimas!"
|
|
STR_CURRENT_VERSION: "Esama: "
|
|
STR_NEW_VERSION: "Nauja: "
|
|
STR_UPDATING: "Atnaujinama..."
|
|
STR_NO_UPDATE: "Naujinimų nėra"
|
|
STR_UPDATE_FAILED: "Klaida"
|
|
STR_UPDATE_COMPLETE: "Baigta"
|
|
STR_POWER_ON_HINT: "Laikykite Power mygtuką įjungimui"
|
|
STR_NO_ENTRIES: "Įrašų nėra"
|
|
STR_DOWNLOADING: "Siunčiama..."
|
|
STR_DOWNLOAD_FAILED: "Nepavyko"
|
|
STR_ERROR_MSG: "Klaida:"
|
|
STR_UNNAMED: "Bevardis"
|
|
STR_NO_SERVER_URL: "Nėra serverio URL"
|
|
STR_FETCH_FEED_FAILED: "Nepavyko gauti duomenų"
|
|
STR_PARSE_FEED_FAILED: "Apdorojimo klaida"
|
|
STR_NETWORK_PREFIX: "Tinklas: "
|
|
STR_IP_ADDRESS_PREFIX: "IP: "
|
|
STR_ERROR_GENERAL_FAILURE: "Bendra klaida"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Tinklas nerastas"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Baigėsi laikas"
|
|
STR_SD_CARD: "SD kortelė"
|
|
STR_BACK: "« Atgal"
|
|
STR_EXIT: "« Išeiti"
|
|
STR_HOME: "« Pradžia"
|
|
STR_SELECT: "Rinktis"
|
|
STR_SELECTED: "Pasirinkta"
|
|
STR_TOGGLE: "Keisti"
|
|
STR_CONFIRM: "Gerai"
|
|
STR_CANCEL: "Atšaukti"
|
|
STR_CONNECT: "Jungtis"
|
|
STR_OPEN: "Atidaryti"
|
|
STR_DOWNLOAD: "Siųstis"
|
|
STR_RETRY: "Vėl"
|
|
STR_YES: "Taip"
|
|
STR_NO: "Ne"
|
|
STR_SHOW: "Rodyti"
|
|
STR_HIDE: "Slėpti"
|
|
STR_STATE_ON: "ĮJ."
|
|
STR_STATE_OFF: "IŠJ."
|
|
STR_NOT_SET: "Nėra"
|
|
STR_DIR_LEFT: "Kairė"
|
|
STR_DIR_RIGHT: "Dešinė"
|
|
STR_DIR_UP: "Viršus"
|
|
STR_DIR_DOWN: "Apačia"
|
|
STR_OK_BUTTON: "OK"
|
|
STR_SLEEP_COVER_FILTER: "Viršelio filtras"
|
|
STR_FILTER_CONTRAST: "Kontrastas"
|
|
STR_CUSTOMISE_STATUS_BAR: "Būsenos juosta"
|
|
STR_CHAPTER_PAGE_COUNT: "Skyriaus psl."
|
|
STR_BOOK_PROGRESS_PERCENTAGE: "Progresas %"
|
|
STR_PROGRESS_BAR: "Progreso juosta"
|
|
STR_PROGRESS_BAR_THICKNESS: "Juostos storis"
|
|
STR_PROGRESS_BAR_THIN: "Plona"
|
|
STR_PROGRESS_BAR_MEDIUM: "Vidut."
|
|
STR_PROGRESS_BAR_THICK: "Stora"
|
|
STR_BOOK: "Knyga"
|
|
STR_CHAPTER: "Skyrius"
|
|
STR_EXAMPLE_CHAPTER: "21 skyrius"
|
|
STR_EXAMPLE_BOOK: "Knygos pavadinimas"
|
|
STR_PREVIEW: "Peržiūra"
|
|
STR_TITLE: "Pavadinimas"
|
|
STR_BATTERY: "Baterija"
|
|
STR_UI_THEME: "UI tema"
|
|
STR_THEME_CLASSIC: "Klasikinė"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra Ext."
|
|
STR_SUNLIGHT_FADING_FIX: "Blyškumo pataisa"
|
|
STR_REMAP_FRONT_BUTTONS: "Keisti mygtukus"
|
|
STR_OPDS_BROWSER: "OPDS naršyklė"
|
|
STR_COVER_CUSTOM: "Viršelis + Kita"
|
|
STR_MENU_RECENT_BOOKS: "Paskutinės"
|
|
STR_NO_RECENT_BOOKS: "Paskutinių nėra"
|
|
STR_CALIBRE_DESC: "Calibre belaidis ryšys"
|
|
STR_FORGET_AND_REMOVE: "Pamiršti tinklą?"
|
|
STR_FORGET_BUTTON: "Pamiršti"
|
|
STR_CALIBRE_STARTING: "Paleidžiama..."
|
|
STR_CALIBRE_SETUP: "Sąranka"
|
|
STR_CALIBRE_STATUS: "Būsena"
|
|
STR_CLEAR_BUTTON: "Valyti"
|
|
STR_DEFAULT_VALUE: "Numatytasis"
|
|
STR_REMAP_PROMPT: "Spauskite mygtuką kiekvienai funkcijai"
|
|
STR_UNASSIGNED: "Nepriskirta"
|
|
STR_ALREADY_ASSIGNED: "Jau priskirta"
|
|
STR_REMAP_RESET_HINT: "Šoninis Viršus: Atstatyti"
|
|
STR_REMAP_CANCEL_HINT: "Šoninis Apačia: Atšaukti"
|
|
STR_HW_BACK_LABEL: "Atgal (1 mygt.)"
|
|
STR_HW_CONFIRM_LABEL: "Gerai (2 mygt.)"
|
|
STR_HW_LEFT_LABEL: "Kairė (3 mygt.)"
|
|
STR_HW_RIGHT_LABEL: "Dešinė (4 mygt.)"
|
|
STR_GO_TO_PERCENT: "Eiti į %"
|
|
STR_GO_HOME_BUTTON: "Pradžia"
|
|
STR_SYNC_PROGRESS: "Sinchr. progresą"
|
|
STR_DELETE_CACHE: "Trinti talpyklą"
|
|
STR_DELETE: "Trinti"
|
|
STR_DISPLAY_QR: "QR kodas"
|
|
STR_CHAPTER_PREFIX: "Sk: "
|
|
STR_PAGES_SEPARATOR: " psl. | "
|
|
STR_BOOK_PREFIX: "Kn: "
|
|
STR_CALIBRE_URL_HINT: "Pridėkite /opds prie URL"
|
|
STR_PERCENT_STEP_HINT: "K/D: 1% | V/A: 10%"
|
|
STR_SYNCING_TIME: "Sinchr. laikas..."
|
|
STR_CALC_HASH: "Skaičiuojama maiša..."
|
|
STR_HASH_FAILED: "Maišos klaida"
|
|
STR_FETCH_PROGRESS: "Gaunamas progresas..."
|
|
STR_UPLOAD_PROGRESS: "Įkeliamas progresas..."
|
|
STR_NO_CREDENTIALS_MSG: "Nėra duomenų"
|
|
STR_KOREADER_SETUP_HINT: "Sutvarkykite KOReader paskyrą"
|
|
STR_PROGRESS_FOUND: "Rastas progresas!"
|
|
STR_REMOTE_LABEL: "Nuotol.:"
|
|
STR_LOCAL_LABEL: "Vietinis:"
|
|
STR_PAGE_OVERALL_FORMAT: "Psl %d, %.2f%% bendrai"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "Psl %d/%d, %.2f%% bendrai"
|
|
STR_DEVICE_FROM_FORMAT: " Iš: %s"
|
|
STR_APPLY_REMOTE: "Taikyti nuotolinį"
|
|
STR_UPLOAD_LOCAL: "Įkelti vietinį"
|
|
STR_NO_REMOTE_MSG: "Progresų nerasta"
|
|
STR_UPLOAD_PROMPT: "Įkelti poziciją?"
|
|
STR_UPLOAD_SUCCESS: "Įkelta!"
|
|
STR_SYNC_FAILED_MSG: "Nepavyko"
|
|
STR_SAVE_PROGRESS_FAILED: "Nepavyko išsaugoti progreso"
|
|
STR_SECTION_PREFIX: "Dalis "
|
|
STR_UPLOAD: "Įkelti"
|
|
STR_BOOK_S_STYLE: "Knygos stilius"
|
|
STR_EMBEDDED_STYLE: "Integruotas stilius"
|
|
STR_FOCUS_READING: "Sufokusuotas skaitymas"
|
|
STR_OPDS_SERVER_URL: "OPDS URL"
|
|
STR_FOOTNOTES: "Išnašos"
|
|
STR_NO_FOOTNOTES: "Šiame psl. išnašų nėra"
|
|
STR_LINK: "[nuoroda]"
|
|
STR_SCREENSHOT_BUTTON: "Ekrano nuotrauka"
|
|
STR_AUTO_TURN_ENABLED: "Auto-vertimas: "
|
|
STR_AUTO_TURN_PAGES_PER_MIN: "Auto-vertimas (psl/min)"
|
|
STR_TILT_PAGE_TURN: "Puslapio vertimas pakreipiant"
|