Files
Crosspoint/lib/I18n/translations/dutch.yaml
T
Vincent Politzer 4e5e2fe40a feat: focus reading (#1670)
## 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**_
2026-05-10 20:02:14 +02:00

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"