Files
Crosspoint/lib/I18n/translations/belarusian.yaml
T
Wylan SwetsandClaude Sonnet 4.6 e64155ed63 fix: free Epub RAM and simplify KOSync navigation via ActivityManager (#1860)
## Summary

* **What is the goal of this PR?** Fix KOSync failing with "Network
error" on large/complex EPUBs, and simplify the sync navigation flow by
removing the callback/result pattern.

* **What changes are included?**

This PR combines the approaches from #1855 and #1760 into a single,
cleaner solution:

  **Memory fix (from #1855):**
- `EpubReaderActivity` pre-computes the local KOReader position and
chapter name, then explicitly releases `epub` and `section` before
launching `KOReaderSyncActivity`. This frees ~65KB measured on device,
giving the TLS handshake sufficient heap. The root cause was
`MBEDTLS_ERR_X509_ALLOC_FAILED` (-0x2880) when a 3-cert chain consumed
~48KB during the handshake with only ~50KB available.
- `KOReaderSyncActivity` no longer receives a `shared_ptr<Epub>` at
construction — it lazy-loads the Epub after TLS only if remote progress
is found (`ensureEpubLoaded()`).
- Added `MIN_HEAP_FOR_TLS = 55000` guard in `KOReaderSyncClient` —
returns `LOW_MEMORY` early if aggregate free heap is too low before
attempting a TLS connection.

  **Navigation simplification (from #1760):**
- Replaced `startActivityForResult` + callback with
`activityManager.replaceActivity` / `activityManager.goToReader`.
Progress is saved to `progress.bin` before the epub is released
(cancel/upload paths) and in `saveProgressAndReturn` (apply remote
path). The reader re-launches from the saved position naturally via
`goToReader`, eliminating the need to reload the epub in a callback.
- Extracted `ReaderUtils::saveProgress()` as a shared helper used by
both `EpubReaderActivity` and `KOReaderSyncActivity`.
- Added `STR_SAVE_PROGRESS_FAILED` to all 22 language files for the case
where writing the synced position to SD fails.

  **Orientation fix (found during device testing):**
- `EpubReaderActivity::onExit()` resets the renderer to portrait before
destruction. With `replaceActivity` the reader is fully torn down before
KOSync starts, so KOSync was always rendering in portrait even when
reading in landscape. Fixed by calling `ReaderUtils::applyOrientation`
in `KOReaderSyncActivity::onEnter()`.

## Additional Context

Heap measurements on device (large EPUB with complex CSS):

| Metric | Before | After |
|---|---|---|
| Heap before Epub release | 88,156 bytes | — |
| Heap after Epub release | — | 153,892 bytes (+65,736) |
| Heap at TLS handshake | ~50,000 bytes (fails) | ~116,384 bytes
(passes) |
| Min-free-ever during sync session | 2,600 bytes | 33,052 bytes |
| TLS result | `MBEDTLS_ERR_X509_ALLOC_FAILED` | HTTP 200 |

Tested on device: sync from inside a large EPUB in both portrait and
landscape, cancel, apply remote progress, upload local progress.

---

### AI Usage

Did you use AI tools to help write this code? _**YES**_

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 22:01:31 -05:00

295 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_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: "Перагортванне нахілам"