Files
Crosspoint/lib/I18n/translations/danish.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

299 lines
11 KiB
YAML

_language_name: "Dansk"
_language_code: "DA"
_order: "15"
STR_CROSSPOINT: "CrossPoint"
STR_BOOTING: "STARTER"
STR_SLEEPING: "HVILE"
STR_ENTERING_SLEEP: "Går i hvile"
STR_BROWSE_FILES: "Gennemsøg filer"
STR_FILE_TRANSFER: "Filoverførelse"
STR_SETTINGS_TITLE: "Indstillinger"
STR_CONTINUE_READING: "Fortsæt med at læse"
STR_NO_OPEN_BOOK: "Ingen åben bog"
STR_START_READING: "Start læsning nedenfor"
STR_NO_FILES_FOUND: "Ingen filer fundet"
STR_SELECT_CHAPTER: "Vælg kapitel"
STR_NO_CHAPTERS: "Ingen kapitler"
STR_END_OF_BOOK: "Bogen er færdig"
STR_EMPTY_CHAPTER: "Tomt kapitel"
STR_INDEXING: "Indekserer"
STR_MEMORY_ERROR: "Hukommelsesfejl"
STR_PAGE_LOAD_ERROR: "Fejl ved sideindlæsning"
STR_EMPTY_FILE: "Tom fil"
STR_OUT_OF_BOUNDS: "Uden for grænsen"
STR_LOADING: "Indlæser..."
STR_LOADING_POPUP: "Indlæser"
STR_WIFI_NETWORKS: "Trådløse netværk"
STR_NO_NETWORKS: "Intet netværk fundet"
STR_NETWORKS_FOUND: "%zu netværk fundet"
STR_SCANNING: "Skanner..."
STR_CONNECTING: "Forbinder..."
STR_CONNECTED: "Forbundet!"
STR_CONNECTION_FAILED: "Forbindelsen mislykkedes"
STR_FORGET_NETWORK: "Glem netværk?"
STR_SAVE_PASSWORD: "Gem adgangskode til næste gang?"
STR_PRESS_OK_SCAN: "Tryk OK for at scanne igen"
STR_JOIN_NETWORK: "Tilslut netværk"
STR_CREATE_HOTSPOT: "Opret Hotspot"
STR_JOIN_DESC: "Opret forbindelse til et eksisterende WiFi-netværk"
STR_HOTSPOT_DESC: "Opret et WiFi-netværk andre kan tilslutte sig"
STR_STARTING_HOTSPOT: "Starter Hotspot..."
STR_HOTSPOT_MODE: "Hotspot-tilstand"
STR_CONNECT_WIFI_HINT: "Opret forbindelse fra din enhed til dette WiFi-netværk"
STR_OPEN_URL_HINT: "Åbn denne URL i din browser"
STR_OR_HTTP_PREFIX: "eller http://"
STR_SCAN_QR_HINT: "eller scan QR-kode med din telefon:"
STR_CALIBRE_WIRELESS: "Calibre Wireless"
STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Krypteret | + = Gemt"
STR_MAC_ADDRESS: "MAC-adresse:"
STR_CHECKING_WIFI: "Tjekker WiFi..."
STR_ENTER_WIFI_PASSWORD: "Indtast WiFi-adgangskode"
STR_TO_PREFIX: "til "
STR_CALIBRE_RECEIVING: "Modtager: "
STR_CALIBRE_RECEIVED: "Modtaget: "
STR_CALIBRE_INSTRUCTION_1: "1) Installer CrossPoint Reader-plugin"
STR_CALIBRE_INSTRUCTION_2: "2) Vær på det samme WiFi-netværk"
STR_CALIBRE_INSTRUCTION_3: "3) I Calibre: \"Send til enhed\""
STR_CALIBRE_INSTRUCTION_4: "\"Hold denne skærm åben under afsendelse\""
STR_CAT_DISPLAY: "Skærm"
STR_CAT_READER: "Læser"
STR_CAT_CONTROLS: "Brugerflade"
STR_CAT_SYSTEM: "System"
STR_SLEEP_SCREEN: "Hvile-skærm"
STR_SLEEP_COVER_MODE: "Hvile-skærm omslag-tilstand"
STR_HIDE_BATTERY: "Skjul batteri %"
STR_EXTRA_SPACING: "Ekstra afsnitsafstand"
STR_TEXT_AA: "Tekst Anti-Aliasing"
STR_IMAGES: "Billeder"
STR_IMAGES_DISPLAY: "Vis"
STR_IMAGES_PLACEHOLDER: "Pladsholder"
STR_IMAGES_SUPPRESS: "Skjul"
STR_SHORT_PWR_BTN: "Kort tryk på tænd/sluk-knap"
STR_ORIENTATION: "Læseretning"
STR_SIDE_BTN_LAYOUT: "Knaplayout på siden (læser)"
STR_LONG_PRESS_BEHAVIOR: "Comportamiento al mantener pulsado el botón"
STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivado"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo"
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Cambio de orientación"
STR_FONT_FAMILY: "Læser skrifttype"
STR_FONT_SIZE: "Læser skriftstørrelse"
STR_LINE_SPACING: "Linjeafstand"
STR_SCREEN_MARGIN: "Skærmmargen"
STR_PARA_ALIGNMENT: "Afsnitsjustering"
STR_HYPHENATION: "Orddeling"
STR_TIME_TO_SLEEP: "Tid til hvile"
STR_SHOW_HIDDEN_FILES: "Vis skjulte filer"
STR_REFRESH_FREQ: "Opdateringsfrekvens"
STR_KOREADER_SYNC: "KOReader Sync"
STR_CHECK_UPDATES: "Søg efter opdateringer"
STR_LANGUAGE: "Sprog"
STR_CLEAR_READING_CACHE: "Ryd læsecache"
STR_USERNAME: "Brugernavn"
STR_PASSWORD: "Adgangskode"
STR_SYNC_SERVER_URL: "Synkroniseringsserver-URL"
STR_DOCUMENT_MATCHING: "Dokumentsammenkobling"
STR_AUTHENTICATE: "Godkend"
STR_KOREADER_USERNAME: "KOReader brugernavn"
STR_KOREADER_PASSWORD: "KOReader adgangskode"
STR_FILENAME: "Filnavn"
STR_BINARY: "Binær"
STR_SET_CREDENTIALS_FIRST: "Angiv legitimationsoplysninger først"
STR_WIFI_CONN_FAILED: "WiFi-forbindelsen mislykkedes"
STR_AUTHENTICATING: "Godkender..."
STR_AUTH_SUCCESS: "Godkendt!"
STR_KOREADER_AUTH: "KOReader-godkendelse"
STR_SYNC_READY: "KOReader-synkronisering er klar til brug"
STR_AUTH_FAILED: "Godkendelse mislykkedes"
STR_DONE: "Færdig"
STR_CLEAR_CACHE_WARNING_1: "Dette vil rydde alle cachelagrede bogdata."
STR_CLEAR_CACHE_WARNING_2: "Al læsefremskridt vil gå tabt!"
STR_CLEAR_CACHE_WARNING_3: "Bøger skal indekseres igen"
STR_CLEAR_CACHE_WARNING_4: "når de åbnes igen."
STR_CLEARING_CACHE: "Rydder cache..."
STR_CACHE_CLEARED: "Cache ryddet"
STR_ITEMS_REMOVED: "elementer fjernet"
STR_FAILED_LOWER: "mislykkedes"
STR_CLEAR_CACHE_FAILED: "Kunne ikke rydde cache"
STR_CHECK_SERIAL_OUTPUT: "Tjek serielt output for detaljer"
STR_DARK: "Mørk"
STR_LIGHT: "Lys"
STR_CUSTOM: "Brugerdefineret"
STR_COVER: "Omslag"
STR_NONE_OPT: "Ingen"
STR_FIT: "Tilpas"
STR_CROP: "Beskær"
STR_NEVER: "Aldrig"
STR_IN_READER: "I læseren"
STR_ALWAYS: "Altid"
STR_IGNORE: "Ignorer"
STR_SLEEP: "Hvile"
STR_PAGE_TURN: "Sideskift"
STR_PORTRAIT: "Portræt"
STR_LANDSCAPE_CW: "Liggende med uret"
STR_INVERTED: "Inverteret"
STR_LANDSCAPE_CCW: "Liggende mod uret"
STR_PREV_NEXT: "Forrige/Næste"
STR_NEXT_PREV: "Næste/Forrige"
STR_NOTO_SERIF: "Noto Serif"
STR_NOTO_SANS: "Noto Sans"
STR_OPEN_DYSLEXIC: "Open Dyslexic"
STR_SMALL: "Lille"
STR_MEDIUM: "Mellem"
STR_LARGE: "Stor"
STR_X_LARGE: "Ekstra stor"
STR_TIGHT: "Tæt"
STR_NORMAL: "Normal"
STR_WIDE: "Bred"
STR_JUSTIFY: "Justeret"
STR_ALIGN_LEFT: "Venstre"
STR_CENTER: "Centreret"
STR_ALIGN_RIGHT: "Højre"
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 side"
STR_PAGES_5: "5 sider"
STR_PAGES_10: "10 sider"
STR_PAGES_15: "15 sider"
STR_PAGES_30: "30 sider"
STR_UPDATE: "Opdater"
STR_CHECKING_UPDATE: "Søger efter opdatering..."
STR_NEW_UPDATE: "Ny opdatering tilgængelig!"
STR_CURRENT_VERSION: "Nuværende version: "
STR_NEW_VERSION: "Ny version: "
STR_UPDATING: "Opdaterer..."
STR_NO_UPDATE: "Ingen opdatering tilgængelig"
STR_UPDATE_FAILED: "Opdatering mislykkedes"
STR_UPDATE_COMPLETE: "Opdatering færdig"
STR_POWER_ON_HINT: "Hold tænd/sluk-knappen nede for at tænde igen"
STR_NO_ENTRIES: "Ingen poster fundet"
STR_DOWNLOADING: "Downloader..."
STR_DOWNLOAD_FAILED: "Download mislykkedes"
STR_ERROR_MSG: "Fejl:"
STR_UNNAMED: "Unavngivet"
STR_NO_SERVER_URL: "Ingen server-URL konfigureret"
STR_FETCH_FEED_FAILED: "Kunne ikke hente feed"
STR_PARSE_FEED_FAILED: "Kunne ikke fortolke feed"
STR_NETWORK_PREFIX: "Netværk: "
STR_IP_ADDRESS_PREFIX: "IP-adresse: "
STR_ERROR_GENERAL_FAILURE: "Fejl: Generel fejl"
STR_ERROR_NETWORK_NOT_FOUND: "Fejl: Netværk ikke fundet"
STR_ERROR_CONNECTION_TIMEOUT: "Fejl: Forbindelses timeout"
STR_SD_CARD: "SD-kort"
STR_BACK: "« Tilbage"
STR_EXIT: "« Afslut"
STR_HOME: "« Hjem"
STR_SELECT: "Vælg"
STR_SELECTED: "Valgt"
STR_TOGGLE: "Skift"
STR_CONFIRM: "Bekræft"
STR_CANCEL: "Annuller"
STR_CONNECT: "Forbind"
STR_OPEN: "Åbn"
STR_DOWNLOAD: "Download"
STR_RETRY: "Prøv igen"
STR_YES: "Ja"
STR_NO: "Nej"
STR_SHOW: "Vis"
STR_HIDE: "Skjul"
STR_STATE_ON: "TÆNDT"
STR_STATE_OFF: "SLUKKET"
STR_NOT_SET: "Ikke indstillet"
STR_DIR_LEFT: "Venstre"
STR_DIR_RIGHT: "Højre"
STR_DIR_UP: "Op"
STR_DIR_DOWN: "Ned"
STR_OK_BUTTON: "OK"
STR_SLEEP_COVER_FILTER: "Hvile-skærm omslag-filter"
STR_FILTER_CONTRAST: "Kontrast"
STR_CUSTOMISE_STATUS_BAR: "Tilpas statuslinje"
STR_CHAPTER_PAGE_COUNT: "Kapitelsidetæller"
STR_BOOK_PROGRESS_PERCENTAGE: "Bogfremskridtsprocent"
STR_PROGRESS_BAR: "Fremskridtslinje"
STR_PROGRESS_BAR_THICKNESS: "Fremskridtslinjens tykkelse"
STR_PROGRESS_BAR_THIN: "Tynd"
STR_PROGRESS_BAR_MEDIUM: "Mellem"
STR_PROGRESS_BAR_THICK: "Tyk"
STR_BOOK: "Bog"
STR_CHAPTER: "Kapitel"
STR_EXAMPLE_CHAPTER: "Kapitel 21"
STR_EXAMPLE_BOOK: "Bogtitel"
STR_PREVIEW: "Forhåndsvisning"
STR_TITLE: "Titel"
STR_BATTERY: "Batteri"
STR_UI_THEME: "Brugergrænseflade tema"
STR_THEME_CLASSIC: "Klassisk"
STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Sollysfading-rettelse"
STR_REMAP_FRONT_BUTTONS: "Omtildel frontknapper"
STR_OPDS_BROWSER: "OPDS Browser"
STR_COVER_CUSTOM: "Omslag + Brugerdefineret"
STR_MENU_RECENT_BOOKS: "Seneste bøger"
STR_NO_RECENT_BOOKS: "Ingen seneste bøger"
STR_CALIBRE_DESC: "Brug Calibre trådløs enhedsoverførelse"
STR_FORGET_AND_REMOVE: "Glem netværk og fjern gemt adgangskode?"
STR_FORGET_BUTTON: "Glem"
STR_CALIBRE_STARTING: "Starter Calibre..."
STR_CALIBRE_SETUP: "Opsætning"
STR_CALIBRE_STATUS: "Status"
STR_CLEAR_BUTTON: "Ryd"
STR_DEFAULT_VALUE: "Standard"
STR_REMAP_PROMPT: "Tryk på en frontknap for hver rolle"
STR_UNASSIGNED: "Ikke tildelt"
STR_ALREADY_ASSIGNED: "Allerede tildelt"
STR_REMAP_RESET_HINT: "Sideknap op: Nulstil til standardlayout"
STR_REMAP_CANCEL_HINT: "Sideknap ned: Annuller omtildeling"
STR_HW_BACK_LABEL: "Tilbage (1. knap)"
STR_HW_CONFIRM_LABEL: "Bekræft (2. knap)"
STR_HW_LEFT_LABEL: "Venstre (3. knap)"
STR_HW_RIGHT_LABEL: "Højre (4. knap)"
STR_GO_TO_PERCENT: "Gå til %"
STR_GO_HOME_BUTTON: "Gå til start"
STR_SYNC_PROGRESS: "Synkroniser fremskridt"
STR_DELETE_CACHE: "Slet bogcache"
STR_DELETE: "Slet"
STR_DISPLAY_QR: "Vis side som QR"
STR_CHAPTER_PREFIX: "Kapitel: "
STR_PAGES_SEPARATOR: " sider | "
STR_BOOK_PREFIX: "Bog: "
STR_CALIBRE_URL_HINT: "Tilføj /opds til din URL for Calibre"
STR_PERCENT_STEP_HINT: "Venstre/Højre: 1% Op/Ned: 10%"
STR_SYNCING_TIME: "Synkroniserer tid..."
STR_CALC_HASH: "Beregner dokument-hash..."
STR_HASH_FAILED: "Kunne ikke beregne dokument-hash"
STR_FETCH_PROGRESS: "Henter fjernfremskridt..."
STR_UPLOAD_PROGRESS: "Uploader fremskridt..."
STR_NO_CREDENTIALS_MSG: "Ingen legitimationsoplysninger konfigureret"
STR_KOREADER_SETUP_HINT: "Opsæt KOReader-konto i Indstillinger"
STR_PROGRESS_FOUND: "Fremskridt fundet!"
STR_REMOTE_LABEL: "Ekstern:"
STR_LOCAL_LABEL: "Lokal:"
STR_PAGE_OVERALL_FORMAT: "Side %d, %.2f%% samlet"
STR_PAGE_TOTAL_OVERALL_FORMAT: "Side %d/%d, %.2f%% samlet"
STR_DEVICE_FROM_FORMAT: " Fra: %s"
STR_APPLY_REMOTE: "Anvend fjernfremskridt"
STR_UPLOAD_LOCAL: "Upload lokalt fremskridt"
STR_NO_REMOTE_MSG: "Ingen fjernfremskridt fundet"
STR_UPLOAD_PROMPT: "Upload nuværende position?"
STR_UPLOAD_SUCCESS: "Fremskridt uploadet!"
STR_SYNC_FAILED_MSG: "Synkronisering mislykkedes"
STR_SAVE_PROGRESS_FAILED: "Kunne ikke gemme fremskridt"
STR_SECTION_PREFIX: "Afsnit "
STR_UPLOAD: "Upload"
STR_BOOK_S_STYLE: "Bogens stil"
STR_EMBEDDED_STYLE: "Indlejret stil"
STR_FOCUS_READING: "Fokuslæsning"
STR_OPDS_SERVER_URL: "OPDS Server URL"
STR_FOOTNOTES: "Fodnoter"
STR_NO_FOOTNOTES: "Ingen fodnoter på denne side"
STR_LINK: "[link]"
STR_SCREENSHOT_BUTTON: "Tag skærmbillede"
STR_AUTO_TURN_ENABLED: "Automatisk sidevendning aktiveret: "
STR_AUTO_TURN_PAGES_PER_MIN: "Automatisk vending (sider per minut)"
STR_TILT_PAGE_TURN: "Vip for at vende side"