## 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: "Magyar"
|
|
_language_code: "HU"
|
|
_order: "19"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "INDÍTÁS"
|
|
STR_SLEEPING: "ALVÁS"
|
|
STR_ENTERING_SLEEP: "Alvás..."
|
|
STR_BROWSE_FILES: "Fájlok böngészése"
|
|
STR_FILE_TRANSFER: "Fájlátvitel"
|
|
STR_SETTINGS_TITLE: "Beállítások"
|
|
STR_CONTINUE_READING: "Olvasás folytatása"
|
|
STR_NO_OPEN_BOOK: "Nincs nyitott könyv"
|
|
STR_START_READING: "Kezdj el olvasni lentebb"
|
|
STR_NO_FILES_FOUND: "Nem találhatók fájlok"
|
|
STR_SELECT_CHAPTER: "Fejezet kiválasztása"
|
|
STR_NO_CHAPTERS: "Nincsenek fejezetek"
|
|
STR_END_OF_BOOK: "A könyv vége"
|
|
STR_EMPTY_CHAPTER: "Üres fejezet"
|
|
STR_INDEXING: "Indexelés"
|
|
STR_MEMORY_ERROR: "Memóriahiba"
|
|
STR_PAGE_LOAD_ERROR: "Lapbetöltési hiba"
|
|
STR_EMPTY_FILE: "Üres fájl"
|
|
STR_OUT_OF_BOUNDS: "Határon kívül"
|
|
STR_LOADING: "Betöltés..."
|
|
STR_LOADING_POPUP: "Betöltés"
|
|
STR_WIFI_NETWORKS: "WiFi hálózatok"
|
|
STR_NO_NETWORKS: "Nem található hálózat"
|
|
STR_NETWORKS_FOUND: "%zu hálózat található"
|
|
STR_SCANNING: "Keresés..."
|
|
STR_CONNECTING: "Kapcsolódás..."
|
|
STR_CONNECTED: "Kapcsolódva!"
|
|
STR_CONNECTION_FAILED: "A kapcsolat sikertelen"
|
|
STR_FORGET_NETWORK: "Hálózat elfelejtése?"
|
|
STR_SAVE_PASSWORD: "Jelszó mentése legközelebb?"
|
|
STR_PRESS_OK_SCAN: "Nyomj OK-t az újraellenőrzéshez"
|
|
STR_JOIN_NETWORK: "Csatlakozás hálózathoz"
|
|
STR_CREATE_HOTSPOT: "Hotspot létrehozása"
|
|
STR_JOIN_DESC: "Csatlakozás meglévő WiFi hálózathoz"
|
|
STR_HOTSPOT_DESC: "WiFi hálózat létrehozása másoknak"
|
|
STR_STARTING_HOTSPOT: "Hotspot indítása..."
|
|
STR_HOTSPOT_MODE: "Hotspot mód"
|
|
STR_CONNECT_WIFI_HINT: "Csatlakoztasd az eszközöd ehhez a WiFi hálózathoz"
|
|
STR_OPEN_URL_HINT: "Nyisd meg ezt az URL-t a böngésződben"
|
|
STR_OR_HTTP_PREFIX: "vagy http://"
|
|
STR_SCAN_QR_HINT: "vagy olvasd be a QR-kódot a telefonoddal:"
|
|
STR_CALIBRE_WIRELESS: "Calibre Wireless"
|
|
STR_CALIBRE_WEB_URL: "OPDS URL"
|
|
STR_NETWORK_LEGEND: "* = Titkosított | + = Mentett"
|
|
STR_MAC_ADDRESS: "MAC-cím:"
|
|
STR_CHECKING_WIFI: "WiFi ellenőrzése..."
|
|
STR_ENTER_WIFI_PASSWORD: "Add meg a WiFi jelszót"
|
|
STR_TO_PREFIX: "- "
|
|
STR_CALIBRE_RECEIVING: "Fogadás: "
|
|
STR_CALIBRE_RECEIVED: "Fogadva: "
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Telepítsd a CrossPoint Reader plugint"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Ugyanazon a WiFi hálózaton légy"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) Calibre-ben: \"Küldés az eszközre\""
|
|
STR_CALIBRE_INSTRUCTION_4: "\"Tartsd nyitva a képernyőt küldés közben\""
|
|
STR_CAT_DISPLAY: "Megjelenítés"
|
|
STR_CAT_READER: "Olvasó"
|
|
STR_CAT_CONTROLS: "Vezérlők"
|
|
STR_CAT_SYSTEM: "Rendszer"
|
|
STR_SLEEP_SCREEN: "Alvásképernyő"
|
|
STR_SLEEP_COVER_MODE: "Alvásképernyő borítómód"
|
|
STR_HIDE_BATTERY: "Akkumulátor % elrejtése"
|
|
STR_EXTRA_SPACING: "Extra bekezdésköz"
|
|
STR_TEXT_AA: "Szöveg élsimítás"
|
|
STR_IMAGES: "Képek"
|
|
STR_IMAGES_DISPLAY: "Megjelenítés"
|
|
STR_IMAGES_PLACEHOLDER: "Helyőrző"
|
|
STR_IMAGES_SUPPRESS: "Elnyomás"
|
|
STR_SHORT_PWR_BTN: "Rövid bekapcsológomb nyomás"
|
|
STR_ORIENTATION: "Olvasási irány"
|
|
STR_SIDE_BTN_LAYOUT: "Oldalsó gomb elrendezés (olvasó)"
|
|
STR_LONG_PRESS_SKIP: "Hosszú nyomás - fejezet ugrás"
|
|
STR_FONT_FAMILY: "Olvasó betűkészlet"
|
|
STR_FONT_SIZE: "Olvasó betűméret"
|
|
STR_LINE_SPACING: "Olvasó sorköz"
|
|
STR_SCREEN_MARGIN: "Olvasó margó"
|
|
STR_PARA_ALIGNMENT: "Olvasó szövegigazítás"
|
|
STR_HYPHENATION: "Elválasztás"
|
|
STR_TIME_TO_SLEEP: "Alvó mód aktiválása"
|
|
STR_SHOW_HIDDEN_FILES: "Rejtett fájlok megjelenítése"
|
|
STR_REFRESH_FREQ: "Frissítési frekvencia"
|
|
STR_KOREADER_SYNC: "KOReader szinkronizálás"
|
|
STR_CHECK_UPDATES: "Frissítések keresése"
|
|
STR_LANGUAGE: "Nyelv"
|
|
STR_CLEAR_READING_CACHE: "Olvasási gyorsítótár törlése"
|
|
STR_USERNAME: "Felhasználónév"
|
|
STR_PASSWORD: "Jelszó"
|
|
STR_SYNC_SERVER_URL: "Szinkronizálás szerver URL"
|
|
STR_DOCUMENT_MATCHING: "Dokumentum egyeztetés"
|
|
STR_AUTHENTICATE: "Hitelesítés"
|
|
STR_KOREADER_USERNAME: "KOReader felhasználónév"
|
|
STR_KOREADER_PASSWORD: "KOReader jelszó"
|
|
STR_FILENAME: "Fájlnév"
|
|
STR_BINARY: "Bináris"
|
|
STR_SET_CREDENTIALS_FIRST: "Először add meg az adatokat"
|
|
STR_WIFI_CONN_FAILED: "WiFi kapcsolat sikertelen"
|
|
STR_AUTHENTICATING: "Hitelesítés..."
|
|
STR_AUTH_SUCCESS: "Sikeres hitelesítés!"
|
|
STR_KOREADER_AUTH: "KOReader hitelesítés"
|
|
STR_SYNC_READY: "KOReader szinkronizálás kész"
|
|
STR_AUTH_FAILED: "Hitelesítés sikertelen"
|
|
STR_DONE: "Kész"
|
|
STR_CLEAR_CACHE_WARNING_1: "Ez törli az összes gyorsítótárazott könyv adatot."
|
|
STR_CLEAR_CACHE_WARNING_2: "Minden olvasási előrehaladás elvész!"
|
|
STR_CLEAR_CACHE_WARNING_3: "A könyveket újra kell indexelni"
|
|
STR_CLEAR_CACHE_WARNING_4: "megnyitáskor."
|
|
STR_CLEARING_CACHE: "Gyorsítótár törlése..."
|
|
STR_CACHE_CLEARED: "Gyorsítótár törölve"
|
|
STR_ITEMS_REMOVED: "elem eltávolítva"
|
|
STR_FAILED_LOWER: "sikertelen"
|
|
STR_CLEAR_CACHE_FAILED: "Gyorsítótár törlése sikertelen"
|
|
STR_CHECK_SERIAL_OUTPUT: "Ellenőrizd a soros kimenetet"
|
|
STR_DARK: "Sötét"
|
|
STR_LIGHT: "Világos"
|
|
STR_CUSTOM: "Egyéni"
|
|
STR_COVER: "Borító"
|
|
STR_NONE_OPT: "Egyik sem"
|
|
STR_FIT: "Illesztés"
|
|
STR_CROP: "Körbevágás"
|
|
STR_NEVER: "Soha"
|
|
STR_IN_READER: "Olvasóban"
|
|
STR_ALWAYS: "Mindig"
|
|
STR_IGNORE: "Mellőzés"
|
|
STR_SLEEP: "Alvás"
|
|
STR_PAGE_TURN: "Lapozás"
|
|
STR_PORTRAIT: "Álló"
|
|
STR_LANDSCAPE_CW: "Fekvő jobbra"
|
|
STR_INVERTED: "Fordított"
|
|
STR_LANDSCAPE_CCW: "Fekvő balra"
|
|
STR_PREV_NEXT: "Előző/Következő"
|
|
STR_NEXT_PREV: "Következő/Előző"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
|
STR_SMALL: "Kicsi"
|
|
STR_MEDIUM: "Közepes"
|
|
STR_LARGE: "Nagy"
|
|
STR_X_LARGE: "Nagyon nagy"
|
|
STR_TIGHT: "Szoros"
|
|
STR_NORMAL: "Normál"
|
|
STR_WIDE: "Széles"
|
|
STR_JUSTIFY: "Sorkizárás"
|
|
STR_ALIGN_LEFT: "Bal"
|
|
STR_CENTER: "Közép"
|
|
STR_ALIGN_RIGHT: "Jobb"
|
|
STR_MIN_1: "1 perc"
|
|
STR_MIN_5: "5 perc"
|
|
STR_MIN_10: "10 perc"
|
|
STR_MIN_15: "15 perc"
|
|
STR_MIN_30: "30 perc"
|
|
STR_PAGES_1: "1 oldal"
|
|
STR_PAGES_5: "5 oldal"
|
|
STR_PAGES_10: "10 oldal"
|
|
STR_PAGES_15: "15 oldal"
|
|
STR_PAGES_30: "30 oldal"
|
|
STR_UPDATE: "Frissítés"
|
|
STR_CHECKING_UPDATE: "Frissítés keresése..."
|
|
STR_NEW_UPDATE: "Új frissítés elérhető!"
|
|
STR_CURRENT_VERSION: "Jelenlegi verzió: "
|
|
STR_NEW_VERSION: "Új verzió: "
|
|
STR_UPDATING: "Frissítés..."
|
|
STR_NO_UPDATE: "Nincs elérhető frissítés"
|
|
STR_UPDATE_FAILED: "Frissítés sikertelen"
|
|
STR_UPDATE_COMPLETE: "Frissítés kész"
|
|
STR_POWER_ON_HINT: "Tartsd nyomva a bekapcsológombot a bekapcsoláshoz"
|
|
STR_NO_ENTRIES: "Nem található bejegyzés"
|
|
STR_DOWNLOADING: "Letöltés..."
|
|
STR_DOWNLOAD_FAILED: "Letöltés sikertelen"
|
|
STR_ERROR_MSG: "Hiba:"
|
|
STR_UNNAMED: "Névtelen"
|
|
STR_NO_SERVER_URL: "Nincs konfigurált szerver URL"
|
|
STR_FETCH_FEED_FAILED: "Hírcsatorna betöltése sikertelen"
|
|
STR_PARSE_FEED_FAILED: "Hírcsatorna feldolgozása sikertelen"
|
|
STR_NETWORK_PREFIX: "Hálózat: "
|
|
STR_IP_ADDRESS_PREFIX: "IP-cím: "
|
|
STR_ERROR_GENERAL_FAILURE: "Hiba: Általános hiba"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Hiba: Hálózat nem található"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Hiba: Kapcsolat időtúllépés"
|
|
STR_SD_CARD: "SD kártya"
|
|
STR_BACK: "« Vissza"
|
|
STR_EXIT: "« Kilépés"
|
|
STR_HOME: "« Főoldal"
|
|
STR_SELECT: "Kiválasztás"
|
|
STR_SELECTED: "Kiválasztva"
|
|
STR_TOGGLE: "Váltás"
|
|
STR_CONFIRM: "Megerősítés"
|
|
STR_CANCEL: "Mégse"
|
|
STR_CONNECT: "Csatlakozás"
|
|
STR_OPEN: "Megnyitás"
|
|
STR_DOWNLOAD: "Letöltés"
|
|
STR_RETRY: "Újra"
|
|
STR_YES: "Igen"
|
|
STR_NO: "Nem"
|
|
STR_SHOW: "Megjelenítés"
|
|
STR_HIDE: "Elrejtés"
|
|
STR_STATE_ON: "BE"
|
|
STR_STATE_OFF: "KI"
|
|
STR_NOT_SET: "Nincs beállítva"
|
|
STR_DIR_LEFT: "Bal"
|
|
STR_DIR_RIGHT: "Jobb"
|
|
STR_DIR_UP: "Fel"
|
|
STR_DIR_DOWN: "Le"
|
|
STR_OK_BUTTON: "OK"
|
|
STR_SLEEP_COVER_FILTER: "Alvásképernyő borítószűrő"
|
|
STR_FILTER_CONTRAST: "Kontraszt"
|
|
STR_CUSTOMISE_STATUS_BAR: "Állapotsáv testreszabása"
|
|
STR_CHAPTER_PAGE_COUNT: "Fejezet oldalszám"
|
|
STR_BOOK_PROGRESS_PERCENTAGE: "Könyv haladás százaléka"
|
|
STR_PROGRESS_BAR: "Haladássáv"
|
|
STR_PROGRESS_BAR_THICKNESS: "Haladássáv vastagsága"
|
|
STR_PROGRESS_BAR_THIN: "Vékony"
|
|
STR_PROGRESS_BAR_MEDIUM: "Közepes"
|
|
STR_PROGRESS_BAR_THICK: "Vastag"
|
|
STR_BOOK: "Könyv"
|
|
STR_CHAPTER: "Fejezet"
|
|
STR_EXAMPLE_CHAPTER: "21. fejezet"
|
|
STR_EXAMPLE_BOOK: "Könyv címe"
|
|
STR_PREVIEW: "Előnézet"
|
|
STR_TITLE: "Cím"
|
|
STR_BATTERY: "Akkumulátor"
|
|
STR_UI_THEME: "Felhasználói felület téma"
|
|
STR_THEME_CLASSIC: "Klasszikus"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
|
|
STR_SUNLIGHT_FADING_FIX: "Napfény halványulás javítás"
|
|
STR_REMAP_FRONT_BUTTONS: "Elülső gombok átállítása"
|
|
STR_OPDS_BROWSER: "OPDS böngésző"
|
|
STR_COVER_CUSTOM: "Borító + Egyéni"
|
|
STR_MENU_RECENT_BOOKS: "Legutóbbi könyvek"
|
|
STR_NO_RECENT_BOOKS: "Nincsenek legutóbbi könyvek"
|
|
STR_CALIBRE_DESC: "Calibre wireless eszköz átvitel használata"
|
|
STR_FORGET_AND_REMOVE: "Hálózat elfelejtése és mentett jelszó törlése?"
|
|
STR_FORGET_BUTTON: "Elfelejtés"
|
|
STR_CALIBRE_STARTING: "Calibre indítása..."
|
|
STR_CALIBRE_SETUP: "Beállítás"
|
|
STR_CALIBRE_STATUS: "Állapot"
|
|
STR_CLEAR_BUTTON: "Törlés"
|
|
STR_DEFAULT_VALUE: "Alapértelmezett"
|
|
STR_REMAP_PROMPT: "Nyomj meg egy elülső gombot minden szerephez"
|
|
STR_UNASSIGNED: "Hozzá nem rendelt"
|
|
STR_ALREADY_ASSIGNED: "Már hozzá van rendelve"
|
|
STR_REMAP_RESET_HINT: "Oldalsó gomb fel: Visszaállítás alapértelmezettre"
|
|
STR_REMAP_CANCEL_HINT: "Oldalsó gomb le: Átállítás megszakítása"
|
|
STR_HW_BACK_LABEL: "Vissza (1. gomb)"
|
|
STR_HW_CONFIRM_LABEL: "Megerősítés (2. gomb)"
|
|
STR_HW_LEFT_LABEL: "Bal (3. gomb)"
|
|
STR_HW_RIGHT_LABEL: "Jobb (4. gomb)"
|
|
STR_GO_TO_PERCENT: "Ugrás %-ra"
|
|
STR_GO_HOME_BUTTON: "Főoldalra"
|
|
STR_SYNC_PROGRESS: "Haladás szinkronizálása"
|
|
STR_DELETE_CACHE: "Könyv gyorsítótár törlése"
|
|
STR_DELETE: "Törlés"
|
|
STR_DISPLAY_QR: "Oldal megjelenítése QR-ként"
|
|
STR_CHAPTER_PREFIX: "Fejezet: "
|
|
STR_PAGES_SEPARATOR: " oldal | "
|
|
STR_BOOK_PREFIX: "Könyv: "
|
|
STR_CALIBRE_URL_HINT: "Calibre esetén adj /opds-t az URL-hez"
|
|
STR_PERCENT_STEP_HINT: "Bal/Jobb: 1% Fel/Le: 10%"
|
|
STR_SYNCING_TIME: "Idő szinkronizálása..."
|
|
STR_CALC_HASH: "Dokumentum hash kiszámítása..."
|
|
STR_HASH_FAILED: "Dokumentum hash kiszámítása sikertelen"
|
|
STR_FETCH_PROGRESS: "Távoli haladás lekérése..."
|
|
STR_UPLOAD_PROGRESS: "Haladás feltöltése..."
|
|
STR_NO_CREDENTIALS_MSG: "Nincsenek beállítva hitelesítő adatok"
|
|
STR_KOREADER_SETUP_HINT: "Állítsd be a KOReader fiókot a Beállításokban"
|
|
STR_PROGRESS_FOUND: "Haladás megtalálva!"
|
|
STR_REMOTE_LABEL: "Távoli:"
|
|
STR_LOCAL_LABEL: "Helyi:"
|
|
STR_PAGE_OVERALL_FORMAT: "%d. oldal, %.2f%% összesen"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "%d/%d. oldal, %.2f%% összesen"
|
|
STR_DEVICE_FROM_FORMAT: " Forrás: %s"
|
|
STR_APPLY_REMOTE: "Távoli haladás alkalmazása"
|
|
STR_UPLOAD_LOCAL: "Helyi haladás feltöltése"
|
|
STR_NO_REMOTE_MSG: "Nem található távoli haladás"
|
|
STR_UPLOAD_PROMPT: "Jelenlegi pozíció feltöltése?"
|
|
STR_UPLOAD_SUCCESS: "Haladás feltöltve!"
|
|
STR_SYNC_FAILED_MSG: "Szinkronizálás sikertelen"
|
|
STR_SAVE_PROGRESS_FAILED: "A haladás mentése sikertelen"
|
|
STR_SECTION_PREFIX: "Szakasz "
|
|
STR_UPLOAD: "Feltöltés"
|
|
STR_BOOK_S_STYLE: "Könyv stílusa"
|
|
STR_EMBEDDED_STYLE: "Beágyazott stílus"
|
|
STR_FOCUS_READING: "Fókuszált olvasás"
|
|
STR_OPDS_SERVER_URL: "OPDS szerver URL"
|
|
STR_FOOTNOTES: "Lábjegyzetek"
|
|
STR_NO_FOOTNOTES: "Nincsenek lábjegyzetek ezen az oldalon"
|
|
STR_LINK: "[link]"
|
|
STR_SCREENSHOT_BUTTON: "Képernyőkép készítése"
|
|
STR_AUTO_TURN_ENABLED: "Automatikus lapozás bekapcsolva: "
|
|
STR_AUTO_TURN_PAGES_PER_MIN: "Automatikus lapozás (oldal/perc)"
|
|
STR_TILT_PAGE_TURN: "Döntéses lapozás"
|