## 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**_
271 lines
10 KiB
YAML
271 lines
10 KiB
YAML
_language_name: "Čeština"
|
|
_language_code: "CS"
|
|
_order: "4"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "SPUŠTĚNÍ"
|
|
STR_SLEEPING: "SPÁNEK"
|
|
STR_ENTERING_SLEEP: "Vstup do režimu spánku"
|
|
STR_BROWSE_FILES: "Procházet soubory"
|
|
STR_FILE_TRANSFER: "Přenos souborů"
|
|
STR_SETTINGS_TITLE: "Nastavení"
|
|
STR_CONTINUE_READING: "Pokračovat ve čtení"
|
|
STR_NO_OPEN_BOOK: "Žádná otevřená kniha"
|
|
STR_START_READING: "Začněte číst níže"
|
|
STR_NO_FILES_FOUND: "Nebyly nalezeny žádné soubory"
|
|
STR_SELECT_CHAPTER: "Vybrat kapitolu"
|
|
STR_NO_CHAPTERS: "Žádné kapitoly"
|
|
STR_END_OF_BOOK: "Konec knihy"
|
|
STR_EMPTY_CHAPTER: "Prázdná kapitola"
|
|
STR_INDEXING: "Indexování"
|
|
STR_MEMORY_ERROR: "Chyba paměti"
|
|
STR_PAGE_LOAD_ERROR: "Chyba načítání stránky"
|
|
STR_EMPTY_FILE: "Prázdný soubor"
|
|
STR_OUT_OF_BOUNDS: "Mimo hranice"
|
|
STR_LOADING: "Načítání..."
|
|
STR_LOADING_POPUP: "Načítání"
|
|
STR_WIFI_NETWORKS: "WiFi sítě"
|
|
STR_NO_NETWORKS: "Žádné sítě nenalezeny"
|
|
STR_NETWORKS_FOUND: "Nalezeno %zu sítí"
|
|
STR_SCANNING: "Skenování..."
|
|
STR_CONNECTING: "Připojování..."
|
|
STR_CONNECTED: "Připojeno!"
|
|
STR_CONNECTION_FAILED: "Připojení se nezdařilo"
|
|
STR_FORGET_NETWORK: "Zapomenout síť?"
|
|
STR_SAVE_PASSWORD: "Uložit heslo pro příště?"
|
|
STR_PRESS_OK_SCAN: "Stiskněte OK pro přeskenování"
|
|
STR_JOIN_NETWORK: "Připojit se k síti"
|
|
STR_CREATE_HOTSPOT: "Vytvořit hotspot"
|
|
STR_JOIN_DESC: "Připojit se k existující síti WiFi"
|
|
STR_HOTSPOT_DESC: "Vytvořit síť WiFi, ke které se mohou připojit ostatní"
|
|
STR_STARTING_HOTSPOT: "Spouštění hotspotu..."
|
|
STR_HOTSPOT_MODE: "Režim hotspotu"
|
|
STR_CONNECT_WIFI_HINT: "Připojte své zařízení k této síti WiFi"
|
|
STR_OPEN_URL_HINT: "Otevřete tuto URL ve svém prohlížeči"
|
|
STR_OR_HTTP_PREFIX: "nebo http://"
|
|
STR_SCAN_QR_HINT: "nebo naskenujte QR kód telefonem:"
|
|
STR_CALIBRE_WIRELESS: "Calibre Wireless"
|
|
STR_CALIBRE_WEB_URL: "OPDS URL"
|
|
STR_NETWORK_LEGEND: "* = Šifrováno | + = Uloženo"
|
|
STR_MAC_ADDRESS: "MAC adresa:"
|
|
STR_CHECKING_WIFI: "Kontrola WiFi..."
|
|
STR_ENTER_WIFI_PASSWORD: "Zadejte heslo WiFi"
|
|
STR_TO_PREFIX: "pro"
|
|
STR_CALIBRE_RECEIVING: "Příjem:"
|
|
STR_CALIBRE_RECEIVED: "Přijato:"
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Nainstalujte plugin CrossPoint Reader"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Buďte ve stejné síti WiFi"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) V Calibre: „Odeslat do zařízení“"
|
|
STR_CALIBRE_INSTRUCTION_4: "„Při odesílání ponechat tuto obrazovku otevřenou“"
|
|
STR_CAT_DISPLAY: "Displej"
|
|
STR_CAT_READER: "Čtečka"
|
|
STR_CAT_CONTROLS: "Ovládací prvky"
|
|
STR_CAT_SYSTEM: "Systém"
|
|
STR_SLEEP_SCREEN: "Obrazovka spánku"
|
|
STR_SLEEP_COVER_MODE: "Obrazovka spánku Režim krytu"
|
|
STR_HIDE_BATTERY: "Skrýt baterii %"
|
|
STR_EXTRA_SPACING: "Extra mezery mezi odstavci"
|
|
STR_TEXT_AA: "Vyhlazování textu"
|
|
STR_SHORT_PWR_BTN: "Krátké stisknutí tlačítka napájení"
|
|
STR_ORIENTATION: "Orientace čtení"
|
|
STR_SIDE_BTN_LAYOUT: "Rozvržení bočních tlačítek (čtečka)"
|
|
STR_LONG_PRESS_BEHAVIOR: "Chování při dlouhém stisknutí tlačítka"
|
|
STR_LONG_PRESS_BEHAVIOR_OFF: "VYP"
|
|
STR_LONG_PRESS_BEHAVIOR_SKIP: "Přeskočení kapitoly"
|
|
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Změna orientace"
|
|
STR_FONT_FAMILY: "Rodina písem čtečky"
|
|
STR_FONT_SIZE: "Velikost písma rozhraní"
|
|
STR_LINE_SPACING: "Řádkování čtečky"
|
|
STR_SCREEN_MARGIN: "Okraj obrazovky čtečky"
|
|
STR_PARA_ALIGNMENT: "Zarovnání odstavců čtečky"
|
|
STR_HYPHENATION: "Dělení slov"
|
|
STR_TIME_TO_SLEEP: "Čas do uspání"
|
|
STR_REFRESH_FREQ: "Frekvence obnovení"
|
|
STR_KOREADER_SYNC: "KOReaderu Sync"
|
|
STR_CHECK_UPDATES: "Zkontrolovat aktualizace"
|
|
STR_LANGUAGE: "Jazyk"
|
|
STR_CLEAR_READING_CACHE: "Vymazat mezipaměť čtení"
|
|
STR_USERNAME: "Uživatelské jméno"
|
|
STR_PASSWORD: "Heslo"
|
|
STR_SYNC_SERVER_URL: "URL synch. serveru"
|
|
STR_DOCUMENT_MATCHING: "Párování dokumentů"
|
|
STR_AUTHENTICATE: "Ověření"
|
|
STR_KOREADER_USERNAME: "Uživ. jméno KOReaderu"
|
|
STR_KOREADER_PASSWORD: "Heslo KOReaderu"
|
|
STR_FILENAME: "Název souboru"
|
|
STR_BINARY: "Binární"
|
|
STR_SET_CREDENTIALS_FIRST: "Nastavte přihlašovací údaje"
|
|
STR_WIFI_CONN_FAILED: "Připojení k WiFi selhalo"
|
|
STR_AUTHENTICATING: "Ověřování..."
|
|
STR_AUTH_SUCCESS: "Úspěšné ověření!"
|
|
STR_KOREADER_AUTH: "Ověření KOReaderu"
|
|
STR_SYNC_READY: "Synchronizace KOReaderu je připravena k použití"
|
|
STR_AUTH_FAILED: "Ověření selhalo"
|
|
STR_DONE: "Hotovo"
|
|
STR_CLEAR_CACHE_WARNING_1: "Tímto vymažete všechna data knih v mezipaměti."
|
|
STR_CLEAR_CACHE_WARNING_2: "Veškerý průběh čtení bude ztracen!"
|
|
STR_CLEAR_CACHE_WARNING_3: "Knihy bude nutné znovu indexovat"
|
|
STR_CLEAR_CACHE_WARNING_4: "při opětovném otevření."
|
|
STR_CLEARING_CACHE: "Mazání mezipaměti..."
|
|
STR_CACHE_CLEARED: "Mezipaměť vymazána"
|
|
STR_ITEMS_REMOVED: "položky odstraněny"
|
|
STR_FAILED_LOWER: "selhalo"
|
|
STR_CLEAR_CACHE_FAILED: "Vymazání mezipaměti se nezdařilo"
|
|
STR_CHECK_SERIAL_OUTPUT: "Podrobnosti naleznete v sériovém výstupu"
|
|
STR_DARK: "Tmavý"
|
|
STR_LIGHT: "Světlý"
|
|
STR_CUSTOM: "Vlastní"
|
|
STR_COVER: "Obálka"
|
|
STR_NONE_OPT: "Žádný"
|
|
STR_FIT: "Přizpůsobit"
|
|
STR_CROP: "Oříznout"
|
|
STR_NEVER: "Nikdy"
|
|
STR_IN_READER: "Ve čtečce"
|
|
STR_ALWAYS: "Vždy"
|
|
STR_IGNORE: "Ignorovat"
|
|
STR_SLEEP: "Spánek"
|
|
STR_PAGE_TURN: "Otáčení stránek"
|
|
STR_PORTRAIT: "Na výšku"
|
|
STR_LANDSCAPE_CW: "Na šířku po směru hod. ručiček"
|
|
STR_INVERTED: "Invertovaný"
|
|
STR_LANDSCAPE_CCW: "Na šířku proti směru hod. ručiček"
|
|
STR_PREV_NEXT: "Předchozí/Další"
|
|
STR_NEXT_PREV: "Další/Předchozí"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
|
STR_SMALL: "Malý"
|
|
STR_MEDIUM: "Střední"
|
|
STR_LARGE: "Velký"
|
|
STR_X_LARGE: "Obří"
|
|
STR_TIGHT: "Těsný"
|
|
STR_NORMAL: "Normální"
|
|
STR_WIDE: "Široký"
|
|
STR_JUSTIFY: "Zarovnat do bloku"
|
|
STR_ALIGN_LEFT: "Vlevo"
|
|
STR_CENTER: "Na střed"
|
|
STR_ALIGN_RIGHT: "Vpravo"
|
|
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 stránka"
|
|
STR_PAGES_5: "5 stránek"
|
|
STR_PAGES_10: "10 stránek"
|
|
STR_PAGES_15: "15 stránek"
|
|
STR_PAGES_30: "30 stránek"
|
|
STR_UPDATE: "Aktualizace"
|
|
STR_CHECKING_UPDATE: "Kontrola aktualizací…"
|
|
STR_NEW_UPDATE: "Nová aktualizace k dispozici!"
|
|
STR_CURRENT_VERSION: "Aktuální verze:"
|
|
STR_NEW_VERSION: "Nová verze:"
|
|
STR_UPDATING: "Aktualizace..."
|
|
STR_NO_UPDATE: "Žádná aktualizace k dispozici"
|
|
STR_UPDATE_FAILED: "Aktualizace selhala"
|
|
STR_UPDATE_COMPLETE: "Aktualizace dokončena"
|
|
STR_POWER_ON_HINT: "Stiskněte a podržte tlačítko napájení pro opětovné zapnutí"
|
|
STR_NO_ENTRIES: "Žádné položky nenalezeny"
|
|
STR_DOWNLOADING: "Stahování..."
|
|
STR_DOWNLOAD_FAILED: "Stahování selhalo"
|
|
STR_ERROR_MSG: "Chyba:"
|
|
STR_UNNAMED: "Nepojmenované"
|
|
STR_NO_SERVER_URL: "Není nakonfigurována adresa URL serveru"
|
|
STR_FETCH_FEED_FAILED: "Načtení kanálu se nezdařilo"
|
|
STR_PARSE_FEED_FAILED: "Analyzování kanálu se nezdařilo"
|
|
STR_NETWORK_PREFIX: "Síť:"
|
|
STR_IP_ADDRESS_PREFIX: "IP adresa:"
|
|
STR_ERROR_GENERAL_FAILURE: "Chyba: Obecná chyba"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Chyba: Síť nenalezena"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Chyba: Časový limit připojení"
|
|
STR_SD_CARD: "SD karta"
|
|
STR_BACK: "« Zpět"
|
|
STR_EXIT: "« Konec"
|
|
STR_HOME: "« Domů"
|
|
STR_SELECT: "Vybrat"
|
|
STR_TOGGLE: "Přepnout"
|
|
STR_CONFIRM: "Potvrdit"
|
|
STR_CANCEL: "Zrušit"
|
|
STR_CONNECT: "Připojit"
|
|
STR_OPEN: "Otevřít"
|
|
STR_DOWNLOAD: "Stáhnout"
|
|
STR_RETRY: "Zkusit znovu"
|
|
STR_YES: "Ano"
|
|
STR_NO: "Ne"
|
|
STR_STATE_ON: "ZAP"
|
|
STR_STATE_OFF: "VYP"
|
|
STR_NOT_SET: "Nenastaveno"
|
|
STR_DIR_LEFT: "Vlevo"
|
|
STR_DIR_RIGHT: "Vpravo"
|
|
STR_DIR_UP: "Nahoru"
|
|
STR_DIR_DOWN: "Dolů"
|
|
STR_OK_BUTTON: "OK"
|
|
STR_SLEEP_COVER_FILTER: "Filtr obrazovky spánku"
|
|
STR_FILTER_CONTRAST: "Kontrast"
|
|
STR_UI_THEME: "Šablona rozhraní"
|
|
STR_THEME_CLASSIC: "Klasická"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_ROUNDEDRAFF: "RoundedRaff"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
|
|
STR_SUNLIGHT_FADING_FIX: "Oprava blednutí na slunci"
|
|
STR_REMAP_FRONT_BUTTONS: "Přemapovat přední tlačítka"
|
|
STR_OPDS_BROWSER: "Prohlížeč OPDS"
|
|
STR_COVER_CUSTOM: "Obálka + Vlastní"
|
|
STR_MENU_RECENT_BOOKS: "Nedávné knihy"
|
|
STR_NO_RECENT_BOOKS: "Žádné nedávné knihy"
|
|
STR_CALIBRE_DESC: "Používat přenosy bezdrátových zařízení Calibre"
|
|
STR_FORGET_AND_REMOVE: "Zapomenout síť a odstranit uložené heslo?"
|
|
STR_FORGET_BUTTON: "Zapomenout"
|
|
STR_CALIBRE_STARTING: "Spuštění Calibre..."
|
|
STR_CALIBRE_SETUP: "Nastavení"
|
|
STR_CALIBRE_STATUS: "Stav"
|
|
STR_CLEAR_BUTTON: "Vymazat"
|
|
STR_DEFAULT_VALUE: "Výchozí"
|
|
STR_REMAP_PROMPT: "Stiskněte přední tlačítko pro každou roli"
|
|
STR_UNASSIGNED: "Nepřiřazeno"
|
|
STR_ALREADY_ASSIGNED: "Již přiřazeno"
|
|
STR_REMAP_RESET_HINT: "Boční tlačítko Nahoru: Obnovit výchozí rozvržení"
|
|
STR_REMAP_CANCEL_HINT: "Boční tlačítko Dolů: Zrušit přemapování"
|
|
STR_HW_BACK_LABEL: "Zpět (1. tlačítko)"
|
|
STR_HW_CONFIRM_LABEL: "Potvrdit (2. tlačítko)"
|
|
STR_HW_LEFT_LABEL: "Vlevo (3. tlačítko)"
|
|
STR_HW_RIGHT_LABEL: "Vpravo (4. tlačítko)"
|
|
STR_GO_TO_PERCENT: "Přejít na %"
|
|
STR_GO_HOME_BUTTON: "Přejít Domů"
|
|
STR_SYNC_PROGRESS: "Průběh synchronizace"
|
|
STR_DELETE_CACHE: "Smazat mezipaměť knihy"
|
|
STR_DELETE: "Smazat"
|
|
STR_CHAPTER_PREFIX: "Kapitola:"
|
|
STR_PAGES_SEPARATOR: "stránek |"
|
|
STR_BOOK_PREFIX: "Kniha:"
|
|
STR_CALIBRE_URL_HINT: "Pro Calibre přidejte /opds do URL adresy"
|
|
STR_PERCENT_STEP_HINT: "Vlevo/Vpravo: 1 % Nahoru/Dolů: 10 %"
|
|
STR_SYNCING_TIME: "Čas synchronizace..."
|
|
STR_CALC_HASH: "Výpočet hashe dokumentu..."
|
|
STR_HASH_FAILED: "Nepodařilo se vypočítat hash dokumentu"
|
|
STR_FETCH_PROGRESS: "Načítání vzdáleného průběhu..."
|
|
STR_UPLOAD_PROGRESS: "Průběh nahrávání..."
|
|
STR_NO_CREDENTIALS_MSG: "Přihlašovací údaje nejsou nakonfigurovány"
|
|
STR_KOREADER_SETUP_HINT: "Nastavit účet KOReader v Nastavení"
|
|
STR_PROGRESS_FOUND: "Nalezen průběh!"
|
|
STR_REMOTE_LABEL: "Vzdálené:"
|
|
STR_LOCAL_LABEL: "Lokální:"
|
|
STR_PAGE_OVERALL_FORMAT: "Stránka %d, celkově %.2f%%"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "Stránka %d/%d, celkově %.2f%%"
|
|
STR_DEVICE_FROM_FORMAT: " Od: %s"
|
|
STR_APPLY_REMOTE: "Použít vzdálený postup"
|
|
STR_UPLOAD_LOCAL: "Nahrát lokální postup"
|
|
STR_NO_REMOTE_MSG: "Nenalezen žádný vzdálený postup"
|
|
STR_UPLOAD_PROMPT: "Nahrát aktuální pozici?"
|
|
STR_UPLOAD_SUCCESS: "Postup nahrán!"
|
|
STR_SYNC_FAILED_MSG: "Synchronizace se nezdařila"
|
|
STR_SAVE_PROGRESS_FAILED: "Nepodařilo se uložit pokrok"
|
|
STR_SECTION_PREFIX: "Sekce"
|
|
STR_UPLOAD: "Nahrát"
|
|
STR_BOOK_S_STYLE: "Styl knihy"
|
|
STR_EMBEDDED_STYLE: "Vložený styl"
|
|
STR_FOCUS_READING: "Soustředěné čtení"
|
|
STR_OPDS_SERVER_URL: "URL serveru OPDS"
|
|
STR_SCREENSHOT_BUTTON: "Udělat snímek obrazovky"
|
|
STR_TILT_PAGE_TURN: "Otáčení stránek nakloněním"
|