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

296 lines
14 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
_language_name: "Беларуская"
_language_code: "BE"
_order: "11"
STR_CROSSPOINT: "CrossPoint"
STR_BOOTING: "Загрузка"
STR_SLEEPING: "Рэжым сну"
STR_ENTERING_SLEEP: "Пераход у сон"
STR_BROWSE_FILES: "Прагляд файлаў"
STR_FILE_TRANSFER: "Перадача файлаў"
STR_SETTINGS_TITLE: "Налады"
STR_CONTINUE_READING: "Працягнуць чытанне"
STR_NO_OPEN_BOOK: "Няма адкрытай кнігі"
STR_START_READING: "Пачніце чытанне ніжэй"
STR_NO_FILES_FOUND: "Файлы не знойдзены"
STR_SELECT_CHAPTER: "Абярыце раздзел"
STR_NO_CHAPTERS: "Раздзелаў няма"
STR_END_OF_BOOK: "Канец кнігі"
STR_EMPTY_CHAPTER: "Пусты раздзел"
STR_INDEXING: "Індэксацыя"
STR_MEMORY_ERROR: "Памылка памяці"
STR_PAGE_LOAD_ERROR: "Памылка загрузкі старонкі"
STR_EMPTY_FILE: "Пусты файл"
STR_OUT_OF_BOUNDS: "Выхад за межы"
STR_LOADING: "Загрузка..."
STR_LOADING_POPUP: "Загрузка"
STR_WIFI_NETWORKS: "Сеткі Wi-Fi"
STR_NO_NETWORKS: "Сеткі не знойдзены"
STR_NETWORKS_FOUND: "Знойдзена сетак: %zu"
STR_SCANNING: "Сканаванне..."
STR_CONNECTING: "Падключэнне..."
STR_CONNECTED: "Падключана!"
STR_CONNECTION_FAILED: "Памылка падключэння"
STR_FORGET_NETWORK: "Забыць сетку?"
STR_SAVE_PASSWORD: "Захаваць пароль?"
STR_PRESS_OK_SCAN: "Націсніце OK для паўторнага пошуку"
STR_JOIN_NETWORK: "Падключыцца да сеткі"
STR_CREATE_HOTSPOT: "Стварыць кропку доступу"
STR_JOIN_DESC: "Падключэнне да існуючай сеткі Wi-Fi"
STR_HOTSPOT_DESC: "Стварыць сетку Wi-Fi для падключэння іншых"
STR_STARTING_HOTSPOT: "Запуск кропкі доступу..."
STR_HOTSPOT_MODE: "Рэжым кропкі доступу"
STR_CONNECT_WIFI_HINT: "Падключыце прыладу да гэтай сеткі Wi-Fi"
STR_OPEN_URL_HINT: "Адкрыйце гэты адрас у браўзеры"
STR_OR_HTTP_PREFIX: "або http://"
STR_SCAN_QR_HINT: "або адсканіруйце QR-код:"
STR_CALIBRE_WIRELESS: "Calibre па Wi-Fi"
STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Абаронена | + = Захавана"
STR_MAC_ADDRESS: "MAC-адрас:"
STR_CHECKING_WIFI: "Праверка Wi-Fi..."
STR_ENTER_WIFI_PASSWORD: "Увядзіце пароль Wi-Fi"
STR_TO_PREFIX: "да "
STR_CALIBRE_RECEIVING: "Атрыманне:"
STR_CALIBRE_RECEIVED: "Атрымана:"
STR_CALIBRE_INSTRUCTION_1: "1) Усталюйце плагін CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Падключыцеся да той жа сеткі Wi-Fi"
STR_CALIBRE_INSTRUCTION_3: "3) У Calibre абярыце: «Адправіць на прыладу»"
STR_CALIBRE_INSTRUCTION_4: "Не закрывайце гэты экран падчас адпраўкі"
STR_CAT_DISPLAY: "Экран"
STR_CAT_READER: "Чытанне"
STR_CAT_CONTROLS: "Кіраванне"
STR_CAT_SYSTEM: "Сістэма"
STR_SLEEP_SCREEN: "Экран сну"
STR_SLEEP_COVER_MODE: "Рэжым вокладкі сну"
STR_HIDE_BATTERY: "Схаваць % батарэі"
STR_EXTRA_SPACING: "Дадат. інтэрвал абзаца"
STR_TEXT_AA: "Згладжванне тэксту"
STR_SHORT_PWR_BTN: "Кароткае націсканне PWR"
STR_ORIENTATION: "Арыентацыя чытання"
STR_SIDE_BTN_LAYOUT: "Бакавыя кнопкі"
STR_LONG_PRESS_SKIP: "Доўгае націсканне - змена раздзела"
STR_FONT_FAMILY: "Шрыфт чытання"
STR_FONT_SIZE: "Памер шрыфту інтэрфейсу"
STR_LINE_SPACING: "Міжрадковы інтэрвал"
STR_SCREEN_MARGIN: "Палі экрана"
STR_PARA_ALIGNMENT: "Выраўноўванне абзаца"
STR_HYPHENATION: "Перанос слоў"
STR_TIME_TO_SLEEP: "Сон праз"
STR_REFRESH_FREQ: "Частата абнаўлення"
STR_KOREADER_SYNC: "Сінхранізацыя KOReader"
STR_CHECK_UPDATES: "Праверыць абнаўленні"
STR_LANGUAGE: "Мова"
STR_CLEAR_READING_CACHE: "Ачысціць кэш чытання"
STR_USERNAME: "Імя карыстальніка"
STR_PASSWORD: "Пароль"
STR_SYNC_SERVER_URL: "URL сервера сінхранізацыі"
STR_DOCUMENT_MATCHING: "Супастаўленне дакументаў"
STR_AUTHENTICATE: "Аўтарызацыя"
STR_KOREADER_USERNAME: "Імя карыстальніка KOReader"
STR_KOREADER_PASSWORD: "Пароль KOReader"
STR_FILENAME: "Імя файла"
STR_BINARY: "Бінарны"
STR_SET_CREDENTIALS_FIRST: "Спачатку ўкажыце даныя"
STR_WIFI_CONN_FAILED: "Не ўдалося падключыцца да Wi-Fi"
STR_AUTHENTICATING: "Аўтарызацыя..."
STR_AUTH_SUCCESS: "Аўтарызацыя паспяховая!"
STR_KOREADER_AUTH: "Аўтарызацыя KOReader"
STR_SYNC_READY: "Сінхранізацыя KOReader гатова"
STR_AUTH_FAILED: "Памылка аўтарызацыі"
STR_DONE: "Гатова"
STR_CLEAR_CACHE_WARNING_1: "Будуць выдалены ўсе даныя кэша кніг."
STR_CLEAR_CACHE_WARNING_2: "Увесь прагрэс чытання будзе згублены!"
STR_CLEAR_CACHE_WARNING_3: "Кнігі спатрэбіцца пераіндэксаваць"
STR_CLEAR_CACHE_WARNING_4: "пры паўторным адкрыцці."
STR_CLEARING_CACHE: "Ачыстка кэша..."
STR_CACHE_CLEARED: "Кэш ачышчаны"
STR_ITEMS_REMOVED: "элементаў выдалена"
STR_FAILED_LOWER: "памылка"
STR_CLEAR_CACHE_FAILED: "Не ўдалося ачысціць кэш"
STR_CHECK_SERIAL_OUTPUT: "Праверце вывад па UART для дэталяў"
STR_DARK: "Цёмны"
STR_LIGHT: "Светлы"
STR_CUSTOM: "Свой"
STR_COVER: "Вокладка"
STR_NONE_OPT: "Няма"
STR_FIT: "Упісаць"
STR_CROP: "Абрэзаць"
STR_NEVER: "Ніколі"
STR_IN_READER: "У рэжыме чытання"
STR_ALWAYS: "Заўсёды"
STR_IGNORE: "Ігнараваць"
STR_SLEEP: "Сон"
STR_PAGE_TURN: "Перагортванне"
STR_PORTRAIT: "Партрэт"
STR_LANDSCAPE_CW: "Ландшафт (CW)"
STR_INVERTED: "Інверсія"
STR_LANDSCAPE_CCW: "Ландшафт (CCW)"
STR_PREV_NEXT: "Назад/Наперад"
STR_NEXT_PREV: "Наперад/Назад"
STR_NOTO_SERIF: "Noto Serif"
STR_NOTO_SANS: "Noto Sans"
STR_OPEN_DYSLEXIC: "Open Dyslexic"
STR_SMALL: "Маленькі"
STR_MEDIUM: "Сярэдні"
STR_LARGE: "Вялікі"
STR_X_LARGE: "Вельмі вялікі"
STR_TIGHT: "Вузкі"
STR_NORMAL: "Звычайны"
STR_WIDE: "Шырокі"
STR_JUSTIFY: "Па шырыні"
STR_ALIGN_LEFT: "Па левым краі"
STR_CENTER: "Па цэнтры"
STR_ALIGN_RIGHT: "Па правым краі"
STR_MIN_1: "1 хв"
STR_MIN_5: "5 хв"
STR_MIN_10: "10 хв"
STR_MIN_15: "15 хв"
STR_MIN_30: "30 хв"
STR_PAGES_1: "1 стар."
STR_PAGES_5: "5 стар."
STR_PAGES_10: "10 стар."
STR_PAGES_15: "15 стар."
STR_PAGES_30: "30 стар."
STR_UPDATE: "Абнаўленне"
STR_CHECKING_UPDATE: "Праверка абнаўленняў..."
STR_NEW_UPDATE: "Даступна новае абнаўленне!"
STR_CURRENT_VERSION: "Бягучая версія:"
STR_NEW_VERSION: "Новая версія:"
STR_UPDATING: "Абнаўленне..."
STR_NO_UPDATE: "Абнаўленняў няма"
STR_UPDATE_FAILED: "Памылка абнаўлення"
STR_UPDATE_COMPLETE: "Абнаўленне завершана"
STR_POWER_ON_HINT: "Утрымлівайце кнопку сілкавання для ўключэння"
STR_NO_ENTRIES: "Запісы не знойдзены"
STR_DOWNLOADING: "Спампоўка..."
STR_DOWNLOAD_FAILED: "Памылка спампоўкі"
STR_ERROR_MSG: "Памылка:"
STR_UNNAMED: "Без імя"
STR_NO_SERVER_URL: "URL сервера не наладжаны"
STR_FETCH_FEED_FAILED: "Не ўдалося атрымаць стужку"
STR_PARSE_FEED_FAILED: "Не ўдалося апрацаваць стужку"
STR_NETWORK_PREFIX: "Сетка:"
STR_IP_ADDRESS_PREFIX: "IP-адрас:"
STR_ERROR_GENERAL_FAILURE: "Памылка: Агульная памылка"
STR_ERROR_NETWORK_NOT_FOUND: "Памылка: Сетка не знойдзена"
STR_ERROR_CONNECTION_TIMEOUT: "Памылка: Тайм-аўт злучэння"
STR_SD_CARD: "SD-карта"
STR_BACK: "« Назад"
STR_EXIT: "« Выхад"
STR_HOME: "« Галоўная"
STR_SELECT: "Абраць"
STR_TOGGLE: "Выбар"
STR_CONFIRM: "Пацв."
STR_CANCEL: "Адмена"
STR_CONNECT: "Падкл."
STR_OPEN: "Адкрыць"
STR_DOWNLOAD: "Спампаваць"
STR_RETRY: "Паўтарыць"
STR_YES: "Так"
STR_NO: "Не"
STR_STATE_ON: "УКЛ"
STR_STATE_OFF: "ВЫКЛ"
STR_NOT_SET: "Не ўстаноўлена"
STR_DIR_LEFT: "Улева"
STR_DIR_RIGHT: "Управа"
STR_DIR_UP: "Уверх"
STR_DIR_DOWN: "Уніз"
STR_OK_BUTTON: "OK"
STR_SLEEP_COVER_FILTER: "Фільтр экрана сну"
STR_FILTER_CONTRAST: "Кантраст"
STR_UI_THEME: "Тэма інтэрфейсу"
STR_THEME_CLASSIC: "Класічная"
STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Кампенсацыя выцвітання"
STR_REMAP_FRONT_BUTTONS: "Пераназначыць пярэднія кнопкі"
STR_OPDS_BROWSER: "OPDS браўзер"
STR_COVER_CUSTOM: "Вокладка + Свой"
STR_MENU_RECENT_BOOKS: "Нядаўнія кнігі"
STR_NO_RECENT_BOOKS: "Няма нядаўніх кніг"
STR_CALIBRE_DESC: "Выкарыстоўваць бесправадную перадачу Calibre"
STR_FORGET_AND_REMOVE: "Забыць сетку і выдаліць захаваны пароль?"
STR_FORGET_BUTTON: "Забыць"
STR_CALIBRE_STARTING: "Запуск Calibre..."
STR_CALIBRE_SETUP: "Наладка"
STR_CALIBRE_STATUS: "Статус"
STR_CLEAR_BUTTON: "Ачысціць"
STR_DEFAULT_VALUE: "Па змаўчанні"
STR_REMAP_PROMPT: "Прызначце ролю для кожнай кнопкі"
STR_UNASSIGNED: "Не прызначана"
STR_ALREADY_ASSIGNED: "Ужо прызначана"
STR_REMAP_RESET_HINT: "Бакавая кнопка ўверх: скінуць па змаўчанні"
STR_REMAP_CANCEL_HINT: "Бакавая кнопка ўніз: адмяніць пераназначэнне"
STR_HW_BACK_LABEL: "Назад (1-я кнопка)"
STR_HW_CONFIRM_LABEL: "Пацвердзіць (2-я кнопка)"
STR_HW_LEFT_LABEL: "Улева (3-я кнопка)"
STR_HW_RIGHT_LABEL: "Управа (4-я кнопка)"
STR_GO_TO_PERCENT: "Перайсці да %"
STR_GO_HOME_BUTTON: "На галоўную"
STR_SYNC_PROGRESS: "Сінхранізаваць прагрэс"
STR_DELETE_CACHE: "Выдаліць кэш кнігі"
STR_CHAPTER_PREFIX: "Раздзел:"
STR_PAGES_SEPARATOR: "стар. |"
STR_BOOK_PREFIX: "Кніга:"
STR_CALIBRE_URL_HINT: "Для Calibre дадайце /opds да URL"
STR_PERCENT_STEP_HINT: "Улева/Управа: 1% Уверх/Уніз: 10%"
STR_SYNCING_TIME: "Сінхранізацыя часу..."
STR_CALC_HASH: "Вылічэнне хэша дакумента..."
STR_HASH_FAILED: "Не ўдалося вылічыць хэш дакумента"
STR_FETCH_PROGRESS: "Атрыманне аддаленага прагрэсу..."
STR_UPLOAD_PROGRESS: "Адпраўка прагрэсу..."
STR_NO_CREDENTIALS_MSG: "Даныя для ўваходу не наладжаны"
STR_KOREADER_SETUP_HINT: "Наладзьце ўліковы запіс KOReader у наладах"
STR_PROGRESS_FOUND: "Прагрэс знойдзены!"
STR_REMOTE_LABEL: "Аддалены:"
STR_LOCAL_LABEL: "Лакальны:"
STR_PAGE_OVERALL_FORMAT: "Старонка %d, %.2f%% усяго"
STR_PAGE_TOTAL_OVERALL_FORMAT: "Старонка %d/%d, %.2f%% усяго"
STR_DEVICE_FROM_FORMAT: "Ад: %s"
STR_APPLY_REMOTE: "Прымяніць аддалены прагрэс"
STR_UPLOAD_LOCAL: "Адправіць лакальны прагрэс"
STR_NO_REMOTE_MSG: "Аддалены прагрэс не знойдзены"
STR_UPLOAD_PROMPT: "Адправіць бягучую пазіцыю?"
STR_UPLOAD_SUCCESS: "Прагрэс адпраўлены!"
STR_SYNC_FAILED_MSG: "Памылка сінхранізацыі"
STR_SAVE_PROGRESS_FAILED: "Не ўдалося захаваць прагрэс"
STR_SECTION_PREFIX: "Раздзел"
STR_UPLOAD: "Адправіць"
STR_BOOK_S_STYLE: "Стыль кнігі"
STR_EMBEDDED_STYLE: "Убудаваны стыль"
STR_FOCUS_READING: "Фокуснае чытанне"
STR_OPDS_SERVER_URL: "URL OPDS сервера"
STR_SCREENSHOT_BUTTON: "Зрабіць здымак экрана"
STR_IMAGES: "Выявы"
STR_IMAGES_DISPLAY: "Паказваць"
STR_IMAGES_PLACEHOLDER: "Запаўняльнік"
STR_IMAGES_SUPPRESS: "Хаваць"
STR_SHOW_HIDDEN_FILES: "Паказваць схаваныя файлы"
STR_SELECTED: "Выбрана"
STR_SHOW: "Паказаць"
STR_HIDE: "Схаваць"
STR_CUSTOMISE_STATUS_BAR: "Наладзіць радок стану"
STR_CHAPTER_PAGE_COUNT: "Колькасць старонак раздзела"
STR_BOOK_PROGRESS_PERCENTAGE: "Працэнт прагрэсу кнігі"
STR_PROGRESS_BAR: "Паласа прагрэсу"
STR_PROGRESS_BAR_THICKNESS: "Таўшчыня паласы прагрэсу"
STR_PROGRESS_BAR_THIN: "Тонкая"
STR_PROGRESS_BAR_MEDIUM: "Сярэдняя"
STR_PROGRESS_BAR_THICK: "Тоўстая"
STR_BOOK: "Кніга"
STR_CHAPTER: "Раздзел"
STR_EXAMPLE_CHAPTER: "Раздзел 21"
STR_EXAMPLE_BOOK: "Назва кнігі"
STR_PREVIEW: "Перадпрагляд"
STR_TITLE: "Назва"
STR_BATTERY: "Батарэя"
STR_DELETE: "Выдаліць"
STR_DISPLAY_QR: "Паказаць старонку як QR"
STR_FOOTNOTES: "Зноскі"
STR_NO_FOOTNOTES: "На гэтай старонцы няма зносак"
STR_LINK: "[спасылка]"
STR_AUTO_TURN_ENABLED: "Аўтаперагортванне: "
STR_AUTO_TURN_PAGES_PER_MIN: "Аўтаперагортванне (старонак за хвіліну)"
STR_TILT_PAGE_TURN: "Перагортванне нахілам"