## Summary This PR enhances the EPUB reader's bookmark system with two complementary improvements: a per-page bookmark indicator icon and toggle behavior on the existing long-press action. --- ### What Changed **Bookmark Toggle (was: add-only)** The long-press Confirm action now toggles bookmarks rather than always adding. `addBookmark()` checks whether a bookmark with the same xpath already exists in the in-memory cache: - If found → removes it and shows "Bookmark removed." - If not found → adds it and shows "Bookmark added." A new `STR_BOOKMARK_REMOVED` translation string was added to support the removal message. **Bookmark Icon Indicator** A `BookmarkIcon` is now drawn at the top-right corner of the page whenever the current page has a bookmark. `updateBookmarkFlag()` is called at render time to determine whether the current page is bookmarked. **In-Memory Bookmark Cache** Bookmarks are now loaded into `cachedBookmarks` on `onEnter()` rather than being re-read from disk on every toggle. All subsequent add/remove operations work against this cache and flush to disk, avoiding redundant file reads on each bookmark action. **Faster bookmarks list** Previously, calculating "page X/Y" for each entry required decompressing the entire spine item. We now persist `si`/`pc`/`pp` (spine index, page count, and page progress) in the bookmark JSON when saving, and restore them when loading. This avoids the expensive `toCrossPoint()` loop in `onEnter()`, significantly reducing the cost of initializing the bookmarks list. --- ### Files Changed - `EpubReaderActivity.cpp` — `addBookmark()` toggle logic, `updateBookmarkFlag()` (new), icon rendering in `renderContents()`, cache initialization in `onEnter()` - `EpubReaderActivity.h` — new fields: `currentPageBookmarked`, `bookmarkRemoved`, `cachedBookmarks`; new method declaration `updateBookmarkFlag()` --- ### 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? _**< PARTIALLY >**_ --------- Co-authored-by: Julia Nguyen <julia@uxj.io>
275 lines
10 KiB
YAML
275 lines
10 KiB
YAML
_language_name: "Suomi"
|
|
_language_code: "FI"
|
|
_order: "14"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "KÄYNNISTYY"
|
|
STR_SLEEPING: "LEPOTILA"
|
|
STR_ENTERING_SLEEP: "Siirrytään lepotilaan"
|
|
STR_BROWSE_FILES: "Selaa tiedostoja"
|
|
STR_FILE_TRANSFER: "Tiedostonsiirto"
|
|
STR_SETTINGS_TITLE: "Asetukset"
|
|
STR_CONTINUE_READING: "Jatka lukemista"
|
|
STR_NO_OPEN_BOOK: "Kirjaa ei valittu"
|
|
STR_START_READING: "Aloita lukeminen"
|
|
STR_NO_FILES_FOUND: "Ei tiedostoja löytynyt"
|
|
STR_SELECT_CHAPTER: "Valitse luku"
|
|
STR_NO_CHAPTERS: "Ei lukuja"
|
|
STR_END_OF_BOOK: "Kirjan loppu"
|
|
STR_EMPTY_CHAPTER: "Tyhjä luku"
|
|
STR_INDEXING: "Indeksoidaan"
|
|
STR_MEMORY_ERROR: "Muistivirhe"
|
|
STR_PAGE_LOAD_ERROR: "Sivun latausvirhe"
|
|
STR_EMPTY_FILE: "Tyhjä tiedosto"
|
|
STR_OUT_OF_BOUNDS: "Alueen ulkopuolella"
|
|
STR_LOADING: "Ladataan..."
|
|
STR_LOADING_POPUP: "Ladataan"
|
|
STR_WIFI_NETWORKS: "Wi-Fi-verkot"
|
|
STR_NO_NETWORKS: "Verkkoja ei löytynyt"
|
|
STR_NETWORKS_FOUND: "%zu verkkoa löydetty"
|
|
STR_SCANNING: "Etsitään..."
|
|
STR_CONNECTING: "Yhdistetään..."
|
|
STR_CONNECTED: "Yhdistetty!"
|
|
STR_CONNECTION_FAILED: "Yhteys epäonnistui"
|
|
STR_FORGET_NETWORK: "Unohda verkko?"
|
|
STR_SAVE_PASSWORD: "Tallenna salasana seuraavaa kertaa varten?"
|
|
STR_PRESS_OK_SCAN: "Paina OK etsiäksesi uudelleen"
|
|
STR_JOIN_NETWORK: "Liity verkkoon"
|
|
STR_CREATE_HOTSPOT: "Luo yhteyspiste"
|
|
STR_JOIN_DESC: "Yhdistä olemassa olevaan Wi-Fi-verkkoon"
|
|
STR_HOTSPOT_DESC: "Luo Wi-Fi-verkko, johon muut voivat liittyä"
|
|
STR_STARTING_HOTSPOT: "Käynnistetään yhteyspiste..."
|
|
STR_HOTSPOT_MODE: "Yhteyspistetila"
|
|
STR_CONNECT_WIFI_HINT: "Yhdistä laitteesi tähän Wi-Fi-verkkoon"
|
|
STR_OPEN_URL_HINT: "Avaa tämä osoite selaimessasi"
|
|
STR_OR_HTTP_PREFIX: "tai http://"
|
|
STR_SCAN_QR_HINT: "tai skannaa QR-koodi puhelimellasi:"
|
|
STR_CALIBRE_WIRELESS: "Calibre langaton"
|
|
STR_NETWORK_LEGEND: "* = Salattu | + = Tallennettu"
|
|
STR_MAC_ADDRESS: "MAC-osoite:"
|
|
STR_CHECKING_WIFI: "Tarkistetaan Wi-Fi..."
|
|
STR_ENTER_WIFI_PASSWORD: "Syötä Wi-Fi-salasana"
|
|
STR_TO_PREFIX: "verkkoon "
|
|
STR_CALIBRE_RECEIVING: "Vastaanotetaan: "
|
|
STR_CALIBRE_RECEIVED: "Vastaanotettu: "
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Asenna CrossPoint Reader -lisäosa"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Ole samassa Wi-Fi-verkossa"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) Calibressa: \"Lähetä laitteelle\""
|
|
STR_CALIBRE_INSTRUCTION_4: "\"Pidä tämä näyttö auki lähetyksen aikana\""
|
|
STR_CAT_DISPLAY: "Näyttö"
|
|
STR_CAT_READER: "Lukija"
|
|
STR_CAT_CONTROLS: "Ohjaimet"
|
|
STR_CAT_SYSTEM: "Järjestelmä"
|
|
STR_SLEEP_SCREEN: "Lepotilanäyttö"
|
|
STR_SLEEP_COVER_MODE: "Lepotilanäytön kansitila"
|
|
STR_HIDE_BATTERY: "Piilota akun %"
|
|
STR_EXTRA_SPACING: "Kappaleiden lisäväli"
|
|
STR_TEXT_AA: "Tekstin reunanpehmennys"
|
|
STR_SHORT_PWR_BTN: "Lyhyt virtapainikkeen painallus"
|
|
STR_ORIENTATION: "Lukusuunta"
|
|
STR_SIDE_BTN_LAYOUT: "Sivupainikkeiden asettelu (lukija)"
|
|
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Suuntaa etupainikkeet"
|
|
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_PREVIEW_TEXT: "Törkylempijävongahdus"
|
|
STR_FONT_FAMILY: "Lukijan fonttiperhe"
|
|
STR_FONT_SIZE: "Käyttöliittymän fonttikoko"
|
|
STR_LINE_SPACING: "Lukijan riviväli"
|
|
STR_SCREEN_MARGIN: "Lukijan näyttömarginaali"
|
|
STR_PARA_ALIGNMENT: "Lukijan kappaletasaus"
|
|
STR_HYPHENATION: "Tavutus"
|
|
STR_TIME_TO_SLEEP: "Aika lepotilaan"
|
|
STR_REMOVE_READ_FROM_RECENTS: "Tyhjennä luetut kirjat viimeisimpien listalta"
|
|
STR_MOVE_FINISHED_TO_READ: "Siirrä luetut kirjat Read-kansioon"
|
|
STR_REFRESH_FREQ: "Päivitystaajuus"
|
|
STR_KOREADER_SYNC: "KOReader-synkronointi"
|
|
STR_CHECK_UPDATES: "Tarkista päivitykset"
|
|
STR_LANGUAGE: "Kieli"
|
|
STR_CLEAR_READING_CACHE: "Tyhjennä lukuvälimuisti"
|
|
STR_USERNAME: "Käyttäjänimi"
|
|
STR_PASSWORD: "Salasana"
|
|
STR_SYNC_SERVER_URL: "Synkronointipalvelimen osoite"
|
|
STR_DOCUMENT_MATCHING: "Dokumenttien tunnistus"
|
|
STR_AUTHENTICATE: "Tunnistaudu"
|
|
STR_KOREADER_USERNAME: "KOReader-käyttäjänimi"
|
|
STR_KOREADER_PASSWORD: "KOReader-salasana"
|
|
STR_FILENAME: "Tiedostonimi"
|
|
STR_BINARY: "Binääri"
|
|
STR_SET_CREDENTIALS_FIRST: "Aseta tunnukset ensin"
|
|
STR_WIFI_CONN_FAILED: "Wi-Fi-yhteys epäonnistui"
|
|
STR_AUTHENTICATING: "Tunnistaudutaan..."
|
|
STR_AUTH_SUCCESS: "Tunnistautuminen onnistui!"
|
|
STR_KOREADER_AUTH: "KOReader-tunnistautuminen"
|
|
STR_SYNC_READY: "KOReader-synkronointi on käyttövalmis"
|
|
STR_AUTH_FAILED: "Tunnistautuminen epäonnistui"
|
|
STR_DONE: "Valmis"
|
|
STR_CLEAR_CACHE_WARNING_1: "Tämä tyhjentää kaiken välimuistiin tallennetun kirjatiedon."
|
|
STR_CLEAR_CACHE_WARNING_2: "Kaikki lukuedistyminen menetetään!"
|
|
STR_CLEAR_CACHE_WARNING_3: "Kirjat täytyy indeksoida uudelleen"
|
|
STR_CLEAR_CACHE_WARNING_4: "kun ne avataan seuraavan kerran."
|
|
STR_CLEARING_CACHE: "Tyhjennetään välimuistia..."
|
|
STR_CACHE_CLEARED: "Välimuisti tyhjennetty"
|
|
STR_ITEMS_REMOVED: "kohdetta poistettu"
|
|
STR_FAILED_LOWER: "epäonnistui"
|
|
STR_CLEAR_CACHE_FAILED: "Välimuistin tyhjennys epäonnistui"
|
|
STR_CHECK_SERIAL_OUTPUT: "Tarkista sarjatuloste lisätiedoista"
|
|
STR_DARK: "Tumma"
|
|
STR_LIGHT: "Vaalea"
|
|
STR_CUSTOM: "Mukautettu"
|
|
STR_COVER: "Kansi"
|
|
STR_NONE_OPT: "Ei mitään"
|
|
STR_FIT: "Sovita"
|
|
STR_CROP: "Rajaa"
|
|
STR_NEVER: "Ei koskaan"
|
|
STR_IN_READER: "Lukijassa"
|
|
STR_ALWAYS: "Aina"
|
|
STR_IGNORE: "Ohita"
|
|
STR_SLEEP: "Lepotila"
|
|
STR_PAGE_TURN: "Sivunkääntö"
|
|
STR_PORTRAIT: "Pysty"
|
|
STR_LANDSCAPE_CW: "Vaaka myötäpäivään"
|
|
STR_INVERTED: "Käännetty"
|
|
STR_LANDSCAPE_CCW: "Vaaka vastapäivään"
|
|
STR_PREV_NEXT: "Edell/Seur"
|
|
STR_NEXT_PREV: "Seur/Edell"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_SMALL: "Pieni"
|
|
STR_MEDIUM: "Keskikokoinen"
|
|
STR_LARGE: "Suuri"
|
|
STR_X_LARGE: "Erittäin suuri"
|
|
STR_TIGHT: "Tiukka"
|
|
STR_NORMAL: "Normaali"
|
|
STR_WIDE: "Leveä"
|
|
STR_JUSTIFY: "Tasaa"
|
|
STR_ALIGN_LEFT: "Vasen"
|
|
STR_CENTER: "Keskitetty"
|
|
STR_ALIGN_RIGHT: "Oikea"
|
|
STR_PAGES_1: "1 sivu"
|
|
STR_PAGES_5: "5 sivua"
|
|
STR_PAGES_10: "10 sivua"
|
|
STR_PAGES_15: "15 sivua"
|
|
STR_PAGES_30: "30 sivua"
|
|
STR_UPDATE: "Päivitä"
|
|
STR_CHECKING_UPDATE: "Tarkistetaan päivitystä..."
|
|
STR_NEW_UPDATE: "Uusi päivitys saatavilla!"
|
|
STR_CURRENT_VERSION: "Nykyinen versio: "
|
|
STR_NEW_VERSION: "Uusi versio: "
|
|
STR_UPDATING: "Päivitetään..."
|
|
STR_NO_UPDATE: "Ei päivitystä saatavilla"
|
|
STR_UPDATE_FAILED: "Päivitys epäonnistui"
|
|
STR_UPDATE_COMPLETE: "Päivitys valmis"
|
|
STR_POWER_ON_HINT: "Pidä virtapainiketta pohjassa käynnistääksesi"
|
|
STR_NO_ENTRIES: "Merkintöjä ei löytynyt"
|
|
STR_DOWNLOADING: "Ladataan..."
|
|
STR_DOWNLOAD_FAILED: "Lataus epäonnistui"
|
|
STR_ERROR_MSG: "Virhe:"
|
|
STR_UNNAMED: "Nimetön"
|
|
STR_NO_SERVER_URL: "Palvelinosoitetta ei ole määritetty"
|
|
STR_FETCH_FEED_FAILED: "Syötteen haku epäonnistui"
|
|
STR_PARSE_FEED_FAILED: "Syötteen käsittely epäonnistui"
|
|
STR_NETWORK_PREFIX: "Verkko: "
|
|
STR_IP_ADDRESS_PREFIX: "IP-osoite: "
|
|
STR_ERROR_GENERAL_FAILURE: "Virhe: Yleinen virhe"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Virhe: Verkkoa ei löytynyt"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Virhe: Yhteys aikakatkaistiin"
|
|
STR_SD_CARD: "SD-kortti"
|
|
STR_BACK: "« Takaisin"
|
|
STR_EXIT: "« Poistu"
|
|
STR_HOME: "« Koti"
|
|
STR_SELECT: "Valitse"
|
|
STR_TOGGLE: "Vaihda"
|
|
STR_TOGGLE_BOOKMARK: "Vaihda kirjanmerkki"
|
|
STR_BOOKMARK_REMOVED: "Kirjanmerkki poistettu."
|
|
STR_HOLD_OPEN_TO_DELETE: "Pidä Avaa painettuna poistaaksesi"
|
|
STR_CONFIRM: "Vahvista"
|
|
STR_CANCEL: "Peruuta"
|
|
STR_CONNECT: "Yhdistä"
|
|
STR_OPEN: "Avaa"
|
|
STR_DOWNLOAD: "Lataa"
|
|
STR_RETRY: "Yritä uudelleen"
|
|
STR_YES: "Kyllä"
|
|
STR_NO: "Ei"
|
|
STR_STATE_ON: "PÄÄLLÄ"
|
|
STR_STATE_OFF: "POIS"
|
|
STR_NOT_SET: "Ei asetettu"
|
|
STR_DIR_LEFT: "Vasen"
|
|
STR_DIR_RIGHT: "Oikea"
|
|
STR_DIR_UP: "Ylös"
|
|
STR_DIR_DOWN: "Alas"
|
|
STR_OK_BUTTON: "OK"
|
|
STR_SLEEP_COVER_FILTER: "Lepotilanäytön kansisuodatin"
|
|
STR_FILTER_CONTRAST: "Kontrasti"
|
|
STR_UI_THEME: "Käyttöliittymäteema"
|
|
STR_THEME_CLASSIC: "Klassinen"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
|
|
STR_SUNLIGHT_FADING_FIX: "Auringonvalon haalistumiskorjaus"
|
|
STR_QUICK_RESUME_TIMEOUT: "Pikajatko aikakatkaisulla"
|
|
STR_REMAP_FRONT_BUTTONS: "Uudelleenmääritä etupainikkeet"
|
|
STR_OPDS_BROWSER: "OPDS-selain"
|
|
STR_COVER_CUSTOM: "Kansi + mukautettu"
|
|
STR_QUICK_RESUME: "Pikajatko"
|
|
STR_MENU_RECENT_BOOKS: "Viimeisimmät kirjat"
|
|
STR_REMOVE_FROM_RECENTS: "Poista viimeisimmistä kirjoista?"
|
|
STR_NO_RECENT_BOOKS: "Ei viimeisimpiä kirjoja"
|
|
STR_CALIBRE_DESC: "Käytä Calibren langatonta laiteyhteyttä"
|
|
STR_FORGET_AND_REMOVE: "Unohda verkko ja poista tallennettu salasana?"
|
|
STR_FORGET_BUTTON: "Unohda"
|
|
STR_CALIBRE_STARTING: "Käynnistetään Calibrea..."
|
|
STR_CALIBRE_SETUP: "Asetukset"
|
|
STR_CALIBRE_STATUS: "Tila"
|
|
STR_CLEAR_BUTTON: "Tyhjennä"
|
|
STR_DEFAULT_VALUE: "Oletus"
|
|
STR_REMAP_PROMPT: "Paina etupainiketta kullekin toiminnolle"
|
|
STR_UNASSIGNED: "Ei määritetty"
|
|
STR_ALREADY_ASSIGNED: "Jo määritetty"
|
|
STR_REMAP_RESET_HINT: "Sivupainike ylös: Palauta oletusasettelu"
|
|
STR_REMAP_CANCEL_HINT: "Sivupainike alas: Peruuta uudelleenmääritys"
|
|
STR_HW_BACK_LABEL: "Takaisin (1. painike)"
|
|
STR_HW_CONFIRM_LABEL: "Vahvista (2. painike)"
|
|
STR_HW_LEFT_LABEL: "Vasen (3. painike)"
|
|
STR_HW_RIGHT_LABEL: "Oikea (4. painike)"
|
|
STR_GO_TO_PERCENT: "Siirry kohtaan %"
|
|
STR_GO_HOME_BUTTON: "Siirry kotiin"
|
|
STR_SYNC_PROGRESS: "Synkronoi edistyminen"
|
|
STR_DELETE_CACHE: "Poista kirjan välimuisti"
|
|
STR_CHAPTER_PREFIX: "Luku: "
|
|
STR_PAGES_SEPARATOR: " sivua | "
|
|
STR_BOOK_PREFIX: "Kirja: "
|
|
STR_CALIBRE_URL_HINT: "Calibrelle lisää /opds osoitteeseen"
|
|
STR_PERCENT_STEP_HINT: "Vasen/Oikea: 1% Ylös/Alas: 10%"
|
|
STR_SYNCING_TIME: "Synkronoidaan aikaa..."
|
|
STR_CALC_HASH: "Lasketaan dokumentin tarkistussummaa..."
|
|
STR_HASH_FAILED: "Dokumentin tiivisteen laskenta epäonnistui"
|
|
STR_FETCH_PROGRESS: "Haetaan etäedistymistä..."
|
|
STR_UPLOAD_PROGRESS: "Lähetetään lukuedistymistä..."
|
|
STR_NO_CREDENTIALS_MSG: "Tunnuksia ei ole määritetty"
|
|
STR_KOREADER_SETUP_HINT: "Määritä KOReader-tili asetuksissa"
|
|
STR_PROGRESS_FOUND: "Edistyminen löytyi!"
|
|
STR_REMOTE_LABEL: "Etä:"
|
|
STR_LOCAL_LABEL: "Paikallinen:"
|
|
STR_PAGE_OVERALL_FORMAT: "Sivu %d, %.2f%% kokonaisuudesta"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "Sivu %d/%d, %.2f%% kokonaisuudesta"
|
|
STR_DEVICE_FROM_FORMAT: " Lähde: %s"
|
|
STR_APPLY_REMOTE: "Käytä etäedistymistä"
|
|
STR_UPLOAD_LOCAL: "Lähetä paikallinen edistyminen"
|
|
STR_NO_REMOTE_MSG: "Etäedistymistä ei löytynyt"
|
|
STR_UPLOAD_PROMPT: "Lähetä nykyinen sijainti?"
|
|
STR_UPLOAD_SUCCESS: "Edistyminen lähetetty!"
|
|
STR_SYNC_FAILED_MSG: "Synkronointi epäonnistui"
|
|
STR_SAVE_PROGRESS_FAILED: "Edistymisen tallennus epäonnistui"
|
|
STR_SECTION_PREFIX: "Osio "
|
|
STR_UPLOAD: "Lähetä"
|
|
STR_BOOK_S_STYLE: "Kirjan tyyli"
|
|
STR_EMBEDDED_STYLE: "Upotettu tyyli"
|
|
STR_FOCUS_READING: "Keskittynyt lukeminen"
|
|
STR_OPDS_SERVER_URL: "OPDS-palvelimen osoite"
|
|
STR_SCREENSHOT_BUTTON: "Ota kuvakaappaus"
|
|
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
|
STR_SLEEP_NEVER: "Ei koskaan"
|
|
STR_SLEEP_TIMER_STEP_HINT: "Vasen/Oikea: 1 min Ylös/Alas: 5 min"
|
|
STR_TILT_PAGE_TURN: "Sivunkääntö kallistamalla"
|