## 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
11 KiB
YAML
296 lines
11 KiB
YAML
_language_name: "Slovenščina"
|
|
_language_code: "SI"
|
|
_order: "21"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "ZAGON"
|
|
STR_SLEEPING: "SPANJE"
|
|
STR_ENTERING_SLEEP: "Prehajanje v spanje"
|
|
STR_BROWSE_FILES: "Prebrskaj datoteke"
|
|
STR_FILE_TRANSFER: "Prenos datotek"
|
|
STR_SETTINGS_TITLE: "Nastavitve"
|
|
STR_CONTINUE_READING: "Nadaljuj z branjem"
|
|
STR_NO_OPEN_BOOK: "Ni odprte knjige"
|
|
STR_START_READING: "Začni brati spodaj"
|
|
STR_NO_FILES_FOUND: "Ni najdenih datotek"
|
|
STR_SELECT_CHAPTER: "Izberi poglavje"
|
|
STR_NO_CHAPTERS: "Ni poglavij"
|
|
STR_END_OF_BOOK: "Konec knjige"
|
|
STR_EMPTY_CHAPTER: "Prazno poglavje"
|
|
STR_INDEXING: "Indeksiranje"
|
|
STR_MEMORY_ERROR: "Napaka pomnilnika"
|
|
STR_PAGE_LOAD_ERROR: "Napaka pri nalaganju strani"
|
|
STR_EMPTY_FILE: "Prazna datoteka"
|
|
STR_OUT_OF_BOUNDS: "Izven meja"
|
|
STR_LOADING: "Nalaganje..."
|
|
STR_LOADING_POPUP: "Nalaganje"
|
|
STR_WIFI_NETWORKS: "WiFi omrežja"
|
|
STR_NO_NETWORKS: "Ni najdenih omrežij"
|
|
STR_NETWORKS_FOUND: "Najdenih omrežij: %zu"
|
|
STR_SCANNING: "Iskanje..."
|
|
STR_CONNECTING: "Povezovanje..."
|
|
STR_CONNECTED: "Povezano!"
|
|
STR_CONNECTION_FAILED: "Povezava ni uspela"
|
|
STR_FORGET_NETWORK: "Pozabi omrežje?"
|
|
STR_SAVE_PASSWORD: "Shranim geslo za naslednjič?"
|
|
STR_PRESS_OK_SCAN: "Pritisni OK za ponovno iskanje"
|
|
STR_JOIN_NETWORK: "Poveži se v omrežje"
|
|
STR_CREATE_HOTSPOT: "Ustvari dostopno točko"
|
|
STR_JOIN_DESC: "Poveži se v obstoječe WiFi omrežje"
|
|
STR_HOTSPOT_DESC: "Ustvari WiFi omrežje, v katerega se lahko povežejo drugi"
|
|
STR_STARTING_HOTSPOT: "Zaganjanje dostopne točke..."
|
|
STR_HOTSPOT_MODE: "Način dostopne točke"
|
|
STR_CONNECT_WIFI_HINT: "Poveži svojo napravo v to WiFi omrežje"
|
|
STR_OPEN_URL_HINT: "Odpri ta URL v svojem brskalniku"
|
|
STR_OR_HTTP_PREFIX: "ali http://"
|
|
STR_SCAN_QR_HINT: "ali skeniraj QR kodo s telefonom:"
|
|
STR_CALIBRE_WIRELESS: "Brezžični Calibre"
|
|
STR_CALIBRE_WEB_URL: "Calibre Web URL"
|
|
STR_NETWORK_LEGEND: "* = Šifrirano | + = Shranjeno"
|
|
STR_MAC_ADDRESS: "MAC naslov:"
|
|
STR_CHECKING_WIFI: "Preverjanje WiFi-ja..."
|
|
STR_ENTER_WIFI_PASSWORD: "Vnesi WiFi geslo"
|
|
STR_TO_PREFIX: "v "
|
|
STR_CALIBRE_RECEIVING: "Prejemanje: "
|
|
STR_CALIBRE_RECEIVED: "Prejeto: "
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Namesti vtičnik CrossPoint Reader"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Bodi v istem WiFi omrežju"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) V Calibre: \"Pošlji v napravo\""
|
|
STR_CALIBRE_INSTRUCTION_4: "\"Med pošiljanjem pusti ta zaslon odprt\""
|
|
STR_CAT_DISPLAY: "Zaslon"
|
|
STR_CAT_READER: "Bralnik"
|
|
STR_CAT_CONTROLS: "Kontrole"
|
|
STR_CAT_SYSTEM: "Sistem"
|
|
STR_SLEEP_SCREEN: "Zaslon za spanje"
|
|
STR_SLEEP_COVER_MODE: "Način naslovnice v spanju"
|
|
STR_HIDE_BATTERY: "Skrij % baterije"
|
|
STR_EXTRA_SPACING: "Dodaten razmik med odstavki"
|
|
STR_TEXT_AA: "Glajenje besedila (AA)"
|
|
STR_IMAGES: "Slike"
|
|
STR_IMAGES_DISPLAY: "Prikaži"
|
|
STR_IMAGES_PLACEHOLDER: "Oznaka mesta"
|
|
STR_IMAGES_SUPPRESS: "Zatdi"
|
|
STR_SHORT_PWR_BTN: "Kratek pritisk na gumb za vklop"
|
|
STR_ORIENTATION: "Orientacija branja"
|
|
STR_SIDE_BTN_LAYOUT: "Razpored stranskih gumbov"
|
|
STR_LONG_PRESS_SKIP: "Dolgi pritisk za preskok poglavja"
|
|
STR_FONT_FAMILY: "Pisava bralnika"
|
|
STR_FONT_SIZE: "Velikost pisave"
|
|
STR_LINE_SPACING: "Razmik med vrsticami"
|
|
STR_SCREEN_MARGIN: "Robovi zaslona"
|
|
STR_PARA_ALIGNMENT: "Poravnava odstavkov"
|
|
STR_HYPHENATION: "Deljenje besed"
|
|
STR_TIME_TO_SLEEP: "Čas do spanja"
|
|
STR_SHOW_HIDDEN_FILES: "Prikaži skrite datoteke"
|
|
STR_REFRESH_FREQ: "Pogostost osveževanja"
|
|
STR_KOREADER_SYNC: "KOReader sinhronizacija"
|
|
STR_CHECK_UPDATES: "Preveri posodobitve"
|
|
STR_LANGUAGE: "Jezik"
|
|
STR_CLEAR_READING_CACHE: "Počisti predpomnilnik branja"
|
|
STR_USERNAME: "Uporabniško ime"
|
|
STR_PASSWORD: "Geslo"
|
|
STR_SYNC_SERVER_URL: "URL strežnika za sinhronizacijo"
|
|
STR_DOCUMENT_MATCHING: "Ujemanje dokumentov"
|
|
STR_AUTHENTICATE: "Avtentikacija"
|
|
STR_KOREADER_USERNAME: "KOReader uporabnik"
|
|
STR_KOREADER_PASSWORD: "KOReader geslo"
|
|
STR_FILENAME: "Ime datoteke"
|
|
STR_BINARY: "Binarno"
|
|
STR_SET_CREDENTIALS_FIRST: "Najprej nastavi podatke za prijavo"
|
|
STR_WIFI_CONN_FAILED: "WiFi povezava ni uspela"
|
|
STR_AUTHENTICATING: "Preverjanje..."
|
|
STR_AUTH_SUCCESS: "Uspešna prijava!"
|
|
STR_KOREADER_AUTH: "KOReader avtentikacija"
|
|
STR_SYNC_READY: "KOReader sinhronizacija je pripravljena"
|
|
STR_AUTH_FAILED: "Prijava ni uspela"
|
|
STR_DONE: "Končano"
|
|
STR_CLEAR_CACHE_WARNING_1: "To bo izbrisalo vse predpomnjene podatke o knjigah."
|
|
STR_CLEAR_CACHE_WARNING_2: "Ves napredek pri branju bo izgubljen!"
|
|
STR_CLEAR_CACHE_WARNING_3: "Knjige bo treba ob ponovnem odpiranju"
|
|
STR_CLEAR_CACHE_WARNING_4: "ponovno indeksirati."
|
|
STR_CLEARING_CACHE: "Čiščenje predpomnilnika..."
|
|
STR_CACHE_CLEARED: "Predpomnilnik očiščen"
|
|
STR_ITEMS_REMOVED: "elementov odstranjenih"
|
|
STR_FAILED_LOWER: "ni uspelo"
|
|
STR_CLEAR_CACHE_FAILED: "Čiščenje predpomnilnika ni uspelo"
|
|
STR_CHECK_SERIAL_OUTPUT: "Za podrobnosti preveri serijski izhod"
|
|
STR_DARK: "Temno"
|
|
STR_LIGHT: "Svetlo"
|
|
STR_CUSTOM: "Po meri"
|
|
STR_COVER: "Naslovnica"
|
|
STR_NONE_OPT: "Brez"
|
|
STR_FIT: "Prilagodi"
|
|
STR_CROP: "Obreži"
|
|
STR_NEVER: "Nikoli"
|
|
STR_IN_READER: "V bralniku"
|
|
STR_ALWAYS: "Vedno"
|
|
STR_IGNORE: "Prezri"
|
|
STR_SLEEP: "Spanje"
|
|
STR_PAGE_TURN: "Obračanje strani"
|
|
STR_PORTRAIT: "Pokončno"
|
|
STR_LANDSCAPE_CW: "Ležeče (v smeri urinega kazalca)"
|
|
STR_INVERTED: "Obrnjeno"
|
|
STR_LANDSCAPE_CCW: "Ležeče (proti smeri urinega kazalca)"
|
|
STR_PREV_NEXT: "Nazaj/Naprej"
|
|
STR_NEXT_PREV: "Naprej/Nazaj"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
|
STR_SMALL: "Majhno"
|
|
STR_MEDIUM: "Srednje"
|
|
STR_LARGE: "Veliko"
|
|
STR_X_LARGE: "Zelo veliko"
|
|
STR_TIGHT: "Tesno"
|
|
STR_NORMAL: "Normalno"
|
|
STR_WIDE: "Široko"
|
|
STR_JUSTIFY: "Obojestransko"
|
|
STR_ALIGN_LEFT: "Levo"
|
|
STR_CENTER: "Sredinsko"
|
|
STR_ALIGN_RIGHT: "Desno"
|
|
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 stran"
|
|
STR_PAGES_5: "5 strani"
|
|
STR_PAGES_10: "10 strani"
|
|
STR_PAGES_15: "15 strani"
|
|
STR_PAGES_30: "30 strani"
|
|
STR_UPDATE: "Posodobi"
|
|
STR_CHECKING_UPDATE: "Preverjanje posodobitev..."
|
|
STR_NEW_UPDATE: "Na voljo je nova posodobitev!"
|
|
STR_CURRENT_VERSION: "Trenutna različica: "
|
|
STR_NEW_VERSION: "Nova različica: "
|
|
STR_UPDATING: "Posodabljanje..."
|
|
STR_NO_UPDATE: "Ni novih posodobitev"
|
|
STR_UPDATE_FAILED: "Posodobitev ni uspela"
|
|
STR_UPDATE_COMPLETE: "Posodobitev končana"
|
|
STR_POWER_ON_HINT: "Pridrži gumb za vklop, da napravo znova vklopiš"
|
|
STR_NO_ENTRIES: "Ni najdenih vnosov"
|
|
STR_DOWNLOADING: "Prenašanje..."
|
|
STR_DOWNLOAD_FAILED: "Prenos ni uspel"
|
|
STR_ERROR_MSG: "Napaka:"
|
|
STR_UNNAMED: "Neimenovano"
|
|
STR_NO_SERVER_URL: "URL strežnika ni nastavljen"
|
|
STR_FETCH_FEED_FAILED: "Nalaganje vira ni uspelo"
|
|
STR_PARSE_FEED_FAILED: "Razčlenjevanje vira ni uspelo"
|
|
STR_NETWORK_PREFIX: "Omrežje: "
|
|
STR_IP_ADDRESS_PREFIX: "IP naslov: "
|
|
STR_ERROR_GENERAL_FAILURE: "Napaka: Splošna napaka"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Napaka: Omrežje ni najdeno"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Napaka: Časovna omejitev povezave"
|
|
STR_SD_CARD: "SD kartica"
|
|
STR_BACK: "« Nazaj"
|
|
STR_EXIT: "« Izhod"
|
|
STR_HOME: "« Domov"
|
|
STR_SELECT: "Izberi"
|
|
STR_SELECTED: "Izbrano"
|
|
STR_TOGGLE: "Preklopi"
|
|
STR_CONFIRM: "Potrdi"
|
|
STR_CANCEL: "Prekliči"
|
|
STR_CONNECT: "Poveži"
|
|
STR_OPEN: "Odpri"
|
|
STR_DOWNLOAD: "Prenesi"
|
|
STR_RETRY: "Poskusi znova"
|
|
STR_YES: "Da"
|
|
STR_NO: "Ne"
|
|
STR_SHOW: "Prikaži"
|
|
STR_HIDE: "Skrij"
|
|
STR_STATE_ON: "VKLOP"
|
|
STR_STATE_OFF: "IZKLOP"
|
|
STR_NOT_SET: "Ni nastavljeno"
|
|
STR_DIR_LEFT: "Levo"
|
|
STR_DIR_RIGHT: "Desno"
|
|
STR_DIR_UP: "Gor"
|
|
STR_DIR_DOWN: "Dol"
|
|
STR_OK_BUTTON: "V redu"
|
|
STR_SLEEP_COVER_FILTER: "Filter naslovnice v spanju"
|
|
STR_FILTER_CONTRAST: "Kontrast"
|
|
STR_CUSTOMISE_STATUS_BAR: "Prilagodi vrstico stanja"
|
|
STR_CHAPTER_PAGE_COUNT: "Število strani v poglavju"
|
|
STR_BOOK_PROGRESS_PERCENTAGE: "Odstotek napredka v knjigi"
|
|
STR_PROGRESS_BAR: "Vrstica napredka"
|
|
STR_PROGRESS_BAR_THICKNESS: "Debelina vrstice napredka"
|
|
STR_PROGRESS_BAR_THIN: "Tanko"
|
|
STR_PROGRESS_BAR_MEDIUM: "Srednje"
|
|
STR_PROGRESS_BAR_THICK: "Debelo"
|
|
STR_BOOK: "Knjiga"
|
|
STR_CHAPTER: "Poglavje"
|
|
STR_EXAMPLE_CHAPTER: "Poglavje 21"
|
|
STR_EXAMPLE_BOOK: "Naslov knjige"
|
|
STR_PREVIEW: "Predogled"
|
|
STR_TITLE: "Naslov"
|
|
STR_BATTERY: "Baterija"
|
|
STR_UI_THEME: "Tema uporabniškega vmesnika"
|
|
STR_THEME_CLASSIC: "Klasična"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra razširjena"
|
|
STR_SUNLIGHT_FADING_FIX: "Popravek bledenja na soncu"
|
|
STR_REMAP_FRONT_BUTTONS: "Prenastavi sprednje gumbe"
|
|
STR_OPDS_BROWSER: "OPDS brskalnik"
|
|
STR_COVER_CUSTOM: "Naslovnica + po meri"
|
|
STR_MENU_RECENT_BOOKS: "Zadnje knjige"
|
|
STR_NO_RECENT_BOOKS: "Ni zadnjih knjig"
|
|
STR_CALIBRE_DESC: "Uporabi brezžični prenos Calibre"
|
|
STR_FORGET_AND_REMOVE: "Pozabi omrežje in odstrani shranjeno geslo?"
|
|
STR_FORGET_BUTTON: "Pozabi"
|
|
STR_CALIBRE_STARTING: "Zaganjanje Calibre..."
|
|
STR_CALIBRE_SETUP: "Nastavitev"
|
|
STR_CALIBRE_STATUS: "Stanje"
|
|
STR_CLEAR_BUTTON: "Počisti"
|
|
STR_DEFAULT_VALUE: "Privzeto"
|
|
STR_REMAP_PROMPT: "Pritisni sprednji gumb za vsako vlogo"
|
|
STR_UNASSIGNED: "Nedodeljeno"
|
|
STR_ALREADY_ASSIGNED: "Že dodeljeno"
|
|
STR_REMAP_RESET_HINT: "Stranski gumb gor: Ponastavi na privzeto"
|
|
STR_REMAP_CANCEL_HINT: "Stranski gumb dol: Prekliči nastavljanje"
|
|
STR_HW_BACK_LABEL: "Nazaj (1. gumb)"
|
|
STR_HW_CONFIRM_LABEL: "Potrdi (2. gumb)"
|
|
STR_HW_LEFT_LABEL: "Levo (3. gumb)"
|
|
STR_HW_RIGHT_LABEL: "Desno (4. gumb)"
|
|
STR_GO_TO_PERCENT: "Pojdi na %"
|
|
STR_GO_HOME_BUTTON: "Pojdi domov"
|
|
STR_SYNC_PROGRESS: "Sinhroniziraj napredek"
|
|
STR_DELETE_CACHE: "Izbriši predpomnilnik knjige"
|
|
STR_DELETE: "Izbriši"
|
|
STR_DISPLAY_QR: "Prikaži stran kot QR"
|
|
STR_CHAPTER_PREFIX: "Poglavje: "
|
|
STR_PAGES_SEPARATOR: " strani | "
|
|
STR_BOOK_PREFIX: "Knjiga: "
|
|
STR_CALIBRE_URL_HINT: "Za Calibre dodaj /opds svojemu URL-ju"
|
|
STR_PERCENT_STEP_HINT: "Levo/desno: 1% Gor/dol: 10%"
|
|
STR_SYNCING_TIME: "Sinhronizacija časa..."
|
|
STR_CALC_HASH: "Izračunavanje podpisa dokumenta..."
|
|
STR_HASH_FAILED: "Izračun podpisa dokumenta ni uspel"
|
|
STR_FETCH_PROGRESS: "Pridobivanje napredka iz oblaka..."
|
|
STR_UPLOAD_PROGRESS: "Nalaganje napredka..."
|
|
STR_NO_CREDENTIALS_MSG: "Podatki za prijavo niso nastavljeni"
|
|
STR_KOREADER_SETUP_HINT: "Nastavi KOReader račun v nastavitvah"
|
|
STR_PROGRESS_FOUND: "Najden napredek!"
|
|
STR_REMOTE_LABEL: "Oddaljeno:"
|
|
STR_LOCAL_LABEL: "Lokalno:"
|
|
STR_PAGE_OVERALL_FORMAT: "Stran %d, %.2f%% skupno"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "Stran %d/%d, %.2f%% skupno"
|
|
STR_DEVICE_FROM_FORMAT: " Iz: %s"
|
|
STR_APPLY_REMOTE: "Uporabi oddaljen napredek"
|
|
STR_UPLOAD_LOCAL: "Naloži lokalni napredek"
|
|
STR_NO_REMOTE_MSG: "Oddaljen napredek ni bil najden"
|
|
STR_UPLOAD_PROMPT: "Naložim trenutno pozicijo?"
|
|
STR_UPLOAD_SUCCESS: "Napredek naložen!"
|
|
STR_SYNC_FAILED_MSG: "Sinhronizacija ni uspela"
|
|
STR_SAVE_PROGRESS_FAILED: "Napredka ni bilo mogoče shraniti"
|
|
STR_SECTION_PREFIX: "Razdelek "
|
|
STR_UPLOAD: "Naloži"
|
|
STR_BOOK_S_STYLE: "Slog knjige"
|
|
STR_EMBEDDED_STYLE: "Vgrajen slog"
|
|
STR_FOCUS_READING: "Fokusirano branje"
|
|
STR_OPDS_SERVER_URL: "URL OPDS strežnika"
|
|
STR_FOOTNOTES: "Opombe"
|
|
STR_NO_FOOTNOTES: "Na tej strani ni opomb"
|
|
STR_LINK: "[povezava]"
|
|
STR_SCREENSHOT_BUTTON: "Naredi posnetek zaslona"
|
|
STR_AUTO_TURN_ENABLED: "Samodejno obračanje: "
|
|
STR_AUTO_TURN_PAGES_PER_MIN: "Samodejno obračanje (strani na minuto)"
|
|
STR_TILT_PAGE_TURN: "Obračanje s priklonom"
|