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

328 lines
17 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: "UK"
_order: "10"
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: "Мережі WiFi"
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: "Підключитися до існуючої мережі WiFi"
STR_HOTSPOT_DESC: "Дозволити іншим підключення по Wi-Fi"
STR_STARTING_HOTSPOT: "Запуск точки доступу..."
STR_HOTSPOT_MODE: "Режим точки доступу"
STR_CONNECT_WIFI_HINT: "Підключіть пристрій до Цієї мережі WiFi"
STR_OPEN_URL_HINT: "Відкрийте посилання у своєму браузері"
STR_OR_HTTP_PREFIX: "або http://"
STR_SCAN_QR_HINT: "або відскануйте QR-код телефоном:"
STR_CALIBRE_WIRELESS: "Отримати з Calibre"
STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Зашифровано | + = Збережено"
STR_MAC_ADDRESS: "MAC адреса:"
STR_CHECKING_WIFI: "Перевірка WiFi..."
STR_ENTER_WIFI_PASSWORD: "Введіть пароль WiFi"
STR_TO_PREFIX: "до "
STR_CALIBRE_RECEIVING: "Отримання: "
STR_CALIBRE_RECEIVED: "Отримано: "
STR_CALIBRE_INSTRUCTION_1: "1) Встановіть плагін CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Перебувайте в тій самій мережі WiFi"
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_IMAGES: "Зображення"
STR_IMAGES_DISPLAY: "Показати"
STR_IMAGES_PLACEHOLDER: "Заглушка"
STR_IMAGES_SUPPRESS: "Приховати"
STR_SHORT_PWR_BTN: "Короткий натиск кн. живл."
STR_ORIENTATION: "Орієнтація читання"
STR_SIDE_BTN_LAYOUT: "Схема бічних кнопок"
STR_LONG_PRESS_BEHAVIOR: "Поведінка при довгому настику"
STR_LONG_PRESS_BEHAVIOR_OFF: "Немає"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Наступ. розділ (утримув.)"
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Зміна орієнтації екрану"
STR_FONT_FAMILY: "Шрифт"
STR_FONT_SIZE: "Розмір шрифту"
STR_LINE_SPACING: "Міжрядковий інтервал"
STR_SCREEN_MARGIN: "Відступи від країв"
STR_PARA_ALIGNMENT: "Вирівнювання тексту"
STR_HYPHENATION: "Перенесення слів"
STR_TIME_TO_SLEEP: "Перехід в режим сну"
STR_SHOW_HIDDEN_FILES: "Показати приховані файли"
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: "Помилка підключення WiFi"
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: "Перевірте послідовний вивід для деталей"
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_FORCE_REFRESH: "Оновити екран"
STR_PORTRAIT: "Книжкова"
STR_LANDSCAPE_CW: "Альбом. за год."
STR_INVERTED: "Перевернутий"
STR_LANDSCAPE_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_NEXT_PAGE: "Наступна с.»"
STR_PREV_PAGE: "« Попередня с."
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_SELECTED: "Вибрано"
STR_TOGGLE: "Обрати"
STR_CONFIRM: "Підтвердити"
STR_CANCEL: "Скасувати"
STR_CONNECT: "Приєдн."
STR_OPEN: "Відкрити"
STR_DOWNLOAD: "Завант."
STR_RETRY: "Повтор."
STR_YES: "Так"
STR_NO: "Ні"
STR_SHOW: "Показати"
STR_HIDE: "Сховати"
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_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_UI_THEME: "Тема інтерфейсу"
STR_THEME_CLASSIC: "Класична"
STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Виправлення вицвітання на сонці"
STR_REMAP_FRONT_BUTTONS: "Налаштувати передні кнопки"
STR_OPDS_BROWSER: "Браузер OPDS"
STR_SEARCH: "Пошук"
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_DELETE: "Видалити"
STR_DISPLAY_QR: "Показати сторінку як QR-код"
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_FOOTNOTES: "Примітки"
STR_NO_FOOTNOTES: "На цій сторінці немає приміток"
STR_LINK: "[посилання]"
STR_SCREENSHOT_BUTTON: "Знімок екрана"
STR_ADD_SERVER: "Додати сервер"
STR_SERVER_NAME: "Назва сервера"
STR_NO_SERVERS: "Не налаштовано жодного сервера OPDS"
STR_DELETE_SERVER: "Видалити сервер"
STR_DELETE_CONFIRM: "Видалити цей сервер?"
STR_OPDS_SERVERS: "Сервери OPDS"
STR_AUTO_TURN_ENABLED: "Автоперегортання увімк: "
STR_AUTO_TURN_PAGES_PER_MIN: "Автоперегортання (ст/хв)"
STR_CRASH_TITLE: "Збій Системи"
STR_CRASH_DESCRIPTION: "Дані про збій збережено в crash_report.txt. Додайте цей файл до вашого звіту про помилку."
STR_CRASH_REASON: "Причина збою:"
STR_CRASH_NO_REASON: "(Причину не вказано)"
STR_TILT_PAGE_TURN: "Перегортання нахилом"
STR_KB_HINT_MOVE_CURSOR: "Натисніть ВЛІВО / ВПРАВО для переміщення курсору"
STR_KB_HINT_RETURN_CURSOR: "Натисніть ВЛІВО для повернення до курсору"
STR_KB_HINT_HIDE_PASSWORD: "Затисніть ВПРАВО, натисніть [***], щоб приховати пароль"
STR_KB_HINT_SHOW_PASSWORD: "Затисніть ВПРАВО, натисніть [abc], щоб показати пароль"
STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Натисніть [***], щоб приховати пароль"
STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Натисніть [abc], щоб показати пароль"
STR_KB_HINT_EDIT_ENTRY: "Затисніть ВГОРУ для редагування"
STR_KB_TIPS: "Поради:"
STR_KB_HINT_RETURN_KEYBOARD: "Натисніть ВНИЗ, щоб повернутися до клавіатури"
STR_KB_HINT_EXIT_URL_MODE: "Натисніть [ABC] для виходу з режиму URL"
STR_KB_HINT_CLEAR_TEXT: "Затисніть <--, щоб видалити весь текст"
STR_KB_HINT_SECONDARY_CHAR: "Затисніть ВИБРАТИ для додаткових символів"
STR_KB_HINT_UPPER_SECONDARY: "Затисніть ВИБРАТИ для ВЕЛИКИХ літер / символів"
STR_KB_HINT_LOWER_SECONDARY: "Затисніть ВИБРАТИ для малих літер / символів"
STR_KB_HINT_URL_SNIPPETS: "Натисніть URL для вибору шаблонів"