## 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**_
298 lines
11 KiB
YAML
298 lines
11 KiB
YAML
_language_name: "Nederlands"
|
|
_language_code: "NL"
|
|
_order: "16"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "OPSTARTEN"
|
|
STR_SLEEPING: "SLAAPSTAND"
|
|
STR_ENTERING_SLEEP: "Gaat in slaapstand"
|
|
STR_BROWSE_FILES: "Bestanden bladeren"
|
|
STR_FILE_TRANSFER: "Bestandsoverdracht"
|
|
STR_SETTINGS_TITLE: "Instellingen"
|
|
STR_CONTINUE_READING: "Verder lezen"
|
|
STR_NO_OPEN_BOOK: "Geen geopend boek"
|
|
STR_START_READING: "Begin hieronder met lezen"
|
|
STR_NO_FILES_FOUND: "Geen bestanden gevonden"
|
|
STR_SELECT_CHAPTER: "Selecteer hoofdstuk"
|
|
STR_NO_CHAPTERS: "Geen hoofdstukken"
|
|
STR_END_OF_BOOK: "Einde van boek"
|
|
STR_EMPTY_CHAPTER: "Leeg hoofdstuk"
|
|
STR_INDEXING: "Indexeren"
|
|
STR_MEMORY_ERROR: "Geheugenfout"
|
|
STR_PAGE_LOAD_ERROR: "Fout bij laden pagina"
|
|
STR_EMPTY_FILE: "Leeg bestand"
|
|
STR_OUT_OF_BOUNDS: "Buiten bereik"
|
|
STR_LOADING: "Laden..."
|
|
STR_LOADING_POPUP: "Laden"
|
|
STR_WIFI_NETWORKS: "Wifi-netwerken"
|
|
STR_NO_NETWORKS: "Geen netwerken gevonden"
|
|
STR_NETWORKS_FOUND: "%zu netwerken gevonden"
|
|
STR_SCANNING: "Scannen..."
|
|
STR_CONNECTING: "Verbinden..."
|
|
STR_CONNECTED: "Verbonden!"
|
|
STR_CONNECTION_FAILED: "Verbinding mislukt"
|
|
STR_FORGET_NETWORK: "Netwerk vergeten?"
|
|
STR_SAVE_PASSWORD: "Wachtwoord opslaan voor volgende keer?"
|
|
STR_PRESS_OK_SCAN: "Druk op OK om opnieuw te scannen"
|
|
STR_JOIN_NETWORK: "Verbind met netwerk"
|
|
STR_CREATE_HOTSPOT: "Hotspot maken"
|
|
STR_JOIN_DESC: "Verbind met een bestaand wifi-netwerk"
|
|
STR_HOTSPOT_DESC: "Maak een wifi-netwerk waar anderen mee kunnen verbinden"
|
|
STR_STARTING_HOTSPOT: "Hotspot starten..."
|
|
STR_HOTSPOT_MODE: "Hotspot-modus"
|
|
STR_CONNECT_WIFI_HINT: "Verbind je apparaat met dit wifi-netwerk"
|
|
STR_OPEN_URL_HINT: "Open deze URL in je browser"
|
|
STR_OR_HTTP_PREFIX: "of http://"
|
|
STR_SCAN_QR_HINT: "of scan de QR-code met je telefoon:"
|
|
STR_CALIBRE_WIRELESS: "Calibre Wireless"
|
|
STR_CALIBRE_WEB_URL: "OPDS URL"
|
|
STR_NETWORK_LEGEND: "* = Beveiligd | + = Opgeslagen"
|
|
STR_MAC_ADDRESS: "MAC-adres:"
|
|
STR_CHECKING_WIFI: "Wifi controleren..."
|
|
STR_ENTER_WIFI_PASSWORD: "Voer wifi-wachtwoord in"
|
|
STR_TO_PREFIX: "met "
|
|
STR_CALIBRE_RECEIVING: "Bezig met ontvangen: "
|
|
STR_CALIBRE_RECEIVED: "Ontvangen: "
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Installeer CrossPoint Reader plugin"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Gebruik hetzelfde wifi-netwerk"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Send to device\""
|
|
STR_CALIBRE_INSTRUCTION_4: "\"Houd dit scherm open tijdens verzenden\""
|
|
STR_CAT_DISPLAY: "Scherm"
|
|
STR_CAT_READER: "Lezer"
|
|
STR_CAT_CONTROLS: "Bediening"
|
|
STR_CAT_SYSTEM: "Systeem"
|
|
STR_SLEEP_SCREEN: "Slaapscherm"
|
|
STR_SLEEP_COVER_MODE: "Slaapscherm omslag-modus"
|
|
STR_HIDE_BATTERY: "Batterij % verbergen"
|
|
STR_EXTRA_SPACING: "Extra regelafstand alinea"
|
|
STR_TEXT_AA: "Tekst Anti-Aliasing"
|
|
STR_IMAGES: "Afbeeldingen"
|
|
STR_IMAGES_DISPLAY: "Weergave"
|
|
STR_IMAGES_PLACEHOLDER: "Placeholder"
|
|
STR_IMAGES_SUPPRESS: "Verbergen"
|
|
STR_SHORT_PWR_BTN: "Korte klik aan/uit-knop"
|
|
STR_ORIENTATION: "Leesstand"
|
|
STR_SIDE_BTN_LAYOUT: "Indeling zijknoppen (lezer)"
|
|
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_FONT_FAMILY: "Lettertype lezer"
|
|
STR_FONT_SIZE: "Lettergrootte lezer"
|
|
STR_LINE_SPACING: "Regelafstand lezer"
|
|
STR_SCREEN_MARGIN: "Schermmarge lezer"
|
|
STR_PARA_ALIGNMENT: "Uitlijning alinea lezer"
|
|
STR_HYPHENATION: "Woordafbreking"
|
|
STR_TIME_TO_SLEEP: "Tijd tot slaapstand"
|
|
STR_SHOW_HIDDEN_FILES: "Toon verborgen bestanden"
|
|
STR_REFRESH_FREQ: "Verversingsfrequentie"
|
|
STR_KOREADER_SYNC: "KOReader Sync"
|
|
STR_CHECK_UPDATES: "Controleren op updates"
|
|
STR_LANGUAGE: "Taal"
|
|
STR_CLEAR_READING_CACHE: "Leescache wissen"
|
|
STR_USERNAME: "Gebruikersnaam"
|
|
STR_PASSWORD: "Wachtwoord"
|
|
STR_SYNC_SERVER_URL: "Sync-server URL"
|
|
STR_DOCUMENT_MATCHING: "Documentkoppeling"
|
|
STR_AUTHENTICATE: "Authenticatie"
|
|
STR_KOREADER_USERNAME: "KOReader gebruikersnaam"
|
|
STR_KOREADER_PASSWORD: "KOReader wachtwoord"
|
|
STR_FILENAME: "Bestandsnaam"
|
|
STR_BINARY: "Binair"
|
|
STR_SET_CREDENTIALS_FIRST: "Stel eerst inloggegevens in"
|
|
STR_WIFI_CONN_FAILED: "Wifi-verbinding mislukt"
|
|
STR_AUTHENTICATING: "Authenticeren..."
|
|
STR_AUTH_SUCCESS: "Authenticatie geslaagd!"
|
|
STR_KOREADER_AUTH: "KOReader-authenticatie"
|
|
STR_SYNC_READY: "KOReader sync is klaar voor gebruik"
|
|
STR_AUTH_FAILED: "Authenticatie mislukt"
|
|
STR_DONE: "Klaar"
|
|
STR_CLEAR_CACHE_WARNING_1: "Dit wist alle gecachte boekgegevens."
|
|
STR_CLEAR_CACHE_WARNING_2: "Alle leesvoortgang gaat verloren!"
|
|
STR_CLEAR_CACHE_WARNING_3: "Boeken moeten opnieuw worden geïndexeerd"
|
|
STR_CLEAR_CACHE_WARNING_4: "wanneer ze weer worden geopend."
|
|
STR_CLEARING_CACHE: "Cache wissen..."
|
|
STR_CACHE_CLEARED: "Cache gewist"
|
|
STR_ITEMS_REMOVED: "items verwijderd"
|
|
STR_FAILED_LOWER: "mislukt"
|
|
STR_CLEAR_CACHE_FAILED: "Cache wissen mislukt"
|
|
STR_CHECK_SERIAL_OUTPUT: "Check seriële output voor details"
|
|
STR_DARK: "Donker"
|
|
STR_LIGHT: "Licht"
|
|
STR_CUSTOM: "Aangepast"
|
|
STR_COVER: "Omslag"
|
|
STR_NONE_OPT: "Geen"
|
|
STR_FIT: "Passend"
|
|
STR_CROP: "Bijsnijden"
|
|
STR_NEVER: "Nooit"
|
|
STR_IN_READER: "In lezer"
|
|
STR_ALWAYS: "Altijd"
|
|
STR_IGNORE: "Negeren"
|
|
STR_SLEEP: "Slaap"
|
|
STR_PAGE_TURN: "Pagina omslaan"
|
|
STR_PORTRAIT: "Staand"
|
|
STR_LANDSCAPE_CW: "Liggend (rechtsom)"
|
|
STR_INVERTED: "Omgekeerd"
|
|
STR_LANDSCAPE_CCW: "Liggend (linksom)"
|
|
STR_PREV_NEXT: "Vorige/Volgende"
|
|
STR_NEXT_PREV: "Volgende/Vorige"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
|
STR_SMALL: "Klein"
|
|
STR_MEDIUM: "Gemiddeld"
|
|
STR_LARGE: "Groot"
|
|
STR_X_LARGE: "Extra groot"
|
|
STR_TIGHT: "Smal"
|
|
STR_NORMAL: "Normaal"
|
|
STR_WIDE: "Breed"
|
|
STR_JUSTIFY: "Uitvullen"
|
|
STR_ALIGN_LEFT: "Links"
|
|
STR_CENTER: "Centreren"
|
|
STR_ALIGN_RIGHT: "Rechts"
|
|
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 pagina's"
|
|
STR_PAGES_10: "10 pagina's"
|
|
STR_PAGES_15: "15 pagina's"
|
|
STR_PAGES_30: "30 pagina's"
|
|
STR_UPDATE: "Update"
|
|
STR_CHECKING_UPDATE: "Controleren op update..."
|
|
STR_NEW_UPDATE: "Nieuwe update beschikbaar!"
|
|
STR_CURRENT_VERSION: "Huidige versie: "
|
|
STR_NEW_VERSION: "Nieuwe versie: "
|
|
STR_UPDATING: "Updaten..."
|
|
STR_NO_UPDATE: "Geen update beschikbaar"
|
|
STR_UPDATE_FAILED: "Update mislukt"
|
|
STR_UPDATE_COMPLETE: "Update voltooid"
|
|
STR_POWER_ON_HINT: "Houd de aan/uit-knop ingedrukt om in te schakelen"
|
|
STR_NO_ENTRIES: "Geen items gevonden"
|
|
STR_DOWNLOADING: "Downloaden..."
|
|
STR_DOWNLOAD_FAILED: "Download mislukt"
|
|
STR_ERROR_MSG: "Fout:"
|
|
STR_UNNAMED: "Naamloos"
|
|
STR_NO_SERVER_URL: "Geen server-URL ingesteld"
|
|
STR_FETCH_FEED_FAILED: "Ophalen feed mislukt"
|
|
STR_PARSE_FEED_FAILED: "Verwerken feed mislukt"
|
|
STR_NETWORK_PREFIX: "Netwerk: "
|
|
STR_IP_ADDRESS_PREFIX: "IP-adres: "
|
|
STR_ERROR_GENERAL_FAILURE: "Fout: Algemene fout"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Fout: Netwerk niet gevonden"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Fout: Verbindingstime-out"
|
|
STR_SD_CARD: "SD-kaart"
|
|
STR_BACK: "« Terug"
|
|
STR_EXIT: "« Sluit"
|
|
STR_HOME: "« Home"
|
|
STR_SELECT: "Kies"
|
|
STR_SELECTED: "Geselecteerd"
|
|
STR_TOGGLE: "Wissel"
|
|
STR_CONFIRM: "Bevestig"
|
|
STR_CANCEL: "Annuleer"
|
|
STR_CONNECT: "Verbind"
|
|
STR_OPEN: "Open"
|
|
STR_DOWNLOAD: "Download"
|
|
STR_RETRY: "Opnieuw"
|
|
STR_YES: "Ja"
|
|
STR_NO: "Nee"
|
|
STR_SHOW: "Toon"
|
|
STR_HIDE: "Verberg"
|
|
STR_STATE_ON: "AAN"
|
|
STR_STATE_OFF: "UIT"
|
|
STR_NOT_SET: "Niet ingesteld"
|
|
STR_DIR_LEFT: "Links"
|
|
STR_DIR_RIGHT: "Rechts"
|
|
STR_DIR_UP: "Omhoog"
|
|
STR_DIR_DOWN: "Omlaag"
|
|
STR_OK_BUTTON: "OK"
|
|
STR_SLEEP_COVER_FILTER: "Slaapscherm omslag-filter"
|
|
STR_FILTER_CONTRAST: "Contrast"
|
|
STR_CUSTOMISE_STATUS_BAR: "Statusbalk aanpassen"
|
|
STR_CHAPTER_PAGE_COUNT: "Paginanummering hoofdstuk"
|
|
STR_BOOK_PROGRESS_PERCENTAGE: "Percentage voortgang boek"
|
|
STR_PROGRESS_BAR: "Voortgangsbalk"
|
|
STR_PROGRESS_BAR_THICKNESS: "Dikte voortgangsbalk"
|
|
STR_PROGRESS_BAR_THIN: "Dun"
|
|
STR_PROGRESS_BAR_MEDIUM: "Gemiddeld"
|
|
STR_PROGRESS_BAR_THICK: "Dik"
|
|
STR_BOOK: "Boek"
|
|
STR_CHAPTER: "Hoofdstuk"
|
|
STR_EXAMPLE_CHAPTER: "Hoofdstuk 21"
|
|
STR_EXAMPLE_BOOK: "Boektitel"
|
|
STR_PREVIEW: "Voorbeeld"
|
|
STR_TITLE: "Titel"
|
|
STR_BATTERY: "Batterij"
|
|
STR_UI_THEME: "UI Thema"
|
|
STR_THEME_CLASSIC: "Klassiek"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra Uitgebreid"
|
|
STR_SUNLIGHT_FADING_FIX: "Zonlicht vervaging fix"
|
|
STR_REMAP_FRONT_BUTTONS: "Knoppen voorzijde wijzigen"
|
|
STR_OPDS_BROWSER: "OPDS-browser"
|
|
STR_COVER_CUSTOM: "Omslag + Aangepast"
|
|
STR_MENU_RECENT_BOOKS: "Recente boeken"
|
|
STR_NO_RECENT_BOOKS: "Geen recente boeken"
|
|
STR_CALIBRE_DESC: "Gebruik Calibre draadloze overdracht"
|
|
STR_FORGET_AND_REMOVE: "Netwerk vergeten en wachtwoord verwijderen?"
|
|
STR_FORGET_BUTTON: "Vergeet"
|
|
STR_CALIBRE_STARTING: "Calibre starten..."
|
|
STR_CALIBRE_SETUP: "Installatie"
|
|
STR_CALIBRE_STATUS: "Status"
|
|
STR_CLEAR_BUTTON: "Wis"
|
|
STR_DEFAULT_VALUE: "Standaard"
|
|
STR_REMAP_PROMPT: "Druk op een knop voorop voor elke functie"
|
|
STR_UNASSIGNED: "Niet toegewezen"
|
|
STR_ALREADY_ASSIGNED: "Al toegewezen"
|
|
STR_REMAP_RESET_HINT: "Zijknop Omhoog: Standaardindeling herstellen"
|
|
STR_REMAP_CANCEL_HINT: "Zijknop Omlaag: Toewijzen annuleren"
|
|
STR_HW_BACK_LABEL: "Terug (1e knop)"
|
|
STR_HW_CONFIRM_LABEL: "Bevestig (2e knop)"
|
|
STR_HW_LEFT_LABEL: "Links (3e knop)"
|
|
STR_HW_RIGHT_LABEL: "Rechts (4e knop)"
|
|
STR_GO_TO_PERCENT: "Ga naar %"
|
|
STR_GO_HOME_BUTTON: "Naar Home"
|
|
STR_SYNC_PROGRESS: "Voortgang synchroniseren"
|
|
STR_DELETE_CACHE: "Boekcache verwijderen"
|
|
STR_DELETE: "Verwijder"
|
|
STR_DISPLAY_QR: "Pagina als QR tonen"
|
|
STR_CHAPTER_PREFIX: "Hoofdstuk: "
|
|
STR_PAGES_SEPARATOR: " pagina's | "
|
|
STR_BOOK_PREFIX: "Boek: "
|
|
STR_CALIBRE_URL_HINT: "Voeg voor Calibre /opds toe aan de URL"
|
|
STR_PERCENT_STEP_HINT: "Links/Rechts: 1% Omhoog/Omlaag: 10%"
|
|
STR_SYNCING_TIME: "Tijd synchroniseren..."
|
|
STR_CALC_HASH: "Document-hash berekenen..."
|
|
STR_HASH_FAILED: "Document-hash berekenen mislukt"
|
|
STR_FETCH_PROGRESS: "Voortgang ophalen..."
|
|
STR_UPLOAD_PROGRESS: "Voortgang uploaden..."
|
|
STR_NO_CREDENTIALS_MSG: "Geen inloggegevens ingesteld"
|
|
STR_KOREADER_SETUP_HINT: "Stel KOReader-account in bij Instellingen"
|
|
STR_PROGRESS_FOUND: "Voortgang gevonden!"
|
|
STR_REMOTE_LABEL: "Extern:"
|
|
STR_LOCAL_LABEL: "Lokaal:"
|
|
STR_PAGE_OVERALL_FORMAT: "Pagina %d, %.2f%% totaal"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "Pagina %d/%d, %.2f%% totaal"
|
|
STR_DEVICE_FROM_FORMAT: " Van: %s"
|
|
STR_APPLY_REMOTE: "Externe voortgang toepassen"
|
|
STR_UPLOAD_LOCAL: "Lokale voortgang uploaden"
|
|
STR_NO_REMOTE_MSG: "Geen externe voortgang gevonden"
|
|
STR_UPLOAD_PROMPT: "Huidige positie uploaden?"
|
|
STR_UPLOAD_SUCCESS: "Voortgang geüpload!"
|
|
STR_SYNC_FAILED_MSG: "Sync mislukt"
|
|
STR_SAVE_PROGRESS_FAILED: "Voortgang opslaan mislukt"
|
|
STR_SECTION_PREFIX: "Sectie "
|
|
STR_UPLOAD: "Uploaden"
|
|
STR_BOOK_S_STYLE: "Stijl van boek"
|
|
STR_EMBEDDED_STYLE: "Ingebedde stijl"
|
|
STR_FOCUS_READING: "Gefocust lezen"
|
|
STR_OPDS_SERVER_URL: "OPDS-server URL"
|
|
STR_FOOTNOTES: "Voetnoten"
|
|
STR_NO_FOOTNOTES: "Geen voetnoten op deze pagina"
|
|
STR_LINK: "[link]"
|
|
STR_SCREENSHOT_BUTTON: "Screenshot maken"
|
|
STR_AUTO_TURN_ENABLED: "Automatisch omslaan ingeschakeld: "
|
|
STR_AUTO_TURN_PAGES_PER_MIN: "Autom. omslaan (pagina's per minuut)"
|
|
STR_TILT_PAGE_TURN: "Kantel om te bladeren" |