feat(sync): incremental file sync and per-book transfers for the active provider (#4982)

* fix(sync): record remote-present files for no-source books in the upload cursor

With "Upload Book Files" on, a device that holds no local copy of a book
(e.g. the web app with a cloud-only library) HEAD-probed the remote for
every book on every sync: pushBookFile returned 'no-source' and the hash
was never recorded in library.json's uploadedHashes, so needsFilePush
stayed true for the whole library and each run (tab focus, Sync Now,
library change) issued one Drive/WebDAV request per book, 646 requests
per sweep in the reported case.

The HEAD probe already answers whether the file is on the remote. Carry
that in PushBookFileResult.remoteExists and record the hash when a
no-source book's file is already mirrored, so the next incremental sync
skips it and stays O(changed). Books absent both locally and remotely
stay unrecorded so a device that has the bytes can upload them later.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sync): reach the no-source verdict without probing the remote

A book file sync with "Upload Book Files" on probed the remote for every
book before checking whether this device even holds the bytes. On a
device with a cloud-only library (the web app), none of the books have a
local source, so every sync run (tab focus, Sync Now, library change)
issued one name-lookup request per book against Google Drive, a full
per-book request storm that never converged: with no local file there is
nothing to upload and nothing to record, so the next run repeated it.

Resolve the local source first and return 'no-source' from local state
alone; the remote head probe now runs only when there is a local file to
compare or upload. The probe keeps its non-NETWORK rethrow semantics so
the auth-failure latch (#4981) still stops a run on an expired session.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(sync): incremental file sync and per-book transfers for the active provider

Cut the redundant remote work a file-sync run does and route explicit
per-book uploads/downloads to the active third-party provider (WebDAV /
Google Drive) instead of the gated Readest Cloud transfer queue.

Engine (services/sync/file/engine.ts, wire.ts):
- etag change-probe: one HEAD on library.json, cached per provider for the
  session. When the etag matches the last successful pull, reuse the cached
  index and skip both the index download and the discovery scan. An AUTH
  failure on the probe aborts the run like the full pull does.
- emptyDirs memo carried in the index: dirs found to hold no book file are
  recorded so clients stop re-listing them every run. Re-checked when the
  file arrives (uploadedHashes), on Full Sync, or when a legacy client drops
  the record; pruned only against a listing that actually ran.
- skip the index re-push when the rebuilt index is semantically identical to
  the pulled one, so a restamped byte-copy no longer churns the remote and
  invalidates peers' etag change detection.
- downloadBookFile() for the explicit per-book Download action.

Provider reuse (services/sync/file/providerRegistry.ts):
- memoise one provider per connection key, shared by every surface (reader
  per-book sync, library auto-sync, Sync now / pull to refresh). Reuses the
  Drive path->id cache instead of re-resolving /Readest, books/ and
  library.json by name query on every engine build. Drive connect/disconnect
  resets the cache since its token source changes identity with no key input
  changing.

Google Drive (services/sync/providers/gdrive/GoogleDriveProvider.ts):
- write fast-path: PATCH a path whose id is cached in place with no lookup,
  falling back to a full resolve on a 404 (stale id). Removes a files.list
  per PUT in the steady state.
- dev-only request diagnostics: one line per provider op and per HTTP attempt
  so a run's request budget can be attributed from the console.

Per-book transfers (services/sync/file/runLibrarySync.ts):
- runActiveFileBookUpload / runActiveFileBookDownload build the active
  provider's engine and push/pull a single book, stamping downloadedAt like
  the native path. Wired into the reader/library book actions with toasts.

UI, status, and i18n:
- Readest Cloud sub-page: drop the quota stats and wrap the "Account and
  Storage" row in the BoxedList primitive so it aligns to the design system.
- Shorten provider status/toast copy ("Active", "Google Drive session
  expired", "Library sync via {{provider}}", "KOReader") and translate the
  new keys across all locales.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Huang Xin
2026-07-07 05:49:35 +09:00
committed by GitHub
parent bcd27b7047
commit ccb937015d
59 changed files with 1351 additions and 1735 deletions
+4 -2
View File
@@ -19,6 +19,7 @@
- `src/utils/style.ts` EPUB CSS hub · `packages/foliate-js/paginator.js` · `src/services/tts/TTSController.ts`
- `src/hooks/useSafeAreaInsets.ts` · `src/app/reader/components/FoliateViewer.tsx` · `.../annotator/Annotator.tsx`
## Sync Notes
- [Cloud Sync provider selection #4959/#4380](cloud-sync-provider-selection-plan.md) MERGED #4971+#4973+#4975+#4976: derived provider, exclusive routing, syncBooks auto-enable, fleet probe, chooser; i18n pass + live verify pending
- [Grimmory native sync](grimmory-native-sync.md) Booklore-fork REVERTED
- KOSync: [CFI spine resolution](kosync-cfi-spine-resolution.md); [connect() false-positive #4692](kosync-connect-false-positive-4692.md)
- [Empty-start CFI sync](empty-start-cfi-sync.md) · [Custom fonts vanish #4410](custom-fonts-reincarnation-4410.md) CRDT remove-wins
@@ -30,7 +31,7 @@
- File sync: [refactor #4784](webdav-filesync-refactor-plan.md) `FileSyncEngine`; [third-party auto-sync #4835](third-party-library-autosync-4835.md)
- [Transfer Queue clear not persisted](transfer-queue-clear-persistence.md) hook mutated store directly, skipped `persistQueue()`; route clears through `transferManager`
- [Multi-window settings clobber (#4580)](multiwindow-settings-clobber-4580.md)
- Google Drive: [research](gdrive-sync-provider-research.md); [multi-PR status](gdrive-provider-multipr-status.md)
- Google Drive: [research](gdrive-sync-provider-research.md); [multi-PR status](gdrive-provider-multipr-status.md); [full walk every sync](gdrive-fullwalk-every-sync-no-source-cursor.md) no-source books never recorded in uploadedHashes + focus refires pullLibrary
- [Hardcover edition_id (#4792)](hardcover-progress-edition-id-4792.md)
## Build, Testing & CI
- [Nightly quick-sharun hang #4906](nightly-quick-sharun-hang-4906.md) pin via cache pre-seed + step timeouts
@@ -61,7 +62,7 @@
## Reader Features & UI
- [Android Auto TTS #3919/PR#4907](android-auto-tts-3919.md) MERGED; CarPlay blocked on entitlement
- Widgets: [mobile reading #1602/PR#4842](mobile-reading-widgets.md); [iOS App Group stripped PR#4891](ios-widget-appgroup-stripped-appstore.md); [cover bright right-edge line](ios-widget-cover-bright-edge-line.md) fractional resize → round target to whole px
- PDF: [scrolled lag #4795](pdf-scroll-lag-preload-4795.md); [scrolled pinch-zoom #4817](scrolled-pdf-pinch-zoom-4817.md); [pinch vs two-finger scroll #4858](pinch-vs-twofinger-scroll-4858.md); [text selection misplaced w/ OS font scale #4480](pdf-text-selection-fontscale-4480.md) divide `--total-scale-factor` by detected font scale
- PDF: [scrolled lag #4795](pdf-scroll-lag-preload-4795.md); [scrolled pinch-zoom #4817](scrolled-pdf-pinch-zoom-4817.md); [pinch vs two-finger scroll #4858](pinch-vs-twofinger-scroll-4858.md); [text selection misplaced w/ OS font scale #4480](pdf-text-selection-fontscale-4480.md) OS font-scale inflates text-layer glyph size not positions; divide `--text-scale-factor` (font-size lever) by detected scale, NOT `--total-scale-factor`
- [Search modes #4560](search-modes-4560-and-spoiler-bound-bug.md)
- [OPDS groups carousel #4750](opds-groups-carousel-4750.md) · [WebDAV browser sort+search #4724](webdav-browse-sort-search-4724.md)
- [Image zoom trackpad flicker (#4742)](image-zoom-trackpad-flicker-4742.md) macOS pinch=`ctrl+wheel`
@@ -100,6 +101,7 @@
- OPDS: [Firefox strict-XML #4479](opds-firefox-strict-xml-4479.md); [JSON search #4502](opds2-json-search-4502.md); [HTML desc #4503](opds-html-description-4503.md); [self-link #4749](opds-self-link-metadata-4749.md); [popular dedup #4782](opds-popular-catalog-dedup-4782.md); [auto-download subdir crawl #4272](opds-autodownload-subdir-crawl-4272.md) bounded BFS, never crawl newest-feed catalogs
- [D-pad Navigation](dpad-navigation.md)
- [koplugin cover upload (#4374)](koplugin-cover-upload.md)
- [koplugin Library slow open #4954](koplugin-library-open-mosaic-cache-4954.md) group mosaics recomposed every paint; PR#4974 availability-keyed cache + async compose + cache nil result
- [Calibre plugin push #4863](calibre-plugin-push-4863.md) OAuth localhost relay
- [Calibre custom columns #4811](calibre-custom-columns-4811.md) `metadata.calibreColumns`
## Library Fixes
@@ -0,0 +1,32 @@
---
name: cloud-sync-provider-selection-plan
description: "APPROVED /autoplan-reviewed plan making third-party sync (WebDAV/Drive) a first-class selectable provider; quota scoped to Readest Cloud (#4959/#4380)"
metadata:
node_type: memory
type: project
originSessionId: c0549d91-7f40-46a8-b110-628964be195b
---
Plan APPROVED 2026-07-06 after full /autoplan review (CEO+Design+Eng dual voices, 43 logged decisions). Plan file: `~/.claude/plans/research-on-https-github-com-readest-rea-velvet-meteor.md` (contains registries, UI state matrix, eng hardening, coverage diagram, 26 tasks). CEO doc: `~/.gstack/projects/unknown/ceo-plans/2026-07-06-cloud-sync-provider-selection.md`.
**Architecture:** policy layer over TWO engines (native DB-sync + FileSyncEngine) — Readest Cloud is NOT wrapped in FileSyncProvider (would regress server merges #4634/#4544/#4678). New `src/services/sync/cloudSyncProvider.ts`: pure `getCloudSyncProvider(settings)` derived from `webdav/googleDrive.enabled` (device-local) + separate `resolveCloudSyncGate(settings, plan)` w/ cached plan accessor (isCloudSyncAllowed needs async JWT — can't be settings-pure). Guard trips → PAUSED state + prompt, never silent readest fallback. Native gating = one branch in `syncCategories.isSyncCategoryEnabled` (book/progress/note); binary gating = `transferManager.queueUpload` returns null. Account channels (settings/stats/replicas/translations/Send) always native.
**Sequence (user-ruled at gate):** PR1 quota decouple (#4959 hotfix: gate + quota-403 no-retry + BATCH toast dedupe — spam is N-books×1-toast after retries, verified transferManager.ts:376/395) → PR1.5 file-engine parity (tags+readingStatus in mergeBookConfig/mergeBookMetadata+wire, BEFORE gating) → PR2 exclusive gating + mixed-fleet detection → PR3 chooser UI.
**Gate rulings:** UC3 = `syncBooks` AUTO-ENABLES on third-party selection (closes books-backed-up-nowhere hole; opt-out shows warning). UC1 = derived/device-local kept + read-only `/api/sync?since=providerSelectedAt&limit=1` probe → one-time "another device still syncs" banner + Sentry provider tag. UC2 = parity before gating. Switch-back = new-imports-only auto-upload (NO 675-book burst); metadata rows DO re-push (intended).
**PR1 IMPLEMENTED (2026-07-06):** commit `f6e5d7740` on branch `fix/cloud-sync-quota-decouple` (worktree `/Users/chrox/dev/readest-fix-cloud-sync-quota-decouple`), 22 files, LOCAL ONLY (not pushed, per confirm-before-push). Full suite 6900 pass + lint clean; new suites: `cloudSyncProvider.test.ts` (18), `transfer-manager-gating.test.ts` (19). i18n extraction deliberately SKIPPED in this PR (scanner pruned ~1350 live translations, e.g. "Read Aloud" — run the dedicated /i18n pass later; new strings fall back to English keys). Deviations from plan, all sound: paused toast centralized in `handleBookUpload` (both manual surfaces route through it); useTransferQueue default-param hazard fixed by the manager-level settings barrier instead of signature churn; migration passes the settings snapshot into `runMigrations(lastVersion, settings)` and mutates in place because `Settings.loadSettings` re-reads disk (subclass post-save would clobber an independent save). **SERIES FULLY MERGED (2026-07-07): #4971 (PR1 quota) + #4973 (PR1.5 parity) + #4975 (PR2 exclusive routing, closes #4380) + #4976 (PR3 chooser UI).** Worktrees removed, local branches deleted. **LIVE-VERIFY BUG FOUND+FIXED = #4981 OPEN** (`3a0af54dd`, fix/file-sync-auth-abort): expired Drive web token → engine swallowed AUTH_FAILED on index pull → remoteIndex=null read as FIRST SYNC → attempted 682-book re-upload march; latent hazard: null index skips the peers-tombstone union in the final re-push (#4860 class — transient pull failure could resurrect deletions). Fix: unreadable index (throw) aborts (404→null stays first-sync); terminal AUTH_FAILED latch stops runPool + skips index push + rethrows; web auto-sync preflights hasValidWebDriveToken. KEY ENGINE INVARIANT going forward: FileSyncError AUTH_FAILED is terminal — rethrow, never aggregate.
**i18n PASS = #4980 OPEN** (`237953cc2`, fix/cloud-sync-i18n, worktree `readest-fix-cloud-sync-i18n`): 22 strings x 33 locales + CLDR plural forms + en `_one`/`_other`, appended WITHOUT the scanner (removeUnusedKeys would prune live keys), additions-only diff. REMAINING: live verification checklist (real WebDAV 192.168.2.3:6065: exclusive e2e, syncBooks auto-enable on connect, fleet banner, switch-back no-burst, two-window switch), TODOS.md follow-ups (Sentry Rust tag, server quota error code, download-all-before-switch, library sync indicator, account chip, stats/viewSettings parity, Manage-Sync binary-gating mismatch). Note: GitHub reports 5 dependabot vulns on default branch (1 high) — pre-existing.
**PR3 contents:** activation moved to `src/services/sync/cloudSyncActivation.ts` (accepts 'readest'; component cloudSync.ts is a re-export shim); pure status matrix `cloudSyncStatus.ts` (getReadestCloudRowStatus/getThirdPartyRowStatus, fully tested — paused renders on the THIRD-PARTY row, not Readest row as plan sketch had it); Cloud Sync section (Readest-first radio rows, scope subtitle, role=radiogroup); Readest Cloud inline sub-page (Quota + NavigationRow to Account, never navigateToProfile from the row); premium branch keeps Readest row; capability Tips both directions in webdav/gdrive sub-pages; FileSyncForm Upload Book Files relabel; SyncCategoriesSection 'Managed by {{provider}}' description swap (toggles stay live).
**REMAINING (user/ops):** push 2 branch stacks + open PRs (PR1.5 independent; PR2/3 stacked on PR1); dedicated /i18n pass for ~20 new strings (extraction pruning hazard — run /i18n which handles it); live verification per plan (real WebDAV 192.168.2.3:6065: exclusive mode e2e, syncBooks auto-enable, fleet banner, switch-back no-burst); TODOS.md follow-ups (Sentry Rust tag, quota error code, etc.). Discard uncommitted TODOS.md duplicate in main checkout.
**PR2 IMPLEMENTED (2026-07-06):** commit `95fd33f0a` on `feat/cloud-sync-exclusive-gating`, STACKED on PR1 in the same worktree (`/Users/chrox/dev/readest-fix-cloud-sync-quota-decouple`), 27 files +869/-99, LOCAL ONLY. Full suite 6923 pass + lint clean. Contents: syncCategories provider gate (book/progress/note, runtime override, user toggles persist); `persistActiveCloudProvider` single write path (chooser + both connect/disconnect flows + gdrive OAuth callback which had bypassed broadcast); minimal switch-only broadcast (`{enabled, providerSelectedAt}` — never credentials/cursors); **found+fixed PR1 integration bug: buildWebDAVConnectSettings pre-set `enabled:true` so fresh-connect never triggered the syncBooks auto-flip — builder is now activation-agnostic**; fileSyncStore `lastError` + `fleetNoticeShown`; `runActiveFileLibrarySync()` shared runner (menu tap + pull-to-refresh + BackupWindow all route via pullLibrary's provider branch — fixes "undefined book(s) synced"); SettingsMenu "Synced via {{provider}}" + quota caption + Auto-Upload hidden (also command palette `action.autoUpload` filtered, BookItem badge, TransferQueuePanel Upload All); mixed-fleet read-only probe (`pullChanges(providerSelectedAt,'books',...,1)` in useBooksSync's throttled interval, once-per-session toast); `providerSelectedAt` in both provider types + backup blacklist. Sentry cloudSyncProvider tag DEFERRED to TODOS (tagging is Rust-mediated via set_webview_info pattern — needs src-tauri command).
**PR1.5 IMPLEMENTED (2026-07-06):** commit `f19fc6fa1` on `feat/file-sync-metadata-parity` (worktree `/Users/chrox/dev/readest-feat-file-sync-metadata-parity`, branched off origin/main independent of PR1), 4 files +253/-26, LOCAL ONLY. Full suite 6869 pass + lint clean. KEY FINDING: library.json already serializes FULL Book objects — tags/readingStatus were on the wire all along; the drop was `mergeBookMetadata`'s overlay (same gap as #4942 groups) + the reconcile predicate not firing on status-only changes. Fix: tags join the metadata LWW subset (raw assignment, removals propagate); readingStatus merges on its own `readingStatusUpdatedAt` clock (client mirror of #4634); new `shouldApplyRemoteBookMetadata` predicate (either clock) replaces `isRemoteBookMetadataNewer` in the engine reconcile filter (the old predicate stays exported). NO wire changes needed. PR2 stacks on PR1 (needs cloudSyncProvider.ts) — merge PR1 first or stack branches.
**Key traps found in review:** `BACKUP_SETTINGS_BLACKLIST` does NOT exclude enabled flags/webdav.deviceId (plan text was wrong; PR1 adds deviceId/lastSyncedAt to blacklist); settings broadcast must carry ONLY `{enabled}` (password would leak; routine lastSyncedAt writes could revert a switch via slice LWW); Drive OAuth callback writes via appService.saveSettings bypassing broadcast → centralize `activateCloudProvider()`; `useTransferQueue()` DEFAULT params (`libraryLoaded=true`) in SettingsMenu/TransferQueuePanel are the real unguarded init path (barrier = `settings.version`); cancelled needs structured `cancelReason` + queue schemaVersion (`retryAllFailed` resurrects cancelled rows today; failed-includes-cancelled copy-pasted in 5 places); fileSyncStore is process-local — durable lastSyncedAt lives in provider settings.
See [[webdav-filesync-refactor-plan]] · [[gdrive-provider-multipr-status]].
@@ -0,0 +1,27 @@
---
name: gdrive-fullwalk-every-sync-no-source-cursor
description: Google Drive file sync re-probes all 646 books every run (focus/Sync Now) because uploadedHashes never records no-source books; plus supabase focus events re-fire pullLibrary
metadata:
node_type: memory
type: project
originSessionId: 894e0d6d-ce01-402b-8f2d-0f0670986a88
---
Diagnosed 2026-07-07 (web dev, valid Drive session). "Uploading N / 646" on every tab refocus and every Sync Now = full per-book Drive probe sweep (`files?q=name='<title>.epub' and '<hashdir>' in parents`, ~1 req/book), no actual byte re-upload.
Two compounding causes:
1. **File cursor never records books absent from this device.** #4856's `uploadedHashes` in library.json is only added on `uploaded` or `remote-matches` (needs local bytes for size compare) in `FileSyncEngine.syncLibrary` push loop (engine.ts ~line 806-815). On web, non-downloaded books → `loadBookFile` null → `no-source` → NOT recorded even though the HEAD probe already proved the remote file exists. So `needsFilePush` stays true for all 646 forever → O(library) every run. Toggle test: Upload Book Files off → 15 reqs (config cursor `isLocalNewer` works); on → 646.
Fix v1 (record remote-present no-source books, commit 900af1df1 on dev) proved INSUFFICIENT: Drive API inspection showed 654/690 hash dirs hold only cover.png+config.json, NO book file (only 36 files ever uploaded) — so there was nothing to record and the probe storm persisted.
Fix v2 (the real fix, on dev 2026-07-07, initially uncommitted): reorder `pushBookFile` to resolve the LOCAL source before any remote probe (`probeRemoteHead` closure, lazy); `no-source` now costs zero requests and the `remoteExists` plumbing from v1 was removed again. Test: 'spends no remote request on a no-source book' in engine-sync-paths.test.ts. The 654 books stay in booksToPush (progress counter still shows them) but the sweep is network-free. Their files land on Drive only when a device that HAS the bytes (desktop) syncs with Upload Book Files on; that device records the hashes and everyone skips thereafter.
Worktree was discarded per user; work continues directly on the bare repo dev branch (dev server localhost:3000 runs from there).
Round 4 (dev, uncommitted): per-book cloud buttons (Book Details + bookshelf + open-non-local-book) route to the selected provider instead of the gated Readest Cloud queue ("Uploads to Readest Cloud are paused..." toast). `FileSyncEngine.downloadBookFile` (hash-dir listing resolves filename; stream on Tauri, buffered on web; cover+config best-effort) + `runActiveFileBookUpload/Download` in runLibrarySync.ts (stamps downloadedAt; caller persists via updateBook + toasts, existing transferMessages i18n keys). Reader hint parity same day: `remoteProgressApplied` in useFileSync dispatches 'Reading Progress Synced' hint on applied remote position. NOT done: provider path has no transfer-queue/progress UI; uploadedAt not stamped (means Readest-Cloud backup; provider uploaded-state could later key off index uploadedHashes).
Round 2 optimizations (dev, uncommitted as of 2026-07-07 03:10): provider memoized per connection key in `createFileSyncProvider` (warm Drive idCache across reader hook / library auto-sync / Sync Now; `resetFileSyncProviderCache()` called on Drive connect/disconnect); `writeBinary` PATCHes cached id without files.list lookup (404 evict+fallback); dev-only request diagnostics `[gdrive] op ...` / `[gdrive] #n ...` in GoogleDriveProvider.
Remaining per-run budget after round 2 (no-change run ~11 req, ~550 kB): index GET 269 kB + index PATCH 269 kB every run; books/ listing 40 kB; ~8 file-less orphan hash dirs (in neither index nor library) re-listed by discovery every run.
Round 3 (dev, uncommitted, all TDD in engine-sync-paths.test.ts): (1) etag short-circuit — `remoteIndexCache` WeakMap keyed on the memoized provider in engine.ts; head(library.json) etag (Drive md5/WebDAV ETag) vs cached → reuse structuredClone'd index, skip GET + ENTIRE discovery scan (peer changes always rewrite library.json; legacy no-index uploads still found on session-first run + fullSync); cache dropped after own push. (2) no-op push skip — `indexDirty` check (syncedHashes/failures/uploadedHashes-set/emptyDirs-set/any local row absent-or-newer-or-tombstone-mismatched vs remote index); skipping also keeps peers' etags stable (a restamped copy would defeat fleet-wide change detection). (3) `emptyDirs` optional index field (wire.ts) — file-less candidate dirs recorded once, skipped by discovery unless uploadedHashes says the file arrived or fullSync; pruned only against a listing that ran. Idle run = 1 stat request; local-change run = stat + config pull/push + index PATCH (no GET, no discovery). engine-deletion-sync 'preserves remote tombstone' test updated to force a dirty run.
2. **Every tab focus re-runs the library file sync.** supabase-js emits SIGNED_IN/TOKEN_REFRESHED on visibilitychange; `AuthContext.syncSession` does `setUser(newObject)` each time → `pullLibrary` (deps include `user`) recreated → `useBooksSync` effect `[user, useSyncInited, libraryLoaded, pullLibrary]` refires → `runActiveFileLibrarySync` (third-party provider path). Fix would be: key on `user?.id` / latch the initial pull. User decided 2026-07-07 to LEAVE THIS AS IS ("sync on focus is fine now that runs are O(changed)") — only cause 1 was fixed.
Related: #4981 fixed the adjacent expired-token variant (aborting instead of marching with remoteIndex=null). Web Drive token is sessionStorage-scoped (tab-local, no refresh). See [[cloud-sync-provider-selection-plan]], [[webdav-filesync-refactor-plan]].
@@ -0,0 +1,55 @@
---
name: koplugin-library-open-mosaic-cache-4954
description: koplugin Library slow open on large libraries — group-cover mosaics recomposed every paint; fixed by availability-keyed cache + async compose
metadata:
node_type: memory
type: project
originSessionId: 7e7dbb83-cffb-495d-9778-bf94ccb45d8b
---
Issue #4954 (PR #4974, MERGED 2026-07-07): opening the KOReader plugin Library
was slow on large libraries (~1000 books) while navigation stayed fast.
**Root cause (measured, not guessed).** Added open-path timing instrumentation
(`ui/time` + `elapsed_ms` helper) to `library/librarywidget.lua` (initial
`build_item_table`, `lightScan`, post-scan refresh, total synchronous open,
cloud-sync elapsed) and a step breakdown in `library/localscanner.lua`. On a
685-book library the synchronous open was ~300ms, dominated by a **254ms
post-scan refresh** = `library/group_covers.lua` recomposing each folder's 2x2
cover **mosaic from scratch on every paint** (up to 4 MuPDF decodes+scales per
cell), with no cache, and again on the post-sync refresh. `build_item_table`
(7ms) and `lightScan` (28ms, only 16 sidecar reads) were NOT the bottleneck —
my initial hypotheses (defer lightScan / incremental history) were refuted by
the log. Why "slow to load, fast to navigate": the root Groups view is mosaics;
drilling into a group shows single covers (cheap, BIM-cached). Soft-scales with
size (fuller groups → 4 covers/mosaic vs 1). Data-side pagination is NOT
possible (KOReader `Menu` derives page count from `#item_table`).
**Fix (mirror `cloud_covers` async pattern in `group_covers`).**
- Cache composed master bb per group, keyed by `mosaic_cache_key` = ordered
child hashes + a per-child **cover-availability bit** (`child_cover_available`
`cloud_covers.cover_exists(hash)` or local file stat). Serve `copy_bb` on
hit. The availability bit fixes the historical "partial composite served
forever" bug that killed the prior on-disk cache: a late cover flips the key
and recomposes once.
- **Cache the `nil` result too** (critical): a coverless group whose children
aren't downloaded makes `compose` return nil; if not cached it re-enqueues +
`schedule_refresh` on every refresh → infinite recompose/refresh loop (eink
flashing). Caught this in the second emulator log (`group_nameLanguagegrid`
missing every refresh). Cache nil under the availability key → placeholder
served, no re-enqueue.
- Compose off first-paint: miss enqueues a single-slot background job (one
mosaic per UI `nextTick`, `_pump_scheduled` coalesces), returns nil so the
cell paints its FakeCover placeholder; completions coalesce into one refresh.
- `clear_cache()` on Library close (via `libraryitem.set_visible_hashes(nil)`)
frees masters (~0.7MB each).
Result: synchronous open 300ms→151ms, post-scan refresh 254ms→89ms (now just the
4 visible single cloud-book cover decodes + placeholders, mosaics deferred).
**Left out (follow-ups noted in PR):** single cloud-book covers
(`cloud_covers.load_cover_bb`) still re-decode from disk each refresh (~89ms/4)
— same copy-on-serve cache could apply; deferred cloud sync uses synchronous
HTTP that briefly freezes UI after the menu appears (elapsed 1.6-6.8s, network
variance). Instrumentation kept intentionally (Library open is infrequent).
See [[koplugin-stats-duplicate-book-rows-4861]], [[koplugin-library-stale-synced-cursor-4934]].
@@ -21,6 +21,8 @@ The iframe is interactive (`pointer-events:auto`) only during a 150ms idle windo
**Reproduction / test technique (jsdom can't — needs real layout + real wheel):**
- Standalone Playwright proof: scroll container + `scrolling="no"` srcdoc iframe + the buggy handler, `page.mouse.wheel(0,120)` over the iframe → scrollTop 240 vs 120 over margin; remove `scrollBy` → 120 == 120. (real `mouse.wheel` triggers native chaining; synthetic dispatch does NOT.)
- Committed regression test `src/__tests__/document/fixed-layout-scroll-wheel.browser.test.ts` (browser lane, `pnpm test:browser`): mounts the REAL `<foliate-fxl>` in scrolled mode (minimal fake book: `rendition.viewport`, sections whose `load()` returns `{ src:'srcdoc', data: tallHtml }``src` must be truthy or `#createScrollFrame` returns blank; `data` → srcdoc keeps iframe same-origin so contentDocument is reachable), dispatches a **synthetic** `WheelEvent` on the page iframe doc, asserts `renderer.scrollTop` stays 0 (synthetic wheel doesn't chain natively, so any movement is the JS handler = must be 0). Fails `120` against the bug, passes `0` fixed.
- Committed regression test `src/__tests__/document/fixed-layout-scroll-wheel.browser.test.ts` (browser lane, `pnpm test:browser`): mounts the REAL `<foliate-fxl>` in scrolled mode (minimal fake book: `rendition.viewport`, sections whose `load()` returns `{ src:'srcdoc', data: tallHtml }``src` must be truthy or `#createScrollFrame` returns blank; `data` → srcdoc keeps iframe same-origin so contentDocument is reachable), dispatches a **synthetic** `WheelEvent` on the page iframe doc (synthetic wheel doesn't chain natively, so any movement is the JS handler = must be 0). Fails `120` against the bug, passes fixed.
**CI flake + hardening (2026-07-07):** original assertion set `scrollTop=0`, dispatched, `await setTimeout(60)`, then `expect(scrollTop).toBe(0)` — flaked on slow CI runners with **`expected 4 to be +0`**. Root cause: as sibling scroll pages finish loading, `#loadScrollPage` runs `#restoreScrollModeAnchor` **asynchronously**, which at scrollTop=0/index-0 (fraction 0) snaps `scrollTop` to page 0's `offsetTop` = the **4px `--scroll-page-gap`** margin. The 60ms post-dispatch delay raced that re-anchoring → observed 4. NOT the bug (bug = 120px). **Fix:** the buggy `scrollBy({behavior:'instant'})` is *synchronous* (lands before `dispatchEvent()` returns), so measure `before=scrollTop` / dispatch / `after=scrollTop` with **NO await between** and assert `after===before`. Synchronous read isolates the handler's own effect; immune to the async anchor-restore. Verified: reintroducing the buggy scrollBy → `before=4, after=124` (delta 120, still caught); reverted → stable across repeated runs.
Fix lives in the `packages/foliate-js` submodule (separate repo/commit). Relates to [[fixed-layout-paginated-scroll-reset-4683]], [[webtoon-mode-3647]].
@@ -11,7 +11,9 @@ metadata:
**Ruled out during investigation:** WebView version (Tab A8 was on WebView **148**, newer than the working S21's 147 and a WebView-124 emulator — all fine at default font scale); devicePixelRatio (the paginator's fit-width `zoom` keeps `--total-scale-factor` DPR-invariant); interactive-vs-programmatic selection (both fine). Font-metric/realm mismatch was a red herring: main-app-doc and iframe-doc `measureText` are identical on working devices.
**Fix** (`packages/foliate-js/pdf.js`, `render()`): detect the OS font scale with a probe (`offsetHeight` of a `100px`/`line-height:1` box = `100 * fontScale`, unaffected by DPR or the `<html>` `scale(1/dpr)` transform) and divide it back out: `--total-scale-factor = scale / getFontScale(doc)`. Positions (`left`/`top`) are px and font-scale-independent, so only font-size needs correcting. At font_scale 1.0 the probe returns 1.0 → no change (no regression). PDF-only; EPUB is unaffected because its text and overlay scale together.
**Fix** (`packages/foliate-js/pdf.js`, `render()`): detect the OS font scale with a probe (`offsetHeight` of a `100px`/`line-height:1` box = `100 * fontScale`, unaffected by DPR or the `<html>` `scale(1/dpr)` transform). The OS scales only the glyph **size** (a `font-size`); text-layer **positions** are percentages of the `--total-scale-factor`-sized container and are NOT scaled. So divide the scale out of the glyph-size lever ONLY: after `textLayer.render()`, set the container's `--text-scale-factor = calc(var(--total-scale-factor) * var(--min-font-size) / fontScale)` (that var feeds `font-size` and nothing else — grep the vendored `text_layer_builder.css` to confirm). At font_scale 1.0 the probe returns 1.0 → override skipped, no regression. PDF-only; EPUB is unaffected because its text and overlay scale together.
**Do NOT divide `--total-scale-factor`** (the obvious-but-wrong first fix, PR #49 rev 1): it scales positions AND size, so `scale/F` shrinks the whole text layer toward the top-left origin — glyphs correct-ish size but positions compressed, offset accumulating downward. Verified by measurement: changing `--total-scale-factor` ×1.5 moves a span's top/left AND w/h all ×1.5. This looks "fixed" for the selection highlight (no more margin bleed) but the text layer no longer overlays the canvas; diagnose by coloring `.textLayer span { color: red }` and screenshotting the red-over-canvas overlay.
**Repro/verify harness (reusable):** the release APK's WebView is CDP-debuggable. `adb forward tcp:PORT localabstract:webview_devtools_remote_$(pidof com.bilingify.readest)`, then drive `Runtime.evaluate` over the page WebSocket. The PDF renders in an iframe nested inside foliate-view's shadow DOM — deep-traverse `shadowRoot` + `iframe.contentDocument` to reach `.textLayer`. Create a multi-line selection with `doc.getSelection().addRange()` + `adb exec-out screencap` to see the native highlight. Set `settings put system font_scale 1.3` to reproduce. See [[android-cdp-e2e-lane]].
@@ -15,10 +15,12 @@ Sentry crash/error reporting added in PR #4914 (`feat(sentry): add crash reporti
Config: `sentry_config.rs` holds pure helpers (`sentry_dsn`, `environment_for_version`, `app_version`, `release_name`/`sentry_release`, `corrected_os_name`, `android_version_from_uname`, `is_ignored_browser_error`, `parse_webview_info`/`set_webview_info`/`webview_info`). Scope = crashes+errors only. Symbolication (source-map/ProGuard/dSYM upload) is STILL deferred — several 2026-07 crashes (READEST-2 render loop, READEST-9) could only be triaged to a function name, not a source line, for lack of source maps; upload them.
**The Rust-client `before_send` (in `lib.rs`) now does three things**, in order, for every event (Rust panics + browser events forwarded by tauri-plugin-sentry): (1) drop known-benign browser noise via `is_ignored_browser_error` (only the View-Transition-skipped-while-hidden message; a transition *timeout* is deliberately kept — real perf signal); (2) rewrite the Android OS name/version (see below); (3) tag `webview.engine`/`webview.version`. The webview tags come from a `set_webview_info` Tauri command the app calls once in `NativeAppService.init()` with `navigator.userAgent`; `parse_webview_info` extracts engine+major-version (Chromium `Chrome/140` checked before WebKit `Version/17`, because Android WebViews also carry a legacy `Version/4.0`) into a global `OnceLock` read in before_send. Added because forwarded browser events carry os/rust/device context but NO browser context, so crashes couldn't be correlated with WebView version. (feat(sentry): tag events with the WebView engine and version, merged 2026-07.)
**The Rust-client `before_send` (in `lib.rs`) now does three things**, in order, for every event (Rust panics + browser events forwarded by tauri-plugin-sentry): (1) drop known-benign browser noise via `is_ignored_browser_error` (case-insensitive match on the benign View-Transition rejections: "transition was skipped" (hidden tab READEST-7 + superseded-nav READEST-F) and "aborted because of invalid state" (READEST-G); a transition *timeout* is deliberately KEPT — real perf signal); (2) rewrite the Android OS name/version (see below); (3) tag `webview.engine`/`webview.version`. The webview tags come from a `set_webview_info` Tauri command the app calls once in `NativeAppService.init()` with `navigator.userAgent`; `parse_webview_info` extracts engine+major-version (Chromium `Chrome/140` checked before WebKit `Version/17`, because Android WebViews also carry a legacy `Version/4.0`) into a global `OnceLock` read in before_send. Added because forwarded browser events carry os/rust/device context but NO browser context, so crashes couldn't be correlated with WebView version. (feat(sentry): tag events with the WebView engine and version, merged 2026-07.)
**2026-07 production crash-fix batch (all merged).** The recurring root cause was best-effort background work throwing UNHANDLED promise rejections (callers fire-and-forget, so a throw hits the global handler): READEST-1 concurrent-use (turso, see [[turso-concurrent-use-forbidden]]); READEST-5 cloud `deleteFile` threw (log+swallow); READEST-6 statistics DB writes on teardown (`runBestEffort` wrapper in `ReadingStatsTracker`; also covers READEST-4/8 network fails); READEST-A library save to a custom shared-storage folder failed `EACCES` because the save path never called the existing `requestStoragePermission()` (`AppService.saveLibraryBooks` now requests-once-per-session + retries). READEST-2 = zustand `updateTransferProgress` allocating new state on unchanged values → React update loop (equality guard). READEST-9 = `useAppRouter` wraps EVERY nav in a View Transition; opening a book is a heavy render that overruns the ~4s DOM-update budget → `TimeoutError` (fix: book-open navs use the plain `useRouter`, matching 8/10 into-reader paths; version-gating does NOT help — the 4s budget is version-independent).
**Batch 2 (PR #4962, merged).** READEST-F/G = more benign View-Transition rejections → broadened the `before_send` filter (above). READEST-H = book-import `createDir` was non-recursive check-then-create; two concurrent imports of the same book race → Windows "Cannot create a file when that file already exists". Fix: `fs.createDir(getDir(book), 'Books', true)` (recursive = `create_dir_all`, idempotent). READEST-N = `StatisticsDb.applyRemoteEvents` runs a manual `BEGIN`/`COMMIT`; **the Rust per-op `op_lock` serializes single statements but does NOT make a multi-statement JS transaction atomic** — two concurrent pulls (split-view trackers share the `sharedDb` singleton connection) nest `BEGIN` in `BEGIN` → "cannot start a transaction within a transaction". Fix: a promise-chain mutex on `applyRemoteEvents` (works because JS is single-threaded — the synchronous grab-prev/install-new-promise is atomic; concurrency here is async *interleaving at `await`s*, not threads). General rule: any shared-connection multi-statement transaction needs JS-level serialization on top of the native op_lock. (Cleaner alternative not taken: dedupe the pull so only one tracker pulls the shared DB.) Deferred, need source maps: READEST-J (OPDS page-stream fetch, uncaught native reqwest error), READEST-K (`Failed to fetch`), READEST-M (`null appendChild`).
**Release + environment key off `package.json`, NOT the crate version.** Originally `release: sentry::release_name!()` = `CARGO_PKG_NAME@CARGO_PKG_VERSION` = `Readest@0.2.2` (stale crate version, never bumped) and `environment` read `CARGO_PKG_VERSION` (so it was ALWAYS "production" — nightly detection was dead). Fix: `build.rs::propagate_app_version()` reads the top-level `"version"` from `../package.json` (line-based parse via `read_json_string_field`, no serde) and bakes `cargo:rustc-env=READEST_APP_VERSION`; `app_version()` reads it via `option_env!` (falls back to `CARGO_PKG_VERSION`), same bake mechanism as `SENTRY_DSN`. `sentry_release()` -> `Readest@<pkg-version>` (e.g. `Readest@0.11.17`), `sentry_environment()` now derives from `app_version()` so nightly (`-YYYYMMDDHH`) correctly reports `environment=nightly`. Android/iOS **native** SDK releases already came from `versionName`/bundle version (tauri derives those from package.json), so only the Rust client (which also handles JS/browser events via tauri-plugin-sentry) needed fixing.
**OS name "Linux" -> "Android".** On Android, `sentry-contexts::os_context()` builds the OS context from `uname()` (not-macos/not-windows branch): `name = info.sysname` = "Linux", `version = info.release` = kernel string like `6.1.162-android14-11-...`. Fixed with a Rust-client `before_send` in `lib.rs` that, keyed on `std::env::consts::OS == "android"`, rewrites `Context::Os.name` -> "Android" and pulls the Android version ("14") out of the `androidNN` token in `os.version` via `android_version_from_uname`. `before_send` runs AFTER `ContextIntegration::process_event` (which inserts the os context only if `Entry::Vacant`), so the "Linux" context is present to rewrite; applies to browser events too since tauri-plugin-sentry forwards them through the same Rust client. iOS-via-Rust would show "Darwin" but that path is minor (native sentry-cocoa reports iOS correctly) — not remapped.
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "تم تسجيل الدخول باسم {{userDisplayName}}",
"Match Case": "مطابقة حالة الأحرف",
"Match Diacritics": "مطابقة التشكيل",
"Match Whole Words": "مطابقة الكلمات الكاملة",
"Maximum Number of Columns": "العدد الأقصى للأعمدة",
"Minimum Font Size": "الحد الأدنى لحجم الخط",
"Monospace Font": "خط أحادي المسافة (Monospace)",
@@ -599,8 +598,6 @@
"Advanced Settings": "إعدادات متقدمة",
"File count: {{size}}": "عدد الملفات: {{size}}",
"Background Read Aloud": "قراءة بصوت عالٍ في الخلفية",
"Ready to read aloud": "جاهز للقراءة بصوت عالٍ",
"Read Aloud": "القراءة بصوت عالٍ",
"Screen Brightness": "سطوع الشاشة",
"Background Image": "صورة الخلفية",
"Import Image": "استيراد صورة",
@@ -1647,14 +1644,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "فشل مصادقة WebDAV. أعد الاتصال من الإعدادات.",
"Downloading": "تنزيل",
"Uploading": "تحميل",
"downloaded {{n}} book(s)": "تنزيل {{n}} كتاب",
"pushed {{n}} config(s)": "دفع {{n}} إعداد",
"uploaded {{n}} new file(s)": "تحميل {{n}} ملف جديد",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "انتهت المزامنة بـ {{failed}} خطأ. {{ok}} ناجح.",
"Sync complete": "اكتملت المزامنة",
"Everything is already up to date.": "كل شيء محدث بالفعل.",
"Browsing {{path}} on {{server}}": "تصفح {{path}} على {{server}}",
"Connect to a WebDAV server to browse your remote files.": "اتصل بخادم WebDAV لتصفح ملفاتك البعيدة.",
"WebDAV": "WebDAV",
"Upload Book Files": "تحميل ملفات الكتب",
"Sync now": "مزامنة الآن",
@@ -1662,33 +1652,8 @@
"Show password": "إظهار كلمة المرور",
"Root Directory": "الدليل الجذر",
"Syncing…": "جاري المزامنة…",
"pulled progress for {{n}} book(s)": "سحب التقدم لـ {{n}} كتاب",
"Sync History": "سجل المزامنة",
"Clear Sync History": "مسح سجل المزامنة",
"No manual syncs yet": "لا توجد مزامنات يدوية بعد",
"Partial": "جزئي",
"Cleanup": "تنظيف",
"Cleanup failed": "فشل التنظيف",
"Sync failed": "فشلت المزامنة",
"{{n}} deleted": "{{n}} محذوف",
"{{n}} failed": "{{n}} فاشل",
"Nothing deleted": "لم يتم حذف شيء",
"{{n}} downloaded": "{{n}} منزل",
"{{n}} uploaded": "{{n}} محمل",
"{{n}} progress": "{{n}} تقدم",
"Up to date": "محدث",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "الكتب المنزلة",
"Files uploaded": "الملفات المحملة",
"Configs uploaded": "الإعدادات المحملة",
"Configs downloaded": "الإعدادات المنزلة",
"Covers uploaded": "الأغلفة المحملة",
"Books deleted": "الكتب المحذوفة",
"Files in sync": "الملفات المتزامنة",
"Failures": "الأخطاء",
"Total books": "إجمالي الكتب",
"Error:": "خطأ:",
"Failed books": "الكتب الفاشلة",
"Deleted {{n}} book(s) from server.": "تم حذف {{n}} كتاب/كتب من الخادم.",
"Failed to load directory": "فشل تحميل المجلد",
"File download is only supported on the desktop and mobile apps.": "تنزيل الملفات مدعوم فقط في تطبيقات سطح المكتب والموبايل.",
@@ -1720,10 +1685,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ثبّت إضافة متصفح Readest لإرسال المقالة التي تقرأها إلى مكتبتك. تقتطع الصفحة من متصفحك حتى تعمل المواقع المدفوعة والتي تتطلب تسجيل الدخول.",
"Added to your library. It will sync to your other devices.": "تمت الإضافة إلى مكتبتك. ستتم المزامنة مع أجهزتك الأخرى.",
"Sync passphrase forgotten. All encrypted fields cleared.": "تم نسيان عبارة المرور للمزامنة. تم مسح جميع الحقول المشفرة.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "المزامنات اليدوية والتنظيف فقط. لا تُسجل المزامنات التلقائية أثناء القراءة هنا.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "هل تريد حذف {{n}} كتاب/كتب من خادم WebDAV؟\n\nهذا يحذف الملفات البعيدة فقط؛ مكتبتك المحلية لن تتأثر. لا يمكن التراجع عن الحذف. البيانات على الخادم ستزول للأبد.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "يرفع ملفات الكتب إلى أجهزتك الأخرى.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "عبارة مرور المزامنة غير صحيحة. تعذر فك تشفير بيانات الاعتماد المتزامنة.",
"Email books straight to your library": "أرسل الكتب مباشرة إلى مكتبتك عبر البريد الإلكتروني",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "أعد توجيه المرفقات والمقالات إلى عنوان Readest الخاص بك. متوفر في خطط Plus وPro وLifetime.",
@@ -1924,9 +1887,6 @@
"Also erase reading progress, notes, and bookmarks.": "يمسح أيضًا تقدم القراءة والملاحظات والإشارات المرجعية.",
"Background Image (Library)": "صورة الخلفية (المكتبة)",
"Background Image (Reader)": "صورة الخلفية (واجهة القراءة)",
"updated metadata for {{n}} book(s)": "تم تحديث البيانات الوصفية لـ {{n}} كتاب",
"{{n}} metadata": "{{n}} بيانات وصفية",
"Metadata updated": "تم تحديث البيانات الوصفية",
"Filter": "تصفية",
"Sort by": "ترتيب حسب",
"Date modified": "تاريخ التعديل",
@@ -1974,8 +1934,6 @@
"Decrease Contrast": "تقليل التباين",
"Reset Contrast": "إعادة تعيين التباين",
"Increase Contrast": "زيادة التباين",
"Google Drive session expired. Reconnect in Settings.": "انتهت صلاحية جلسة Google Drive. أعد الاتصال من الإعدادات.",
"Cloud sync session expired. Reconnect in Settings.": "انتهت صلاحية جلسة المزامنة السحابية. أعد الاتصال من الإعدادات.",
"Push": "دفع",
"Slide": "انزلاق",
"Page Curl": "طي الصفحة",
@@ -1984,7 +1942,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "يحدد حجم نص نتائج القاموس بشكل مستقل عن عرض القراءة.",
"Authentication failed. Reconnect in Settings.": "فشلت المصادقة. أعد الاتصال من الإعدادات.",
"Full Sync": "مزامنة كاملة",
"Re-check every book instead of only changed ones.": "إعادة فحص كل كتاب بدلاً من الكتب المتغيرة فقط.",
"Waiting for sign-in…": "في انتظار تسجيل الدخول…",
"Reconnect": "إعادة الاتصال",
"Connected as {{account}}": "متصل باسم {{account}}",
@@ -2009,17 +1966,13 @@
"Reading aloud continues in the background": "تستمر القراءة بصوت عالٍ في الخلفية",
"Stopped reading aloud": "تم إيقاف القراءة بصوت عالٍ",
"Read aloud stopped": "توقفت القراءة بصوت عالٍ",
"Synced via {{provider}} {{time}}": "تمت المزامنة عبر {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "تتم مزامنة الكتب عبر {{provider}} - لا يُستخدم تخزين Readest Cloud",
"Cloud provider switched": "تم تغيير مزوّد السحابة",
"Synced via {{provider}}": "تمت المزامنة عبر {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "رفع الملفات إلى Readest Cloud متوقف مؤقتًا ما دامت مزامنة {{provider}} محددة",
"Managed by {{provider}} while it is your cloud sync provider": "يديره {{provider}} ما دام مزوّد المزامنة السحابية لديك",
"Not signed in": "لم يتم تسجيل الدخول",
"Active — syncing your library on this device": "نشط — تتم مزامنة مكتبتك على هذا الجهاز",
"Paused — plan required": "متوقف مؤقتًا — يلزم اشتراك",
"Active · Book file uploads off": "نشط · رفع ملفات الكتب متوقف",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "يرفع ملفات الكتب إلى أجهزتك الأخرى. يتوقف الرفع إلى Readest Cloud مؤقتًا ما دام هذا المزوّد محددًا.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "ما دام WebDAV محددًا، تتم مزامنة الكتب والتقدم والتمييزات مع خادمك فقط.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "تستمر مزامنة إعدادات التطبيق وإحصاءات القراءة والقواميس عبر حساب Readest الخاص بك ما دمت مسجلاً الدخول.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "ما دام Google Drive محددًا، تتم مزامنة الكتب والتقدم والتمييزات مع Drive الخاص بك فقط.",
@@ -2027,7 +1980,6 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "زامن مكتبتك وتقدم القراءة والتمييزات مع Readest Cloud.",
"Account and Storage": "الحساب والتخزين",
"Manage your plan and stored files": "إدارة اشتراكك وملفاتك المخزنة",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "اختر أين تتم مزامنة مكتبتك — الكتب والتقدم والتمييزات — على هذا الجهاز. تتم مزامنة إعدادات التطبيق وإحصاءات القراءة والقواميس دائمًا مع حساب Readest الخاص بك ما دمت مسجلاً الدخول.",
"Cloud sync provider": "مزوّد المزامنة السحابية",
"Use Readest Cloud": "استخدام Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "لا يزال جهاز آخر يزامن هذه المكتبة عبر Readest Cloud",
@@ -2036,5 +1988,11 @@
"{{count}} uploads failed: insufficient storage quota_two": "فشل رفعان: حصة التخزين غير كافية",
"{{count}} uploads failed: insufficient storage quota_few": "فشلت {{count}} عمليات رفع: حصة التخزين غير كافية",
"{{count}} uploads failed: insufficient storage quota_many": "فشلت {{count}} عملية رفع: حصة التخزين غير كافية",
"{{count}} uploads failed: insufficient storage quota_other": "فشلت {{count}} عملية رفع: حصة التخزين غير كافية"
"{{count}} uploads failed: insufficient storage quota_other": "فشلت {{count}} عملية رفع: حصة التخزين غير كافية",
"Library sync via {{provider}}": "مزامنة المكتبة عبر {{provider}}",
"Google Drive session expired": "انتهت صلاحية جلسة Google Drive",
"Cloud sync session expired": "انتهت صلاحية جلسة المزامنة السحابية",
"Uploads book files to your other devices": "يرفع ملفات الكتب إلى أجهزتك الأخرى",
"Re-check every book instead of only changed ones": "إعادة فحص كل كتاب بدلاً من الكتب المتغيرة فقط",
"KOReader": "KOReader"
}
@@ -308,7 +308,6 @@
"Book": "বই",
"Chapter": "অধ্যায়",
"Match Case": "কেস মিলান",
"Match Whole Words": "পূর্ণ শব্দ মিলান",
"Match Diacritics": "ডায়াক্রিটিক্স মিলান",
"TOC": "সূচিপত্র",
"Table of Contents": "সূচিপত্র",
@@ -583,8 +582,6 @@
"Advanced Settings": "উন্নত সেটিংস",
"File count: {{size}}": "ফাইলের সংখ্যা: {{size}}",
"Background Read Aloud": "পটভূমিতে উচ্চস্বরে পড়ুন",
"Ready to read aloud": "উচ্চস্বরে পড়ার জন্য প্রস্তুত",
"Read Aloud": "উচ্চস্বরে পড়ুন",
"Screen Brightness": "স্ক্রিন উজ্জ্বলতা",
"Background Image": "ব্যাকগ্রাউন্ড ছবি",
"Import Image": "ছবি আমদানি করুন",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV প্রমাণীকরণ ব্যর্থ। সেটিংসে আবার সংযোগ করুন।",
"Downloading": "ডাউনলোড হচ্ছে",
"Uploading": "আপলোড হচ্ছে",
"downloaded {{n}} book(s)": "{{n}}টি বই ডাউনলোড করা হয়েছে",
"pushed {{n}} config(s)": "{{n}}টি কনফিগ পাঠানো হয়েছে",
"uploaded {{n}} new file(s)": "{{n}}টি নতুন ফাইল আপলোড করা হয়েছে",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "সিঙ্ক {{failed}}টি ব্যর্থতা সহ সম্পন্ন হয়েছে। {{ok}}টি সফল।",
"Sync complete": "সিঙ্ক সম্পূর্ণ",
"Everything is already up to date.": "সবকিছু ইতিমধ্যে আপ টু ডেট রয়েছে।",
"Browsing {{path}} on {{server}}": "{{server}} এ {{path}} ব্রাউজ করা হচ্ছে",
"Connect to a WebDAV server to browse your remote files.": "আপনার রিমোট ফাইলগুলি ব্রাউজ করতে WebDAV সার্ভারে সংযোগ করুন।",
"WebDAV": "WebDAV",
"Upload Book Files": "বইয়ের ফাইল আপলোড করুন",
"Sync now": "এখনই সিঙ্ক করুন",
@@ -1546,33 +1536,8 @@
"Show password": "পাসওয়ার্ড দেখান",
"Root Directory": "রুট ডিরেক্টরি",
"Syncing…": "সিঙ্ক হচ্ছে…",
"pulled progress for {{n}} book(s)": "{{n}}টি বইয়ের অগ্রগতি টানা হয়েছে",
"Sync History": "সিঙ্ক ইতিহাস",
"Clear Sync History": "সিঙ্ক ইতিহাস মুছুন",
"No manual syncs yet": "এখনো কোনো ম্যানুয়াল সিঙ্ক নেই",
"Partial": "আংশিক",
"Cleanup": "পরিচ্ছন্নতা",
"Cleanup failed": "পরিচ্ছন্নতা ব্যর্থ",
"Sync failed": "সিঙ্ক ব্যর্থ",
"{{n}} deleted": "{{n}}টি মুছে ফেলা",
"{{n}} failed": "{{n}}টি ব্যর্থ",
"Nothing deleted": "কিছুই মুছে ফেলা হয়নি",
"{{n}} downloaded": "{{n}}টি ডাউনলোড",
"{{n}} uploaded": "{{n}}টি আপলোড",
"{{n}} progress": "{{n}}টি অগ্রগতি",
"Up to date": "আপ টু ডেট",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "ডাউনলোড করা বই",
"Files uploaded": "আপলোড করা ফাইল",
"Configs uploaded": "আপলোড করা কনফিগ",
"Configs downloaded": "ডাউনলোড করা কনফিগ",
"Covers uploaded": "আপলোড করা কভার",
"Books deleted": "মুছে ফেলা বই",
"Files in sync": "সিঙ্কে থাকা ফাইল",
"Failures": "ব্যর্থতা",
"Total books": "মোট বই",
"Error:": "ত্রুটি:",
"Failed books": "ব্যর্থ বই",
"Deleted {{n}} book(s) from server.": "সার্ভার থেকে {{n}}টি বই মুছে ফেলা হয়েছে।",
"Failed to load directory": "ডিরেক্টরি লোড করতে ব্যর্থ",
"File download is only supported on the desktop and mobile apps.": "ফাইল ডাউনলোড শুধুমাত্র ডেস্কটপ এবং মোবাইল অ্যাপে সমর্থিত।",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "আপনি যে নিবন্ধটি পড়ছেন তা আপনার লাইব্রেরিতে পাঠাতে Readest ব্রাউজার এক্সটেনশন ইনস্টল করুন। এটি আপনার ব্রাউজার থেকে পৃষ্ঠাটি ক্লিপ করে যাতে পেওয়াল এবং লগইন-অনলি সাইটগুলিও কাজ করে।",
"Added to your library. It will sync to your other devices.": "আপনার লাইব্রেরিতে যোগ করা হয়েছে। এটি আপনার অন্যান্য ডিভাইসে সিঙ্ক হবে।",
"Sync passphrase forgotten. All encrypted fields cleared.": "সিঙ্ক পাসফ্রেজ ভুলে যাওয়া হয়েছে। সমস্ত এনক্রিপ্ট করা ফিল্ড পরিষ্কার করা হয়েছে।",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "শুধুমাত্র ম্যানুয়াল সিঙ্ক এবং পরিচ্ছন্নতা। পড়ার সময় স্বয়ংক্রিয় সিঙ্ক এখানে লগ হয় না।",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV সার্ভার থেকে {{n}}টি বই মুছে ফেলবেন?\n\nএটি শুধু রিমোট ফাইল মুছে; আপনার স্থানীয় লাইব্রেরি অপরিবর্তিত থাকে। মুছে ফেলা পূর্বাবস্থায় ফেরানো যাবে না। সার্ভারের ডেটা স্থায়ীভাবে চলে যাবে।",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "আপনার অন্যান্য ডিভাইসে বইয়ের ফাইল আপলোড করে।",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "ভুল সিঙ্ক পাসফ্রেজ। সিঙ্ক করা ক্রেডেনশিয়াল ডিক্রিপ্ট করা যায়নি।",
"Email books straight to your library": "ইমেইলের মাধ্যমে সরাসরি বই আপনার লাইব্রেরিতে পাঠান",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "অ্যাটাচমেন্ট এবং নিবন্ধগুলি আপনার ব্যক্তিগত Readest ঠিকানায় ফরওয়ার্ড করুন। Plus, Pro এবং Lifetime প্ল্যানে উপলব্ধ।",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "পড়ার অগ্রগতি, নোট এবং বুকমার্কও মুছে ফেলে।",
"Background Image (Library)": "ব্যাকগ্রাউন্ড ছবি (লাইব্রেরি)",
"Background Image (Reader)": "ব্যাকগ্রাউন্ড ছবি (রিডার)",
"updated metadata for {{n}} book(s)": "{{n}}টি বইয়ের মেটাডেটা আপডেট হয়েছে",
"{{n}} metadata": "{{n}} মেটাডেটা",
"Metadata updated": "মেটাডেটা আপডেট হয়েছে",
"Filter": "ফিল্টার",
"Sort by": "অনুসারে সাজান",
"Date modified": "পরিবর্তনের তারিখ",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "কন্ট্রাস্ট কমান",
"Reset Contrast": "কন্ট্রাস্ট রিসেট করুন",
"Increase Contrast": "কন্ট্রাস্ট বাড়ান",
"Google Drive session expired. Reconnect in Settings.": "Google Drive সেশনের মেয়াদ শেষ হয়ে গেছে। সেটিংসে পুনরায় সংযোগ করুন।",
"Cloud sync session expired. Reconnect in Settings.": "ক্লাউড সিঙ্ক সেশনের মেয়াদ শেষ হয়ে গেছে। সেটিংসে পুনরায় সংযোগ করুন।",
"Push": "পুশ",
"Slide": "স্লাইড",
"Page Curl": "পেজ কার্ল",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "পড়ার ভিউ থেকে স্বাধীনভাবে অভিধানের ফলাফলের টেক্সটের আকার নির্ধারণ করে।",
"Authentication failed. Reconnect in Settings.": "প্রমাণীকরণ ব্যর্থ হয়েছে। সেটিংসে পুনরায় সংযোগ করুন।",
"Full Sync": "সম্পূর্ণ সিঙ্ক",
"Re-check every book instead of only changed ones.": "শুধু পরিবর্তিত বই নয়, প্রতিটি বই পুনরায় পরীক্ষা করুন।",
"Waiting for sign-in…": "সাইন ইনের জন্য অপেক্ষা করা হচ্ছে…",
"Reconnect": "পুনরায় সংযোগ করুন",
"Connected as {{account}}": "{{account}} হিসেবে সংযুক্ত",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "উচ্চস্বরে পড়া ব্যাকগ্রাউন্ডে চলতে থাকবে",
"Stopped reading aloud": "উচ্চস্বরে পড়া বন্ধ করা হয়েছে",
"Read aloud stopped": "উচ্চস্বরে পড়া বন্ধ হয়েছে",
"Synced via {{provider}} {{time}}": "{{provider}}-এর মাধ্যমে {{time}} সিঙ্ক হয়েছে",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "বই {{provider}}-এর মাধ্যমে সিঙ্ক হয় - Readest Cloud স্টোরেজ ব্যবহৃত হয় না",
"Cloud provider switched": "ক্লাউড প্রদানকারী পরিবর্তিত হয়েছে",
"Synced via {{provider}}": "{{provider}}-এর মাধ্যমে সিঙ্ক হয়েছে",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} সিঙ্ক নির্বাচিত থাকাকালীন Readest Cloud-এ আপলোড স্থগিত থাকে",
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} আপনার ক্লাউড সিঙ্ক প্রদানকারী থাকাকালীন এটি {{provider}} দ্বারা পরিচালিত হয়",
"Not signed in": "সাইন ইন করা হয়নি",
"Active — syncing your library on this device": "সক্রিয় — এই ডিভাইসে আপনার লাইব্রেরি সিঙ্ক হচ্ছে",
"Paused — plan required": "স্থগিত — প্ল্যান প্রয়োজন",
"Active · Book file uploads off": "সক্রিয় · বইয়ের ফাইল আপলোড বন্ধ",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "আপনার অন্যান্য ডিভাইসে বইয়ের ফাইল আপলোড করে। এই প্রদানকারী নির্বাচিত থাকাকালীন Readest Cloud-এ আপলোড স্থগিত থাকে।",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV নির্বাচিত থাকাকালীন বই, অগ্রগতি এবং হাইলাইট শুধুমাত্র আপনার সার্ভারের সাথে সিঙ্ক হয়।",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "অ্যাপ সেটিংস, পড়ার পরিসংখ্যান এবং অভিধান সাইন ইন থাকাকালীন আপনার Readest অ্যাকাউন্টের মাধ্যমে সিঙ্ক হতে থাকে।",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive নির্বাচিত থাকাকালীন বই, অগ্রগতি এবং হাইলাইট শুধুমাত্র আপনার Drive-এর সাথে সিঙ্ক হয়।",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "আপনার লাইব্রেরি, পড়ার অগ্রগতি এবং হাইলাইটগুলি Readest Cloud-এর সাথে সিঙ্ক করুন।",
"Account and Storage": "অ্যাকাউন্ট এবং স্টোরেজ",
"Manage your plan and stored files": "আপনার প্ল্যান এবং সংরক্ষিত ফাইল পরিচালনা করুন",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "এই ডিভাইসে আপনার লাইব্রেরি — বই, অগ্রগতি, হাইলাইট — কোথায় সিঙ্ক হবে তা বেছে নিন। অ্যাপ সেটিংস, পড়ার পরিসংখ্যান এবং অভিধান সাইন ইন থাকাকালীন সর্বদা আপনার Readest অ্যাকাউন্টের সাথে সিঙ্ক হয়।",
"Cloud sync provider": "ক্লাউড সিঙ্ক প্রদানকারী",
"Use Readest Cloud": "Readest Cloud ব্যবহার করুন",
"Another device is still syncing this library via Readest Cloud": "অন্য একটি ডিভাইস এখনও Readest Cloud-এর মাধ্যমে এই লাইব্রেরি সিঙ্ক করছে",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}}টি আপলোড ব্যর্থ: অপর্যাপ্ত স্টোরেজ কোটা",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}}টি আপলোড ব্যর্থ: অপর্যাপ্ত স্টোরেজ কোটা"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}}টি আপলোড ব্যর্থ: অপর্যাপ্ত স্টোরেজ কোটা",
"Library sync via {{provider}}": "{{provider}} এর মাধ্যমে লাইব্রেরি সিঙ্ক",
"Google Drive session expired": "Google Drive সেশনের মেয়াদ শেষ হয়েছে",
"Cloud sync session expired": "ক্লাউড সিঙ্ক সেশনের মেয়াদ শেষ হয়েছে",
"Uploads book files to your other devices": "আপনার অন্যান্য ডিভাইসে বইয়ের ফাইল আপলোড করে",
"Re-check every book instead of only changed ones": "শুধু পরিবর্তিত নয়, প্রতিটি বই আবার যাচাই করুন",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "{{userDisplayName}} ནང་བསྐྱོད་བྱས་ཟིན།",
"Match Case": "ཡི་གེ་ཆེ་ཆུང་གི་དོ་མཚུངས།",
"Match Diacritics": "སྒྲ་གདངས་ཀྱི་དོ་མཚུངས།",
"Match Whole Words": "ཚིག་བྱང་ཆ་ཚང་གི་དོ་མཚུངས།",
"Maximum Number of Columns": "གྲལ་ཐིག་གི་གྲངས་ཀ།",
"Minimum Font Size": "ཡིག་ཆུང་ཤོས།",
"Monospace Font": "རྒྱ་ཁྱོན་འདྲ་བའི་ཡིག་གཟུགས།",
@@ -579,8 +578,6 @@
"Advanced Settings": "དབང་བསྐྱོད་སྒྲིག་སྟངས།",
"File count: {{size}}": "དེབ་གནས་བཅས་པའི་ཨང་། {{size}}",
"Background Read Aloud": "གནས་སྟངས་ཀྱིས་ཀློག་བྱེད།",
"Ready to read aloud": "དེབ་ཀྱི་སྤྱོད་བྱས་མ་ཐུབ།",
"Read Aloud": "ཀློག་བྱེད།",
"Screen Brightness": "རྒྱབ་སྐོར་གྱི་འོད་ཟེར།",
"Background Image": "གནས་སྟངས་ཀྱི་རི་མོ།",
"Import Image": "དེབ་གནས་བཅས་པའི་སྤྱོད་བྱས་མ་ཐུབ།",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV ངོ་སྤྲོད་མ་ཐུབ། སྒྲིག་སྡོད་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།",
"Downloading": "ཕབ་ལེན།",
"Uploading": "ཡར་འགོད།",
"downloaded {{n}} book(s)": "དཔེ་ཆ་{{n}}་ཕབ་ལེན་བྱས།",
"pushed {{n}} config(s)": "སྒྲིག་གཞི་{{n}}་སྐུར་སོང་།",
"uploaded {{n}} new file(s)": "ཡིག་ཆ་གསར་པ་{{n}}་ཡར་འགོད་བྱས།",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "མཉམ་སྦྲེལ་མ་ཐུབ་པ་{{failed}}་དང་བཅས་ཚར་སོང་། ཐུབ་པ་{{ok}}།",
"Sync complete": "མཉམ་སྦྲེལ་ཚར་སོང་།",
"Everything is already up to date.": "ཆ་ཚང་ཧ་ཅང་གསར་བ་ཡིན།",
"Browsing {{path}} on {{server}}": "{{server}} གི་ {{path}} ལ་བལྟ་བཞིན།",
"Connect to a WebDAV server to browse your remote files.": "རྒྱང་རིང་གི་ཡིག་ཆ་བལྟ་བར WebDAV རིམ་པ་ཟུང་འབྲེལ་ལ་འབྲེལ་མཐུད་གནང་།",
"WebDAV": "WebDAV",
"Upload Book Files": "དཔེ་ཆའི་ཡིག་ཆ་ཡར་འགོད།",
"Sync now": "ད་ལྟ་མཉམ་སྦྲེལ།",
@@ -1517,33 +1507,8 @@
"Show password": "གསང་ཨང་མངོན་པ།",
"Root Directory": "རྩ་བའི་སྡེ་ཚན།",
"Syncing…": "མཉམ་སྦྲེལ་བྱེད་བཞིན…",
"pulled progress for {{n}} book(s)": "དཔེ་ཆ་{{n}}་གི་འཐུས་གཤམ་འཐེན།",
"Sync History": "མཉམ་སྦྲེལ་ལོ་རྒྱུས།",
"Clear Sync History": "མཉམ་སྦྲེལ་ལོ་རྒྱུས་གཙང་འཕྱག",
"No manual syncs yet": "ལག་འཁྱེར་མཉམ་སྦྲེལ་མེད།",
"Partial": "ཕྱོགས་ཙམ།",
"Cleanup": "གཙང་སྦྲ།",
"Cleanup failed": "གཙང་སྦྲ་མ་ཐུབ།",
"Sync failed": "མཉམ་སྦྲེལ་མ་ཐུབ།",
"{{n}} deleted": "{{n}} བསུབ་སོང་།",
"{{n}} failed": "{{n}} མ་ཐུབ།",
"Nothing deleted": "གང་ཡང་མ་སུབ།",
"{{n}} downloaded": "{{n}} ཕབ་ལེན།",
"{{n}} uploaded": "{{n}} ཡར་འགོད།",
"{{n}} progress": "{{n}} མཐུན་འགྲོ།",
"Up to date": "གསར་བ་ཡིན།",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "ཕབ་ལེན་བྱས་པའི་དཔེ་ཆ།",
"Files uploaded": "ཡར་འགོད་བྱས་པའི་ཡིག་ཆ།",
"Configs uploaded": "ཡར་འགོད་བྱས་པའི་སྒྲིག་གཞི།",
"Configs downloaded": "ཕབ་ལེན་བྱས་པའི་སྒྲིག་གཞི།",
"Covers uploaded": "ཡར་འགོད་བྱས་པའི་ཕྱི་ཤོག",
"Books deleted": "བསུབ་པའི་དཔེ་ཆ།",
"Files in sync": "མཉམ་སྦྲེལ་ལ་ཡོད་པའི་ཡིག་ཆ།",
"Failures": "མ་ཐུབ་པ།",
"Total books": "དཔེ་ཆའི་སྡོམ།",
"Error:": "ནོར་འཁྲུལ:",
"Failed books": "མ་ཐུབ་པའི་དཔེ་ཆ།",
"Deleted {{n}} book(s) from server.": "རིམ་པ་ཟུང་འབྲེལ་ནས་དཔེ་ཆ་{{n}}་སུབ་པ།",
"Failed to load directory": "སྡེ་ཚན་འདྲེན་མ་ཐུབ།",
"File download is only supported on the desktop and mobile apps.": "ཡིག་ཆ་ཕབ་ལེན་ནི་ཀམ་པུ་ཊར་དང་ཁ་པར་གྱི་ཉེར་སྤྱོད་ཁོ་ནར་རྒྱབ་སྐྱོར་ཡོད།",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ཁྱེད་ཀློག་བཞིན་པའི་ཡིག་རྩོམ་དེ་དཔེ་མཛོད་དུ་སྐུར་བར་ Readest བརྡ་འགྲེམ་སྣོན་ལྡེ་སྒྲིག་འཛུགས་གནང་། འདིས་གསལ་ཤོག་ཁྱེད་ཀྱི་བརྡ་འགྲེམ་ནས་འདྲ་ཟློས་བྱས་ནས་སྦུག་ཁ་དང་ཐོ་འགོད་དགོས་པའི་གནས་ཚུལ་ཡང་ལས་ཀ་བྱེད་ཐུབ།",
"Added to your library. It will sync to your other devices.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དུ་བསྣན། འདི་ཁྱེད་ཀྱི་སྒྲིག་ཆས་གཞན་དག་ལ་མཉམ་སྦྲེལ་འགྱུར།",
"Sync passphrase forgotten. All encrypted fields cleared.": "མཉམ་སྦྲེལ་གསང་ཨང་བརྗེད་སོང་། གསང་སྦས་བྱས་པའི་ཁོངས་གཙང་འཕྱག་བྱས་ཟིན།",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "ལག་འཁྱེར་མཉམ་སྦྲེལ་དང་གཙང་སྦྲ་ཁོ་ན། ཀློག་སྐབས་ཀྱི་རང་འགུལ་མཉམ་སྦྲེལ་འདིར་ཐོ་འགོད་མི་བྱེད།",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV རིམ་པ་ཟུང་འབྲེལ་ནས་དཔེ་ཆ་{{n}}་སུབ་དགོས་སམ?\n\nའདིས་རྒྱང་རིང་གི་ཡིག་ཆ་ཁོ་ན་སུབ་པ་ཡིན། ཁྱེད་ཀྱི་ས་གནས་དཔེ་མཛོད་ལ་གནོད་མི་འགྱུར། སུབ་པ་འདི་ཕྱིར་ལོག་མི་ཐུབ། རིམ་པ་ཟུང་འབྲེལ་གྱི་ཟིན་བྲིས་གཏན་ནས་མེད་པར་འགྱུར།",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "དཔེ་ཆའི་ཡིག་ཆ་ཁྱེད་ཀྱི་སྒྲིག་ཆས་གཞན་པར་ཡར་འགོད་བྱེད།",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "མཉམ་སྦྲེལ་གསང་ཨང་ནོར་འདུག། མཉམ་སྦྲེལ་བྱས་པའི་ངོ་སྤྲོད་ཀྱི་གསང་སྒྲིག་འགྲོལ་མ་ཐུབ།",
"Email books straight to your library": "གློག་འཕྲིན་གྱིས་དཔེ་ཆ་ཁྱེད་ཀྱི་དཔེ་མཛོད་དུ་ཐད་ཀར་སྐུར།",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "མཉམ་སྦྱར་དང་ཡིག་རྩོམ་ཁྱེད་ཀྱི་སྒེར་གྱི་ Readest ས་གནས་སུ་གཏོང་། Plus, Pro, Lifetime འཆར་གཞི་ལ་ཐོབ་པ།",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "ཀློག་པའི་ཡར་འཕེལ་དང་། ཟིན་བྲིས། དཔེ་རྟགས་བཅས་ཀྱང་སུབ་པ།",
"Background Image (Library)": "གནས་སྟངས་ཀྱི་རི་མོ། (དེབ་མཛོད།)",
"Background Image (Reader)": "གནས་སྟངས་ཀྱི་རི་མོ། (ཀློག་ངོས།)",
"updated metadata for {{n}} book(s)": "དཔེ་ཆ་{{n}}་ཡི་གནད་སྨིན་གོ་དོན་གསར་བསྒྱུར་བྱས།",
"{{n}} metadata": "{{n}} གནད་སྨིན་གོ་དོན།",
"Metadata updated": "གནད་སྨིན་གོ་དོན་གསར་བསྒྱུར་བྱས།",
"Filter Annotations": "མཆན་འདེམས་སྒྲིག",
"Colors": "ཁ་དོག",
"Styles": "རྣམ་པ",
@@ -1798,8 +1758,6 @@
"Decrease Contrast": "བསྡུར་ཚད་ཆུང་དུ་གཏོང་།",
"Reset Contrast": "བསྡུར་ཚད་བསྐྱར་སྒྲིག",
"Increase Contrast": "བསྡུར་ཚད་ཆེ་རུ་གཏོང་།",
"Google Drive session expired. Reconnect in Settings.": "Google Drive ནང་བསྐྱོད་ཀྱི་དུས་ཡུན་རྫོགས་ཟིན། སྒྲིག་སྟངས་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།",
"Cloud sync session expired. Reconnect in Settings.": "སྤྲིན་མཉམ་སྒྲིག་གི་ནང་བསྐྱོད་དུས་ཡུན་རྫོགས་ཟིན། སྒྲིག་སྟངས་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།",
"Push": "འདེད་པ།",
"Slide": "བཤུད་པ།",
"Page Curl": "ཤོག་ལྷེ་སྒྲིལ་བ།",
@@ -1808,7 +1766,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "ཚིག་མཛོད་ཀྱི་འབྲས་བུའི་ཡི་གེའི་ཆེ་ཆུང་སྒྲིག་པ་དང་། ཀློག་པའི་ངོས་དང་འབྲེལ་བ་མེད།",
"Authentication failed. Reconnect in Settings.": "ངོ་སྤྲོད་མ་ཐུབ། སྒྲིག་སྟངས་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།",
"Full Sync": "ཡོངས་རྫོགས་མཉམ་སྒྲིག",
"Re-check every book instead of only changed ones.": "འགྱུར་བ་བྱུང་བའི་དཔེ་དེབ་ཁོ་ན་མིན་པར་དཔེ་དེབ་ཡོངས་ལ་བསྐྱར་ཞིབ་བྱེད།",
"Waiting for sign-in…": "ནང་བསྐྱོད་ལ་སྒུག་བཞིན་པ།…",
"Reconnect": "ཡང་བསྐྱར་འབྲེལ་མཐུད།",
"Connected as {{account}}": "{{account}} ཐོག་ནས་འབྲེལ་མཐུད་ཟིན།",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "སྒྲ་ཀློག་རྒྱབ་ལྗོངས་སུ་མུ་མཐུད་འགྲོ་བཞིན་ཡོད།",
"Stopped reading aloud": "སྒྲ་ཀློག་མཚམས་བཞག་ཟིན།",
"Read aloud stopped": "སྒྲ་ཀློག་མཚམས་ཆད་ཟིན།",
"Synced via {{provider}} {{time}}": "{{provider}} བརྒྱུད་ནས་ {{time}} མཉམ་སྒྲིག་བྱས་པ",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "དཔེ་ཆ་ {{provider}} བརྒྱུད་ནས་མཉམ་སྒྲིག་བྱེད་ - Readest Cloud ཉར་ཚགས་བེད་སྤྱོད་མི་བྱེད།",
"Cloud provider switched": "སྤྲིན་གྱི་ཞབས་ཞུ་བ་བརྗེས་ཟིན།",
"Synced via {{provider}}": "{{provider}} བརྒྱུད་ནས་མཉམ་སྒྲིག་བྱས་ཟིན།",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} མཉམ་སྒྲིག་འདེམས་ཡོད་རིང་ Readest Cloud ལ་ཡར་འགོད་མཚམས་འཇོག་ཡིན།",
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} ཁྱེད་ཀྱི་སྤྲིན་མཉམ་སྒྲིག་ཞབས་ཞུ་བ་ཡིན་རིང་དེས་དོ་དམ་བྱེད།",
"Not signed in": "ནང་འཛུལ་བྱས་མེད།",
"Active — syncing your library on this device": "བྱེད་བཞིན་པ་ — སྒྲིག་ཆས་འདིར་ཁྱེད་ཀྱི་དཔེ་མཛོད་མཉམ་སྒྲིག་བྱེད་བཞིན་པ།",
"Paused — plan required": "མཚམས་བཞག་པ་ — འཆར་གཞི་དགོས།",
"Active · Book file uploads off": "བྱེད་བཞིན་པ་ · དཔེ་ཆའི་ཡིག་ཆ་ཡར་འགོད་སྒོ་བརྒྱབ།",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "དཔེ་ཆའི་ཡིག་ཆ་ཁྱེད་ཀྱི་སྒྲིག་ཆས་གཞན་པར་ཡར་འགོད་བྱེད། ཞབས་ཞུ་བ་འདི་འདེམས་ཡོད་རིང་ Readest Cloud ལ་ཡར་འགོད་མཚམས་འཇོག་བྱེད།",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV འདེམས་ཡོད་རིང་ དཔེ་ཆ་དང་ཡར་འཕེལ། གཙོ་གནད་བཅས་ཁྱེད་ཀྱི་ཞབས་ཞུ་འཕྲུལ་ཆས་དང་ཁོ་ན་མཉམ་སྒྲིག་བྱེད།",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "ནང་འཛུལ་བྱས་ཡོད་རིང་ མཉེན་ཆས་སྒྲིག་འགོད་དང་ཀློག་པའི་སྡོམ་རྩིས། ཚིག་མཛོད་བཅས་ད་དུང་ Readest རྩིས་ཐོ་བརྒྱུད་ནས་མཉམ་སྒྲིག་བྱེད།",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive འདེམས་ཡོད་རིང་ དཔེ་ཆ་དང་ཡར་འཕེལ། གཙོ་གནད་བཅས་ཁྱེད་ཀྱི་ Drive དང་ཁོ་ན་མཉམ་སྒྲིག་བྱེད།",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དང་། ཀློག་པའི་ཡར་འཕེལ། གཙོ་གནད་བཅས་ Readest Cloud དང་མཉམ་སྒྲིག་བྱེད།",
"Account and Storage": "རྩིས་ཐོ་དང་ཉར་ཚགས།",
"Manage your plan and stored files": "ཁྱེད་ཀྱི་འཆར་གཞི་དང་ཉར་བའི་ཡིག་ཆ་དོ་དམ་བྱེད།",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "སྒྲིག་ཆས་འདིར་ཁྱེད་ཀྱི་དཔེ་མཛོད་ — དཔེ་ཆ། ཡར་འཕེལ། གཙོ་གནད་ — གང་དུ་མཉམ་སྒྲིག་བྱེད་མིན་འདེམས། ནང་འཛུལ་བྱས་ཡོད་རིང་ མཉེན་ཆས་སྒྲིག་འགོད་དང་ཀློག་པའི་སྡོམ་རྩིས། ཚིག་མཛོད་བཅས་རྟག་ཏུ་ Readest རྩིས་ཐོ་དང་མཉམ་སྒྲིག་བྱེད།",
"Cloud sync provider": "སྤྲིན་མཉམ་སྒྲིག་ཞབས་ཞུ་བ།",
"Use Readest Cloud": "Readest Cloud བེད་སྤྱོད་བྱེད།",
"Another device is still syncing this library via Readest Cloud": "སྒྲིག་ཆས་གཞན་ཞིག་གིས་ད་དུང་ Readest Cloud བརྒྱུད་ནས་དཔེ་མཛོད་འདི་མཉམ་སྒྲིག་བྱེད་བཞིན་འདུག",
"{{count}} uploads failed: insufficient storage quota_other": "ཡར་འགོད་ {{count}} མ་ཐུབ། སྤྲི་དོན་གྱི་ཉར་ཚགས་ས་ཁོངས་མི་འདང་།"
"{{count}} uploads failed: insufficient storage quota_other": "ཡར་འགོད་ {{count}} མ་ཐུབ། སྤྲི་དོན་གྱི་ཉར་ཚགས་ས་ཁོངས་མི་འདང་།",
"Library sync via {{provider}}": "{{provider}} བརྒྱུད་ནས་དཔེ་མཛོད་མཉམ་སྒྲིག",
"Google Drive session expired": "Google Drive ཡི་ཐེངས་གྲངས་ཀྱི་དུས་ཡོལ་སོང་",
"Cloud sync session expired": "སྤྲིན་གྱི་མཉམ་སྒྲིག་ཐེངས་གྲངས་ཀྱི་དུས་ཡོལ་སོང་",
"Uploads book files to your other devices": "དཔེ་ཆའི་ཡིག་ཆ་ཁྱེད་ཀྱི་སྒྲིག་ཆས་གཞན་ལ་ཡར་འཇུག་བྱེད",
"Re-check every book instead of only changed ones": "བསྒྱུར་བཅོས་བྱས་པ་ཁོ་ན་མིན་པར་དཔེ་ཆ་རེ་རེ་ཡང་བསྐྱར་ཞིབ་བཤེར",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Angemeldet als {{userDisplayName}}",
"Match Case": "Groß-/Kleinschreibung beachten",
"Match Diacritics": "Akzente beachten",
"Match Whole Words": "Ganze Wörter",
"Maximum Number of Columns": "Maximale Spaltenanzahl",
"Minimum Font Size": "Minimale Schriftgröße",
"Monospace Font": "Monospace-Schriftart",
@@ -583,8 +582,6 @@
"Advanced Settings": "Erweiterte Einstellungen",
"File count: {{size}}": "Dateianzahl: {{size}}",
"Background Read Aloud": "Hintergrund-Vorlesen",
"Ready to read aloud": "Bereit zum Vorlesen",
"Read Aloud": "Vorlesen",
"Screen Brightness": "Bildschirmhelligkeit",
"Background Image": "Hintergrundbild",
"Import Image": "Bild importieren",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV-Authentifizierung fehlgeschlagen. In den Einstellungen neu verbinden.",
"Downloading": "Herunterladen",
"Uploading": "Hochladen",
"downloaded {{n}} book(s)": "{{n}} Buch/Bücher heruntergeladen",
"pushed {{n}} config(s)": "{{n}} Konfiguration(en) hochgeladen",
"uploaded {{n}} new file(s)": "{{n}} neue Datei(en) hochgeladen",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronisierung mit {{failed}} Fehler(n) beendet. {{ok}} erfolgreich.",
"Sync complete": "Synchronisierung abgeschlossen",
"Everything is already up to date.": "Alles ist bereits aktuell.",
"Browsing {{path}} on {{server}}": "{{path}} auf {{server}} durchsuchen",
"Connect to a WebDAV server to browse your remote files.": "Verbinden Sie sich mit einem WebDAV-Server, um Ihre Remote-Dateien zu durchsuchen.",
"WebDAV": "WebDAV",
"Upload Book Files": "Buchdateien hochladen",
"Sync now": "Jetzt synchronisieren",
@@ -1546,33 +1536,8 @@
"Show password": "Passwort anzeigen",
"Root Directory": "Stammverzeichnis",
"Syncing…": "Synchronisierung…",
"pulled progress for {{n}} book(s)": "Fortschritt für {{n}} Buch/Bücher abgerufen",
"Sync History": "Synchronisationsverlauf",
"Clear Sync History": "Synchronisationsverlauf löschen",
"No manual syncs yet": "Noch keine manuellen Synchronisationen",
"Partial": "Teilweise",
"Cleanup": "Aufräumen",
"Cleanup failed": "Aufräumen fehlgeschlagen",
"Sync failed": "Synchronisierung fehlgeschlagen",
"{{n}} deleted": "{{n}} gelöscht",
"{{n}} failed": "{{n}} fehlgeschlagen",
"Nothing deleted": "Nichts gelöscht",
"{{n}} downloaded": "{{n}} heruntergeladen",
"{{n}} uploaded": "{{n}} hochgeladen",
"{{n}} progress": "{{n}} Fortschritt",
"Up to date": "Aktuell",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Heruntergeladene Bücher",
"Files uploaded": "Hochgeladene Dateien",
"Configs uploaded": "Hochgeladene Konfigurationen",
"Configs downloaded": "Heruntergeladene Konfigurationen",
"Covers uploaded": "Hochgeladene Cover",
"Books deleted": "Gelöschte Bücher",
"Files in sync": "Synchronisierte Dateien",
"Failures": "Fehler",
"Total books": "Bücher gesamt",
"Error:": "Fehler:",
"Failed books": "Fehlgeschlagene Bücher",
"Deleted {{n}} book(s) from server.": "{{n}} Buch/Bücher vom Server gelöscht.",
"Failed to load directory": "Verzeichnis konnte nicht geladen werden",
"File download is only supported on the desktop and mobile apps.": "Datei-Downloads werden nur in den Desktop- und Mobil-Apps unterstützt.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installieren Sie die Readest-Browsererweiterung, um den gerade gelesenen Artikel an Ihre Bibliothek zu senden. Sie schneidet die Seite aus Ihrem Browser aus, sodass auch kostenpflichtige und Login-pflichtige Sites funktionieren.",
"Added to your library. It will sync to your other devices.": "Zur Bibliothek hinzugefügt. Wird mit Ihren anderen Geräten synchronisiert.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Sync-Passphrase vergessen. Alle verschlüsselten Felder gelöscht.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Nur manuelle Synchronisationen und Aufräumvorgänge. Automatische Synchronisationen beim Lesen werden hier nicht protokolliert.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "{{n}} Buch/Bücher vom WebDAV-Server löschen?\n\nDamit werden nur die Remote-Dateien entfernt; Ihre lokale Bibliothek bleibt unverändert. Das Löschen kann nicht rückgängig gemacht werden. Die Bytes auf dem Server sind dauerhaft verloren.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Lädt Buchdateien auf Ihre anderen Geräte hoch.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Falsche Sync-Passphrase. Synchronisierte Anmeldedaten konnten nicht entschlüsselt werden.",
"Email books straight to your library": "Bücher direkt per E-Mail in Ihre Bibliothek senden",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Leiten Sie Anhänge und Artikel an Ihre private Readest-Adresse weiter. Verfügbar in den Plus-, Pro- und Lifetime-Tarifen.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "Löscht auch Lesefortschritt, Notizen und Lesezeichen.",
"Background Image (Library)": "Hintergrundbild (Bibliothek)",
"Background Image (Reader)": "Hintergrundbild (Leseansicht)",
"updated metadata for {{n}} book(s)": "Metadaten für {{n}} Buch/Bücher aktualisiert",
"{{n}} metadata": "{{n}} Metadaten",
"Metadata updated": "Metadaten aktualisiert",
"Filter": "Filtern",
"Sort by": "Sortieren nach",
"Date modified": "Änderungsdatum",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "Kontrast verringern",
"Reset Contrast": "Kontrast zurücksetzen",
"Increase Contrast": "Kontrast erhöhen",
"Google Drive session expired. Reconnect in Settings.": "Google Drive-Sitzung abgelaufen. In den Einstellungen erneut verbinden.",
"Cloud sync session expired. Reconnect in Settings.": "Cloud-Sync-Sitzung abgelaufen. In den Einstellungen erneut verbinden.",
"Push": "Schieben",
"Slide": "Gleiten",
"Page Curl": "Umblättern",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Legt die Textgröße der Wörterbuchergebnisse fest, unabhängig von der Leseansicht.",
"Authentication failed. Reconnect in Settings.": "Authentifizierung fehlgeschlagen. In den Einstellungen erneut verbinden.",
"Full Sync": "Vollständige Synchronisierung",
"Re-check every book instead of only changed ones.": "Alle Bücher erneut prüfen statt nur geänderte.",
"Waiting for sign-in…": "Warten auf Anmeldung…",
"Reconnect": "Erneut verbinden",
"Connected as {{account}}": "Verbunden als {{account}}",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "Das Vorlesen wird im Hintergrund fortgesetzt",
"Stopped reading aloud": "Vorlesen gestoppt",
"Read aloud stopped": "Vorlesen wurde gestoppt",
"Synced via {{provider}} {{time}}": "Synchronisiert über {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Bücher werden über {{provider}} synchronisiert - Readest-Cloud-Speicher wird nicht genutzt",
"Cloud provider switched": "Cloud-Anbieter gewechselt",
"Synced via {{provider}}": "Über {{provider}} synchronisiert",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Uploads zu Readest Cloud sind pausiert, solange die {{provider}}-Synchronisierung ausgewählt ist",
"Managed by {{provider}} while it is your cloud sync provider": "Wird von {{provider}} verwaltet, solange es Ihr Cloud-Sync-Anbieter ist",
"Not signed in": "Nicht angemeldet",
"Active — syncing your library on this device": "Aktiv — synchronisiert Ihre Bibliothek auf diesem Gerät",
"Paused — plan required": "Pausiert — Tarif erforderlich",
"Active · Book file uploads off": "Aktiv · Hochladen von Buchdateien aus",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Lädt Buchdateien auf Ihre anderen Geräte hoch. Uploads zu Readest Cloud sind pausiert, solange dieser Anbieter ausgewählt ist.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Solange WebDAV ausgewählt ist, werden Bücher, Lesefortschritt und Markierungen nur mit Ihrem Server synchronisiert.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "App-Einstellungen, Lesestatistiken und Wörterbücher werden weiterhin über Ihr Readest-Konto synchronisiert, solange Sie angemeldet sind.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Solange Google Drive ausgewählt ist, werden Bücher, Lesefortschritt und Markierungen nur mit Ihrem Drive synchronisiert.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchronisieren Sie Ihre Bibliothek, Ihren Lesefortschritt und Ihre Markierungen mit Readest Cloud.",
"Account and Storage": "Konto und Speicher",
"Manage your plan and stored files": "Tarif und gespeicherte Dateien verwalten",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Wählen Sie, wohin Ihre Bibliothek — Bücher, Lesefortschritt, Markierungen — auf diesem Gerät synchronisiert wird. App-Einstellungen, Lesestatistiken und Wörterbücher werden immer mit Ihrem Readest-Konto synchronisiert, solange Sie angemeldet sind.",
"Cloud sync provider": "Cloud-Sync-Anbieter",
"Use Readest Cloud": "Readest Cloud verwenden",
"Another device is still syncing this library via Readest Cloud": "Ein anderes Gerät synchronisiert diese Bibliothek weiterhin über Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} Upload fehlgeschlagen: unzureichendes Speicherkontingent",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} Uploads fehlgeschlagen: unzureichendes Speicherkontingent"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} Uploads fehlgeschlagen: unzureichendes Speicherkontingent",
"Library sync via {{provider}}": "Bibliothekssynchronisierung über {{provider}}",
"Google Drive session expired": "Google Drive-Sitzung abgelaufen",
"Cloud sync session expired": "Cloud-Synchronisierungssitzung abgelaufen",
"Uploads book files to your other devices": "Lädt Buchdateien auf deine anderen Geräte hoch",
"Re-check every book instead of only changed ones": "Jedes Buch erneut prüfen statt nur geänderte",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Συνδεδεμένος ως {{userDisplayName}}",
"Match Case": "Ταίριασμα πεζών-κεφαλαίων",
"Match Diacritics": "Ταίριασμα διακριτικών σημείων",
"Match Whole Words": "Ταίριασμα ολόκληρων λέξεων",
"Maximum Number of Columns": "Μέγιστος αριθμός στηλών",
"Minimum Font Size": "Ελάχιστο μέγεθος γραμματοσειράς",
"Monospace Font": "Γραμματοσειρά σταθερού πλάτους",
@@ -583,8 +582,6 @@
"Advanced Settings": "Προηγμένες ρυθμίσεις",
"File count: {{size}}": "Αριθμός αρχείων: {{size}}",
"Background Read Aloud": "Ανάγνωση στο παρασκήνιο",
"Ready to read aloud": "Έτοιμο για ανάγνωση",
"Read Aloud": "Ανάγνωση",
"Screen Brightness": "Φωτεινότητα οθόνης",
"Background Image": "Εικόνα φόντου",
"Import Image": "Εισαγωγή εικόνας",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Η αυθεντικοποίηση WebDAV απέτυχε. Επανασυνδεθείτε στις Ρυθμίσεις.",
"Downloading": "Λήψη",
"Uploading": "Μεταφόρτωση",
"downloaded {{n}} book(s)": "λήφθηκαν {{n}} βιβλία",
"pushed {{n}} config(s)": "στάλθηκαν {{n}} διαμορφώσεις",
"uploaded {{n}} new file(s)": "μεταφορτώθηκαν {{n}} νέα αρχεία",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Ο συγχρονισμός ολοκληρώθηκε με {{failed}} αποτυχίες. {{ok}} επιτυχείς.",
"Sync complete": "Ο συγχρονισμός ολοκληρώθηκε",
"Everything is already up to date.": "Όλα είναι ήδη ενημερωμένα.",
"Browsing {{path}} on {{server}}": "Περιήγηση στο {{path}} στο {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Συνδεθείτε σε έναν διακομιστή WebDAV για να περιηγηθείτε στα απομακρυσμένα αρχεία σας.",
"WebDAV": "WebDAV",
"Upload Book Files": "Μεταφόρτωση αρχείων βιβλίων",
"Sync now": "Συγχρονισμός τώρα",
@@ -1546,33 +1536,8 @@
"Show password": "Εμφάνιση κωδικού",
"Root Directory": "Ριζικός φάκελος",
"Syncing…": "Συγχρονισμός…",
"pulled progress for {{n}} book(s)": "λήψη προόδου για {{n}} βιβλία",
"Sync History": "Ιστορικό συγχρονισμού",
"Clear Sync History": "Εκκαθάριση ιστορικού συγχρονισμού",
"No manual syncs yet": "Δεν υπάρχουν χειροκίνητοι συγχρονισμοί ακόμη",
"Partial": "Μερικό",
"Cleanup": "Εκκαθάριση",
"Cleanup failed": "Η εκκαθάριση απέτυχε",
"Sync failed": "Ο συγχρονισμός απέτυχε",
"{{n}} deleted": "{{n}} διαγράφηκαν",
"{{n}} failed": "{{n}} απέτυχαν",
"Nothing deleted": "Δεν διαγράφηκε τίποτα",
"{{n}} downloaded": "{{n}} έγιναν λήψη",
"{{n}} uploaded": "{{n}} μεταφορτώθηκαν",
"{{n}} progress": "{{n}} πρόοδος",
"Up to date": "Ενημερωμένο",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Βιβλία που λήφθηκαν",
"Files uploaded": "Αρχεία που μεταφορτώθηκαν",
"Configs uploaded": "Διαμορφώσεις που μεταφορτώθηκαν",
"Configs downloaded": "Διαμορφώσεις που λήφθηκαν",
"Covers uploaded": "Εξώφυλλα που μεταφορτώθηκαν",
"Books deleted": "Διαγραμμένα βιβλία",
"Files in sync": "Συγχρονισμένα αρχεία",
"Failures": "Αποτυχίες",
"Total books": "Σύνολο βιβλίων",
"Error:": "Σφάλμα:",
"Failed books": "Βιβλία με αποτυχία",
"Deleted {{n}} book(s) from server.": "Διαγράφηκαν {{n}} βιβλία από τον διακομιστή.",
"Failed to load directory": "Αποτυχία φόρτωσης φακέλου",
"File download is only supported on the desktop and mobile apps.": "Η λήψη αρχείων υποστηρίζεται μόνο στις εφαρμογές υπολογιστή και κινητού.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Εγκαταστήστε την επέκταση προγράμματος περιήγησης Readest για να στείλετε το άρθρο που διαβάζετε στη βιβλιοθήκη σας. Αποκόπτει τη σελίδα από το πρόγραμμα περιήγησης ώστε να λειτουργούν ακόμη και ιστότοποι επί πληρωμή ή με υποχρεωτική σύνδεση.",
"Added to your library. It will sync to your other devices.": "Προστέθηκε στη βιβλιοθήκη σας. Θα συγχρονιστεί με τις άλλες σας συσκευές.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Η συνθηματική φράση συγχρονισμού λησμονήθηκε. Όλα τα κρυπτογραφημένα πεδία διαγράφηκαν.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Μόνο χειροκίνητοι συγχρονισμοί και εκκαθαρίσεις. Οι αυτόματοι συγχρονισμοί κατά την ανάγνωση δεν καταγράφονται εδώ.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Διαγραφή {{n}} βιβλίων από τον διακομιστή WebDAV;\n\nΑυτό αφαιρεί μόνο τα απομακρυσμένα αρχεία· η τοπική σας βιβλιοθήκη παραμένει ανέπαφη. Η διαγραφή είναι μη αναστρέψιμη. Τα δεδομένα στον διακομιστή θα χαθούν οριστικά.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Μεταφορτώνει αρχεία βιβλίων στις άλλες συσκευές σας.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Λανθασμένη συνθηματική φράση συγχρονισμού. Δεν ήταν δυνατή η αποκρυπτογράφηση των συγχρονισμένων διαπιστευτηρίων.",
"Email books straight to your library": "Στείλτε βιβλία απευθείας στη βιβλιοθήκη σας μέσω email",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Προωθήστε συνημμένα και άρθρα στην ιδιωτική σας διεύθυνση Readest. Διαθέσιμο στα πλάνα Plus, Pro και Lifetime.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "Διαγράφει επίσης την πρόοδο ανάγνωσης, τις σημειώσεις και τους σελιδοδείκτες.",
"Background Image (Library)": "Εικόνα φόντου (Βιβλιοθήκη)",
"Background Image (Reader)": "Εικόνα φόντου (Προβολή ανάγνωσης)",
"updated metadata for {{n}} book(s)": "ενημερώθηκαν τα μεταδεδομένα για {{n}} βιβλίο/α",
"{{n}} metadata": "{{n}} μεταδεδομένα",
"Metadata updated": "Ενημερωμένα μεταδεδομένα",
"Filter": "Φιλτράρισμα",
"Sort by": "Ταξινόμηση κατά",
"Date modified": "Ημερομηνία τροποποίησης",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "Μείωση αντίθεσης",
"Reset Contrast": "Επαναφορά αντίθεσης",
"Increase Contrast": "Αύξηση αντίθεσης",
"Google Drive session expired. Reconnect in Settings.": "Η συνεδρία Google Drive έληξε. Επανασυνδεθείτε στις Ρυθμίσεις.",
"Cloud sync session expired. Reconnect in Settings.": "Η συνεδρία συγχρονισμού cloud έληξε. Επανασυνδεθείτε στις Ρυθμίσεις.",
"Push": "Ώθηση",
"Slide": "Ολίσθηση",
"Page Curl": "Γύρισμα σελίδας",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Ορίζει το μέγεθος κειμένου των αποτελεσμάτων λεξικού, ανεξάρτητα από την προβολή ανάγνωσης.",
"Authentication failed. Reconnect in Settings.": "Ο έλεγχος ταυτότητας απέτυχε. Επανασυνδεθείτε στις Ρυθμίσεις.",
"Full Sync": "Πλήρης συγχρονισμός",
"Re-check every book instead of only changed ones.": "Επανέλεγχος όλων των βιβλίων αντί μόνο όσων άλλαξαν.",
"Waiting for sign-in…": "Αναμονή για σύνδεση…",
"Reconnect": "Επανασύνδεση",
"Connected as {{account}}": "Έχετε συνδεθεί ως {{account}}",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "Η ανάγνωση συνεχίζεται στο παρασκήνιο",
"Stopped reading aloud": "Η ανάγνωση σταμάτησε",
"Read aloud stopped": "Η ανάγνωση διακόπηκε",
"Synced via {{provider}} {{time}}": "Συγχρονίστηκε μέσω {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Τα βιβλία συγχρονίζονται μέσω {{provider}} - ο αποθηκευτικός χώρος του Readest Cloud δεν χρησιμοποιείται",
"Cloud provider switched": "Ο πάροχος cloud άλλαξε",
"Synced via {{provider}}": "Συγχρονίστηκε μέσω {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Οι μεταφορτώσεις στο Readest Cloud είναι σε παύση όσο είναι επιλεγμένος ο συγχρονισμός {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "Διαχειρίζεται από το {{provider}} όσο είναι ο πάροχος συγχρονισμού cloud σας",
"Not signed in": "Δεν έχετε συνδεθεί",
"Active — syncing your library on this device": "Ενεργό — συγχρονίζει τη βιβλιοθήκη σας σε αυτήν τη συσκευή",
"Paused — plan required": "Σε παύση — απαιτείται πρόγραμμα",
"Active · Book file uploads off": "Ενεργό · Η μεταφόρτωση αρχείων βιβλίων είναι ανενεργή",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Μεταφορτώνει αρχεία βιβλίων στις άλλες συσκευές σας. Οι μεταφορτώσεις στο Readest Cloud είναι σε παύση όσο είναι επιλεγμένος αυτός ο πάροχος.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Όσο είναι επιλεγμένο το WebDAV, τα βιβλία, η πρόοδος και οι επισημάνσεις συγχρονίζονται μόνο με τον διακομιστή σας.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Οι ρυθμίσεις της εφαρμογής, τα στατιστικά ανάγνωσης και τα λεξικά εξακολουθούν να συγχρονίζονται μέσω του λογαριασμού Readest όσο είστε συνδεδεμένοι.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Όσο είναι επιλεγμένο το Google Drive, τα βιβλία, η πρόοδος και οι επισημάνσεις συγχρονίζονται μόνο με το Drive σας.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Συγχρονίστε τη βιβλιοθήκη, την πρόοδο ανάγνωσης και τις επισημάνσεις σας με το Readest Cloud.",
"Account and Storage": "Λογαριασμός και αποθήκευση",
"Manage your plan and stored files": "Διαχειριστείτε το πρόγραμμα και τα αποθηκευμένα αρχεία σας",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Επιλέξτε πού συγχρονίζεται η βιβλιοθήκη σας — βιβλία, πρόοδος, επισημάνσεις — σε αυτήν τη συσκευή. Οι ρυθμίσεις της εφαρμογής, τα στατιστικά ανάγνωσης και τα λεξικά συγχρονίζονται πάντα με τον λογαριασμό Readest όσο είστε συνδεδεμένοι.",
"Cloud sync provider": "Πάροχος συγχρονισμού cloud",
"Use Readest Cloud": "Χρήση του Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Μια άλλη συσκευή εξακολουθεί να συγχρονίζει αυτήν τη βιβλιοθήκη μέσω Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} μεταφόρτωση απέτυχε: ανεπαρκές όριο αποθήκευσης",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} μεταφορτώσεις απέτυχαν: ανεπαρκές όριο αποθήκευσης"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} μεταφορτώσεις απέτυχαν: ανεπαρκές όριο αποθήκευσης",
"Library sync via {{provider}}": "Συγχρονισμός βιβλιοθήκης μέσω {{provider}}",
"Google Drive session expired": "Η συνεδρία του Google Drive έληξε",
"Cloud sync session expired": "Η συνεδρία συγχρονισμού cloud έληξε",
"Uploads book files to your other devices": "Μεταφορτώνει αρχεία βιβλίων στις άλλες συσκευές σας",
"Re-check every book instead of only changed ones": "Επανέλεγχος κάθε βιβλίου αντί μόνο των αλλαγμένων",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Sesión iniciada como {{userDisplayName}}",
"Match Case": "Coincidir mayúsculas y minúsculas",
"Match Diacritics": "Coincidir diacríticos",
"Match Whole Words": "Coincidir palabras completas",
"Maximum Number of Columns": "Número máximo de columnas",
"Minimum Font Size": "Tamaño de fuente mínimo",
"Monospace Font": "Fuente monoespaciada",
@@ -587,8 +586,6 @@
"Advanced Settings": "Configuraciones Avanzadas",
"File count: {{size}}": "Número de archivos: {{size}}",
"Background Read Aloud": "Lectura en segundo plano",
"Ready to read aloud": "Listo para leer en voz alta",
"Read Aloud": "Leer en voz alta",
"Screen Brightness": "Brillo de pantalla",
"Background Image": "Imagen de fondo",
"Import Image": "Importar imagen",
@@ -1560,14 +1557,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Autenticación WebDAV fallida. Vuelve a conectar en Ajustes.",
"Downloading": "Descargando",
"Uploading": "Subiendo",
"downloaded {{n}} book(s)": "{{n}} libro(s) descargado(s)",
"pushed {{n}} config(s)": "{{n}} configuración(es) enviada(s)",
"uploaded {{n}} new file(s)": "{{n}} archivo(s) nuevo(s) subido(s)",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronización finalizada con {{failed}} error(es). {{ok}} correctos.",
"Sync complete": "Sincronización completa",
"Everything is already up to date.": "Todo está actualizado.",
"Browsing {{path}} on {{server}}": "Explorando {{path}} en {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Conéctate a un servidor WebDAV para explorar tus archivos remotos.",
"WebDAV": "WebDAV",
"Upload Book Files": "Subir archivos de libros",
"Sync now": "Sincronizar ahora",
@@ -1575,33 +1565,8 @@
"Show password": "Mostrar contraseña",
"Root Directory": "Directorio raíz",
"Syncing…": "Sincronizando…",
"pulled progress for {{n}} book(s)": "progreso de {{n}} libro(s) recuperado",
"Sync History": "Historial de sincronización",
"Clear Sync History": "Borrar historial de sincronización",
"No manual syncs yet": "Aún no hay sincronizaciones manuales",
"Partial": "Parcial",
"Cleanup": "Limpieza",
"Cleanup failed": "Limpieza fallida",
"Sync failed": "Sincronización fallida",
"{{n}} deleted": "{{n}} eliminados",
"{{n}} failed": "{{n}} con error",
"Nothing deleted": "No se eliminó nada",
"{{n}} downloaded": "{{n}} descargados",
"{{n}} uploaded": "{{n}} subidos",
"{{n}} progress": "{{n}} de progreso",
"Up to date": "Al día",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Libros descargados",
"Files uploaded": "Archivos subidos",
"Configs uploaded": "Configuraciones subidas",
"Configs downloaded": "Configuraciones descargadas",
"Covers uploaded": "Portadas subidas",
"Books deleted": "Libros eliminados",
"Files in sync": "Archivos sincronizados",
"Failures": "Errores",
"Total books": "Libros totales",
"Error:": "Error:",
"Failed books": "Libros con error",
"Deleted {{n}} book(s) from server.": "Se eliminaron {{n}} libro(s) del servidor.",
"Failed to load directory": "No se pudo cargar el directorio",
"File download is only supported on the desktop and mobile apps.": "La descarga de archivos solo es compatible con las aplicaciones de escritorio y móvil.",
@@ -1630,10 +1595,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instala la extensión del navegador de Readest para enviar el artículo que estás leyendo a tu biblioteca. Recorta la página desde tu navegador para que los sitios con muro de pago o que requieren inicio de sesión funcionen.",
"Added to your library. It will sync to your other devices.": "Añadido a tu biblioteca. Se sincronizará con tus otros dispositivos.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Frase de paso de sincronización olvidada. Se borraron todos los campos cifrados.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Solo sincronizaciones manuales y limpiezas. Las sincronizaciones automáticas durante la lectura no se registran aquí.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "¿Eliminar {{n}} libro(s) del servidor WebDAV?\n\nEsto solo elimina los archivos remotos; tu biblioteca local no se verá afectada. La eliminación no se puede deshacer. Los bytes en el servidor desaparecerán permanentemente.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Sube los archivos de libros a tus otros dispositivos.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frase de paso de sincronización incorrecta. No se pudieron descifrar las credenciales sincronizadas.",
"Email books straight to your library": "Envía libros por correo directamente a tu biblioteca",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Reenvía archivos adjuntos y artículos a tu dirección privada de Readest. Disponible en los planes Plus, Pro y Lifetime.",
@@ -1825,9 +1788,6 @@
"Also erase reading progress, notes, and bookmarks.": "También borra el progreso de lectura, las notas y los marcadores.",
"Background Image (Library)": "Imagen de fondo (Biblioteca)",
"Background Image (Reader)": "Imagen de fondo (Lector)",
"updated metadata for {{n}} book(s)": "metadatos actualizados de {{n}} libro(s)",
"{{n}} metadata": "{{n}} metadatos",
"Metadata updated": "Metadatos actualizados",
"Filter": "Filtrar",
"Sort by": "Ordenar por",
"Date modified": "Fecha de modificación",
@@ -1872,8 +1832,6 @@
"Decrease Contrast": "Disminuir contraste",
"Reset Contrast": "Restablecer contraste",
"Increase Contrast": "Aumentar contraste",
"Google Drive session expired. Reconnect in Settings.": "La sesión de Google Drive ha caducado. Vuelve a conectar en Ajustes.",
"Cloud sync session expired. Reconnect in Settings.": "La sesión de sincronización en la nube ha caducado. Vuelve a conectar en Ajustes.",
"Push": "Empuje",
"Slide": "Deslizamiento",
"Page Curl": "Curvatura de página",
@@ -1882,7 +1840,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Establece el tamaño del texto de los resultados del diccionario, independiente de la vista de lectura.",
"Authentication failed. Reconnect in Settings.": "Autenticación fallida. Vuelve a conectar en Ajustes.",
"Full Sync": "Sincronización total",
"Re-check every book instead of only changed ones.": "Vuelve a comprobar todos los libros, no solo los modificados.",
"Waiting for sign-in…": "Esperando el inicio de sesión…",
"Reconnect": "Volver a conectar",
"Connected as {{account}}": "Conectado como {{account}}",
@@ -1907,17 +1864,13 @@
"Reading aloud continues in the background": "La lectura en voz alta continúa en segundo plano",
"Stopped reading aloud": "Lectura en voz alta detenida",
"Read aloud stopped": "Lectura en voz alta detenida",
"Synced via {{provider}} {{time}}": "Sincronizado vía {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Los libros se sincronizan vía {{provider}} - no se usa el almacenamiento de Readest Cloud",
"Cloud provider switched": "Proveedor de nube cambiado",
"Synced via {{provider}}": "Sincronizado vía {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Las subidas a Readest Cloud están en pausa mientras la sincronización con {{provider}} esté seleccionada",
"Managed by {{provider}} while it is your cloud sync provider": "Gestionado por {{provider}} mientras sea tu proveedor de sincronización en la nube",
"Not signed in": "Sesión no iniciada",
"Active — syncing your library on this device": "Activo — sincronizando tu biblioteca en este dispositivo",
"Paused — plan required": "En pausa — se requiere un plan",
"Active · Book file uploads off": "Activo · Subida de archivos de libros desactivada",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Sube los archivos de libros a tus otros dispositivos. Las subidas a Readest Cloud se pausan mientras este proveedor esté seleccionado.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Mientras WebDAV esté seleccionado, los libros, el progreso y los resaltados se sincronizan solo con tu servidor.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Los ajustes de la aplicación, las estadísticas de lectura y los diccionarios se siguen sincronizando a través de tu cuenta de Readest mientras tengas la sesión iniciada.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Mientras Google Drive esté seleccionado, los libros, el progreso y los resaltados se sincronizan solo con tu Drive.",
@@ -1925,11 +1878,16 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincroniza tu biblioteca, progreso de lectura y resaltados con Readest Cloud.",
"Account and Storage": "Cuenta y almacenamiento",
"Manage your plan and stored files": "Gestiona tu plan y tus archivos almacenados",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Elige dónde se sincroniza tu biblioteca — libros, progreso, resaltados — en este dispositivo. Los ajustes de la aplicación, las estadísticas de lectura y los diccionarios se sincronizan siempre con tu cuenta de Readest mientras tengas la sesión iniciada.",
"Cloud sync provider": "Proveedor de sincronización en la nube",
"Use Readest Cloud": "Usar Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Otro dispositivo sigue sincronizando esta biblioteca vía Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} subida fallida: cuota de almacenamiento insuficiente",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} subidas fallidas: cuota de almacenamiento insuficiente",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} subidas fallidas: cuota de almacenamiento insuficiente"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} subidas fallidas: cuota de almacenamiento insuficiente",
"Library sync via {{provider}}": "Sincronización de la biblioteca mediante {{provider}}",
"Google Drive session expired": "La sesión de Google Drive ha caducado",
"Cloud sync session expired": "La sesión de sincronización en la nube ha caducado",
"Uploads book files to your other devices": "Sube los archivos de libros a tus otros dispositivos",
"Re-check every book instead of only changed ones": "Volver a comprobar cada libro en lugar de solo los modificados",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "شما با نام «{{userDisplayName}}» وارد شده‌اید",
"Match Case": "تطابق حروف بزرگ/کوچک",
"Match Diacritics": "تطابق اعراب",
"Match Whole Words": "تطابق کل کلمات",
"Maximum Number of Columns": "حداکثر تعداد ستون‌ها",
"Minimum Font Size": "حداقل اندازه فونت",
"Monospace Font": "فونت تک‌فاصله (Monospace)",
@@ -583,8 +582,6 @@
"Advanced Settings": "تنظیمات پیشرفته",
"File count: {{size}}": "تعداد فایل‌ها: {{size}}",
"Background Read Aloud": "خواندن با صدای بلند در پس‌زمینه",
"Ready to read aloud": "آماده برای خواندن با صدای بلند",
"Read Aloud": "خواندن با صدای بلند",
"Screen Brightness": "روشنایی صفحه",
"Background Image": "تصویر پس‌زمینه",
"Import Image": "وارد کردن تصویر",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "احراز هویت WebDAV ناموفق بود. در تنظیمات دوباره متصل شوید.",
"Downloading": "دانلود",
"Uploading": "بارگذاری",
"downloaded {{n}} book(s)": "{{n}} کتاب دانلود شد",
"pushed {{n}} config(s)": "{{n}} پیکربندی ارسال شد",
"uploaded {{n}} new file(s)": "{{n}} فایل جدید بارگذاری شد",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "همگام‌سازی با {{failed}} خطا پایان یافت. {{ok}} موفق.",
"Sync complete": "همگام‌سازی کامل شد",
"Everything is already up to date.": "همه چیز از قبل به‌روز است.",
"Browsing {{path}} on {{server}}": "مرور {{path}} در {{server}}",
"Connect to a WebDAV server to browse your remote files.": "برای مرور فایل‌های راه‌دور خود به یک سرور WebDAV متصل شوید.",
"WebDAV": "WebDAV",
"Upload Book Files": "بارگذاری فایل‌های کتاب",
"Sync now": "همگام‌سازی اکنون",
@@ -1546,33 +1536,8 @@
"Show password": "نمایش رمز عبور",
"Root Directory": "دایرکتوری اصلی",
"Syncing…": "در حال همگام‌سازی…",
"pulled progress for {{n}} book(s)": "پیشرفت {{n}} کتاب دریافت شد",
"Sync History": "تاریخچه همگام‌سازی",
"Clear Sync History": "پاک کردن تاریخچه همگام‌سازی",
"No manual syncs yet": "هنوز همگام‌سازی دستی انجام نشده",
"Partial": "جزئی",
"Cleanup": "پاک‌سازی",
"Cleanup failed": "پاک‌سازی ناموفق",
"Sync failed": "همگام‌سازی ناموفق بود",
"{{n}} deleted": "{{n}} حذف‌شده",
"{{n}} failed": "{{n}} ناموفق",
"Nothing deleted": "چیزی حذف نشد",
"{{n}} downloaded": "{{n}} دانلودشده",
"{{n}} uploaded": "{{n}} بارگذاری‌شده",
"{{n}} progress": "{{n}} پیشرفت",
"Up to date": "به‌روز",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "کتاب‌های دانلودشده",
"Files uploaded": "فایل‌های بارگذاری‌شده",
"Configs uploaded": "پیکربندی‌های بارگذاری‌شده",
"Configs downloaded": "پیکربندی‌های دانلودشده",
"Covers uploaded": "جلدهای بارگذاری‌شده",
"Books deleted": "کتاب‌های حذف‌شده",
"Files in sync": "فایل‌های همگام‌شده",
"Failures": "خطاها",
"Total books": "مجموع کتاب‌ها",
"Error:": "خطا:",
"Failed books": "کتاب‌های ناموفق",
"Deleted {{n}} book(s) from server.": "{{n}} کتاب از سرور حذف شد.",
"Failed to load directory": "بارگذاری پوشه ناموفق بود",
"File download is only supported on the desktop and mobile apps.": "دانلود فایل تنها در برنامه‌های دسکتاپ و موبایل پشتیبانی می‌شود.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "افزونه مرورگر Readest را نصب کنید تا مقاله‌ای را که می‌خوانید به کتابخانه‌تان بفرستید. صفحه را از مرورگر شما برش می‌دهد تا سایت‌های پولی و نیازمند ورود نیز کار کنند.",
"Added to your library. It will sync to your other devices.": "به کتابخانه شما اضافه شد. با سایر دستگاه‌های شما همگام می‌شود.",
"Sync passphrase forgotten. All encrypted fields cleared.": "عبارت عبور همگام‌سازی فراموش شد. تمام فیلدهای رمزگذاری‌شده پاک شدند.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "فقط همگام‌سازی‌های دستی و پاک‌سازی‌ها. همگام‌سازی‌های خودکار هنگام مطالعه اینجا ثبت نمی‌شوند.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "{{n}} کتاب از سرور WebDAV حذف شود؟\n\nاین فقط فایل‌های راه‌دور را حذف می‌کند؛ کتابخانه محلی شما دست‌نخورده می‌ماند. حذف غیرقابل بازگشت است. داده‌های روی سرور برای همیشه از بین می‌رود.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "فایل‌های کتاب را به دستگاه‌های دیگر شما بارگذاری می‌کند.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "عبارت عبور همگام‌سازی نادرست است. اعتبارنامه‌های همگام‌شده قابل رمزگشایی نبودند.",
"Email books straight to your library": "کتاب‌ها را مستقیماً به کتابخانه‌تان ایمیل کنید",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "پیوست‌ها و مقالات را به آدرس خصوصی Readest خود ارسال کنید. در پلن‌های Plus، Pro و Lifetime در دسترس است.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "همچنین وضعیت مطالعه، یادداشت‌ها و نشانک‌ها را پاک می‌کند.",
"Background Image (Library)": "تصویر پس‌زمینه (کتابخانه)",
"Background Image (Reader)": "تصویر پس‌زمینه (صفحه مطالعه)",
"updated metadata for {{n}} book(s)": "متادیتای {{n}} کتاب به‌روزرسانی شد",
"{{n}} metadata": "{{n}} متادیتا",
"Metadata updated": "متادیتا به‌روزرسانی شد",
"Filter": "فیلتر",
"Sort by": "مرتب‌سازی بر اساس",
"Date modified": "تاریخ تغییر",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "کاهش کنتراست",
"Reset Contrast": "بازنشانی کنتراست",
"Increase Contrast": "افزایش کنتراست",
"Google Drive session expired. Reconnect in Settings.": "نشست Google Drive منقضی شده است. در تنظیمات دوباره متصل شوید.",
"Cloud sync session expired. Reconnect in Settings.": "نشست همگام‌سازی ابری منقضی شده است. در تنظیمات دوباره متصل شوید.",
"Push": "هل دادن",
"Slide": "لغزش",
"Page Curl": "پیچش صفحه",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "اندازه متن نتایج فرهنگ لغت را مستقل از نمای مطالعه تنظیم می‌کند.",
"Authentication failed. Reconnect in Settings.": "احراز هویت ناموفق بود. در تنظیمات دوباره متصل شوید.",
"Full Sync": "همگام‌سازی کامل",
"Re-check every book instead of only changed ones.": "بررسی دوباره همه کتاب‌ها به‌جای فقط کتاب‌های تغییرکرده.",
"Waiting for sign-in…": "در انتظار ورود…",
"Reconnect": "اتصال دوباره",
"Connected as {{account}}": "متصل به‌عنوان {{account}}",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "خواندن با صدای بلند در پس‌زمینه ادامه می‌یابد",
"Stopped reading aloud": "خواندن با صدای بلند متوقف شد",
"Read aloud stopped": "خواندن با صدای بلند متوقف شده است",
"Synced via {{provider}} {{time}}": "از طریق {{provider}} در {{time}} همگام‌سازی شد",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "کتاب‌ها از طریق {{provider}} همگام‌سازی می‌شوند - از فضای ذخیره‌سازی Readest Cloud استفاده نمی‌شود",
"Cloud provider switched": "ارائه‌دهنده ابری تغییر کرد",
"Synced via {{provider}}": "از طریق {{provider}} همگام‌سازی شد",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "تا زمانی که همگام‌سازی {{provider}} انتخاب شده باشد، بارگذاری در Readest Cloud متوقف است",
"Managed by {{provider}} while it is your cloud sync provider": "تا زمانی که {{provider}} ارائه‌دهنده همگام‌سازی ابری شماست، توسط آن مدیریت می‌شود",
"Not signed in": "وارد نشده‌اید",
"Active — syncing your library on this device": "فعال — در حال همگام‌سازی کتابخانه شما در این دستگاه",
"Paused — plan required": "متوقف شده — به طرح اشتراک نیاز است",
"Active · Book file uploads off": "فعال · بارگذاری فایل‌های کتاب خاموش است",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "فایل‌های کتاب را به دستگاه‌های دیگر شما بارگذاری می‌کند. تا زمانی که این ارائه‌دهنده انتخاب شده باشد، بارگذاری در Readest Cloud متوقف می‌شود.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "تا زمانی که WebDAV انتخاب شده باشد، کتاب‌ها، پیشرفت و هایلایت‌ها فقط با سرور شما همگام‌سازی می‌شوند.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "تنظیمات برنامه، آمار مطالعه و واژه‌نامه‌ها تا زمانی که وارد شده باشید همچنان از طریق حساب Readest شما همگام‌سازی می‌شوند.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "تا زمانی که Google Drive انتخاب شده باشد، کتاب‌ها، پیشرفت و هایلایت‌ها فقط با Drive شما همگام‌سازی می‌شوند.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "کتابخانه، وضعیت مطالعه و هایلایت‌های خود را با Readest Cloud همگام‌سازی کنید.",
"Account and Storage": "حساب و فضای ذخیره‌سازی",
"Manage your plan and stored files": "مدیریت طرح اشتراک و فایل‌های ذخیره‌شده",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "انتخاب کنید کتابخانه شما — کتاب‌ها، پیشرفت، هایلایت‌ها — در این دستگاه با کجا همگام‌سازی شود. تنظیمات برنامه، آمار مطالعه و واژه‌نامه‌ها تا زمانی که وارد شده باشید همیشه با حساب Readest شما همگام‌سازی می‌شوند.",
"Cloud sync provider": "ارائه‌دهنده همگام‌سازی ابری",
"Use Readest Cloud": "استفاده از Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "دستگاه دیگری هنوز این کتابخانه را از طریق Readest Cloud همگام‌سازی می‌کند",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} بارگذاری ناموفق بود: سهمیه‌ی ذخیره‌سازی کافی نیست",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} بارگذاری ناموفق بود: سهمیه‌ی ذخیره‌سازی کافی نیست"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} بارگذاری ناموفق بود: سهمیه‌ی ذخیره‌سازی کافی نیست",
"Library sync via {{provider}}": "همگام‌سازی کتابخانه از طریق {{provider}}",
"Google Drive session expired": "نشست Google Drive منقضی شده است",
"Cloud sync session expired": "نشست همگام‌سازی ابری منقضی شده است",
"Uploads book files to your other devices": "فایل‌های کتاب را روی دستگاه‌های دیگر شما بارگذاری می‌کند",
"Re-check every book instead of only changed ones": "بررسی مجدد هر کتاب به‌جای فقط کتاب‌های تغییریافته",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Connecté en tant que {{userDisplayName}}",
"Match Case": "Respecter la casse",
"Match Diacritics": "Respecter les accents",
"Match Whole Words": "Mots entiers",
"Maximum Number of Columns": "Nombre maximal de colonnes",
"Minimum Font Size": "Taille minimale de police",
"Monospace Font": "Police monospace",
@@ -587,8 +586,6 @@
"Advanced Settings": "Paramètres Avancés",
"File count: {{size}}": "Nombre de fichiers : {{size}}",
"Background Read Aloud": "Lecture Vocale en Arrière-Plan",
"Ready to read aloud": "Prêt à lire à haute voix",
"Read Aloud": "Lire à haute voix",
"Screen Brightness": "Luminosité de l'Écran",
"Background Image": "Image de Fond",
"Import Image": "Importer une Image",
@@ -1560,14 +1557,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Échec de l'authentification WebDAV. Reconnectez-vous dans les Réglages.",
"Downloading": "Téléchargement",
"Uploading": "Téléversement",
"downloaded {{n}} book(s)": "{{n}} livre(s) téléchargé(s)",
"pushed {{n}} config(s)": "{{n}} configuration(s) envoyée(s)",
"uploaded {{n}} new file(s)": "{{n}} nouveau(x) fichier(s) téléversé(s)",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronisation terminée avec {{failed}} échec(s). {{ok}} ok.",
"Sync complete": "Synchronisation terminée",
"Everything is already up to date.": "Tout est déjà à jour.",
"Browsing {{path}} on {{server}}": "Navigation dans {{path}} sur {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Connectez-vous à un serveur WebDAV pour parcourir vos fichiers distants.",
"WebDAV": "WebDAV",
"Upload Book Files": "Téléverser les fichiers de livres",
"Sync now": "Synchroniser maintenant",
@@ -1575,33 +1565,8 @@
"Show password": "Afficher le mot de passe",
"Root Directory": "Répertoire racine",
"Syncing…": "Synchronisation…",
"pulled progress for {{n}} book(s)": "progression récupérée pour {{n}} livre(s)",
"Sync History": "Historique de synchronisation",
"Clear Sync History": "Effacer l'historique de synchronisation",
"No manual syncs yet": "Aucune synchronisation manuelle pour le moment",
"Partial": "Partiel",
"Cleanup": "Nettoyage",
"Cleanup failed": "Échec du nettoyage",
"Sync failed": "Échec de la synchronisation",
"{{n}} deleted": "{{n}} supprimés",
"{{n}} failed": "{{n}} en échec",
"Nothing deleted": "Rien de supprimé",
"{{n}} downloaded": "{{n}} téléchargés",
"{{n}} uploaded": "{{n}} téléversés",
"{{n}} progress": "{{n}} de progression",
"Up to date": "À jour",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Livres téléchargés",
"Files uploaded": "Fichiers téléversés",
"Configs uploaded": "Configurations téléversées",
"Configs downloaded": "Configurations téléchargées",
"Covers uploaded": "Couvertures téléversées",
"Books deleted": "Livres supprimés",
"Files in sync": "Fichiers synchronisés",
"Failures": "Échecs",
"Total books": "Total des livres",
"Error:": "Erreur :",
"Failed books": "Livres en échec",
"Deleted {{n}} book(s) from server.": "{{n}} livre(s) supprimé(s) du serveur.",
"Failed to load directory": "Échec du chargement du dossier",
"File download is only supported on the desktop and mobile apps.": "Le téléchargement de fichiers n'est pris en charge que dans les applications de bureau et mobiles.",
@@ -1630,10 +1595,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installez l'extension de navigateur Readest pour envoyer l'article que vous lisez à votre bibliothèque. Elle capture la page depuis votre navigateur, de sorte que les sites payants ou nécessitant une connexion fonctionnent toujours.",
"Added to your library. It will sync to your other devices.": "Ajouté à votre bibliothèque. Il sera synchronisé avec vos autres appareils.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Phrase secrète de synchronisation oubliée. Tous les champs chiffrés ont été effacés.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Synchronisations manuelles et nettoyages uniquement. Les synchronisations automatiques pendant la lecture ne sont pas enregistrées ici.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Supprimer {{n}} livre(s) du serveur WebDAV ?\n\nCela ne supprime que les fichiers distants ; votre bibliothèque locale n'est pas affectée. La suppression est irréversible. Les octets sur le serveur seront définitivement perdus.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Téléverse les fichiers de livres vers vos autres appareils.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Phrase secrète de synchronisation incorrecte. Les identifiants synchronisés n'ont pas pu être déchiffrés.",
"Email books straight to your library": "Envoyez des livres par e-mail directement dans votre bibliothèque",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Transférez les pièces jointes et les articles vers votre adresse Readest privée. Disponible avec les forfaits Plus, Pro et Lifetime.",
@@ -1825,9 +1788,6 @@
"Also erase reading progress, notes, and bookmarks.": "Efface aussi la progression de lecture, les notes et les signets.",
"Background Image (Library)": "Image de Fond (Bibliothèque)",
"Background Image (Reader)": "Image de Fond (Vue de lecture)",
"updated metadata for {{n}} book(s)": "métadonnées mises à jour pour {{n}} livre(s)",
"{{n}} metadata": "{{n}} métadonnées",
"Metadata updated": "Métadonnées mises à jour",
"Filter": "Filtrer",
"Sort by": "Trier par",
"Date modified": "Date de modification",
@@ -1872,8 +1832,6 @@
"Decrease Contrast": "Diminuer le contraste",
"Reset Contrast": "Réinitialiser le contraste",
"Increase Contrast": "Augmenter le contraste",
"Google Drive session expired. Reconnect in Settings.": "Session Google Drive expirée. Reconnectez-vous dans les Réglages.",
"Cloud sync session expired. Reconnect in Settings.": "Session de synchronisation cloud expirée. Reconnectez-vous dans les Réglages.",
"Push": "Poussée",
"Slide": "Glissement",
"Page Curl": "Courbure de page",
@@ -1882,7 +1840,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Définit la taille du texte des résultats du dictionnaire, indépendamment de la vue de lecture.",
"Authentication failed. Reconnect in Settings.": "Échec de l'authentification. Reconnectez-vous dans les Réglages.",
"Full Sync": "Synchronisation complète",
"Re-check every book instead of only changed ones.": "Revérifie tous les livres, pas seulement ceux modifiés.",
"Waiting for sign-in…": "En attente de connexion…",
"Reconnect": "Se reconnecter",
"Connected as {{account}}": "Connecté en tant que {{account}}",
@@ -1907,17 +1864,13 @@
"Reading aloud continues in the background": "La lecture à haute voix continue en arrière-plan",
"Stopped reading aloud": "Lecture à haute voix arrêtée",
"Read aloud stopped": "Lecture à haute voix arrêtée",
"Synced via {{provider}} {{time}}": "Synchronisé via {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Les livres se synchronisent via {{provider}} - le stockage Readest Cloud n'est pas utilisé",
"Cloud provider switched": "Fournisseur cloud changé",
"Synced via {{provider}}": "Synchronisé via {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Les téléversements vers Readest Cloud sont en pause tant que la synchronisation {{provider}} est sélectionnée",
"Managed by {{provider}} while it is your cloud sync provider": "Géré par {{provider}} tant qu'il est votre fournisseur de synchronisation cloud",
"Not signed in": "Non connecté",
"Active — syncing your library on this device": "Actif — synchronise votre bibliothèque sur cet appareil",
"Paused — plan required": "En pause — abonnement requis",
"Active · Book file uploads off": "Actif · Téléversement des fichiers de livres désactivé",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Téléverse les fichiers de livres vers vos autres appareils. Les téléversements vers Readest Cloud sont en pause tant que ce fournisseur est sélectionné.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Tant que WebDAV est sélectionné, les livres, la progression et les surlignages ne se synchronisent quavec votre serveur.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Les paramètres de l'application, les statistiques de lecture et les dictionnaires continuent de se synchroniser via votre compte Readest tant que vous êtes connecté.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Tant que Google Drive est sélectionné, les livres, la progression et les surlignages ne se synchronisent quavec votre Drive.",
@@ -1925,11 +1878,16 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchronisez votre bibliothèque, votre progression de lecture et vos surlignages avec Readest Cloud.",
"Account and Storage": "Compte et stockage",
"Manage your plan and stored files": "Gérer votre abonnement et vos fichiers stockés",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Choisissez où votre bibliothèque — livres, progression, surlignages — se synchronise sur cet appareil. Les paramètres de l'application, les statistiques de lecture et les dictionnaires se synchronisent toujours avec votre compte Readest tant que vous êtes connecté.",
"Cloud sync provider": "Fournisseur de synchronisation cloud",
"Use Readest Cloud": "Utiliser Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Un autre appareil synchronise encore cette bibliothèque via Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} téléversement échoué : quota de stockage insuffisant",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} téléversements échoués : quota de stockage insuffisant",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} téléversements échoués : quota de stockage insuffisant"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} téléversements échoués : quota de stockage insuffisant",
"Library sync via {{provider}}": "Synchronisation de la bibliothèque via {{provider}}",
"Google Drive session expired": "Session Google Drive expirée",
"Cloud sync session expired": "Session de synchronisation cloud expirée",
"Uploads book files to your other devices": "Téléverse les fichiers de livres vers vos autres appareils",
"Re-check every book instead of only changed ones": "Revérifier chaque livre au lieu des seuls livres modifiés",
"KOReader": "KOReader"
}
@@ -542,7 +542,6 @@
"Clear search history": "נקה היסטוריית חיפוש",
"Chapter": "פרק",
"Match Case": "התאמת רישיות (Match Case)",
"Match Whole Words": "התאמת מילים שלמות",
"Match Diacritics": "התאמת סימני דיאקריטיקה",
"Search results for '{{term}}'": "תוצאות חיפוש עבור '{{term}}'",
"Previous Result": "תוצאה קודמת",
@@ -561,8 +560,6 @@
"Translation Disabled": "התרגום מושבת",
"Previous Sentence": "משפט קודם",
"Next Sentence": "משפט הבא",
"Read Aloud": "הקרא בקול",
"Ready to read aloud": "מוכן להקראה בקול",
"Please log in to use advanced TTS features": "אנא התחבר כדי להשתמש בתכונות TTS מתקדמות",
"TTS not supported for this document": "TTS אינו נתמך עבור מסמך זה",
"Back to TTS Location": "חזור למיקום ה-TTS",
@@ -1560,14 +1557,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "אימות WebDAV נכשל. התחבר מחדש בהגדרות.",
"Downloading": "מוריד",
"Uploading": "מעלה",
"downloaded {{n}} book(s)": "הורדו {{n}} ספרים",
"pushed {{n}} config(s)": "נשלחו {{n}} הגדרות",
"uploaded {{n}} new file(s)": "הועלו {{n}} קבצים חדשים",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "הסנכרון הסתיים עם {{failed}} כשלים. {{ok}} הצליחו.",
"Sync complete": "הסנכרון הושלם",
"Everything is already up to date.": "הכל כבר מעודכן.",
"Browsing {{path}} on {{server}}": "דפדוף ב-{{path}} בשרת {{server}}",
"Connect to a WebDAV server to browse your remote files.": "התחבר לשרת WebDAV כדי לעיין בקבצים המרוחקים שלך.",
"WebDAV": "WebDAV",
"Upload Book Files": "העלאת קובצי ספרים",
"Sync now": "סנכרן עכשיו",
@@ -1575,33 +1565,8 @@
"Show password": "הצג סיסמה",
"Root Directory": "תיקיית שורש",
"Syncing…": "מסנכרן…",
"pulled progress for {{n}} book(s)": "הובאה התקדמות עבור {{n}} ספרים",
"Sync History": "היסטוריית סנכרון",
"Clear Sync History": "מחק היסטוריית סנכרון",
"No manual syncs yet": "אין סנכרונים ידניים עדיין",
"Partial": "חלקי",
"Cleanup": "ניקוי",
"Cleanup failed": "הניקוי נכשל",
"Sync failed": "הסנכרון נכשל",
"{{n}} deleted": "{{n}} נמחקו",
"{{n}} failed": "{{n}} נכשלו",
"Nothing deleted": "לא נמחק דבר",
"{{n}} downloaded": "{{n}} הורדו",
"{{n}} uploaded": "{{n}} הועלו",
"{{n}} progress": "{{n}} התקדמות",
"Up to date": "מעודכן",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "ספרים שהורדו",
"Files uploaded": "קבצים שהועלו",
"Configs uploaded": "הגדרות שהועלו",
"Configs downloaded": "הגדרות שהורדו",
"Covers uploaded": "כריכות שהועלו",
"Books deleted": "ספרים שנמחקו",
"Files in sync": "קבצים מסונכרנים",
"Failures": "כשלים",
"Total books": "סך הספרים",
"Error:": "שגיאה:",
"Failed books": "ספרים שנכשלו",
"Deleted {{n}} book(s) from server.": "נמחקו {{n}} ספרים מהשרת.",
"Failed to load directory": "טעינת התיקייה נכשלה",
"File download is only supported on the desktop and mobile apps.": "הורדת קבצים נתמכת רק באפליקציות שולחן העבודה והנייד.",
@@ -1630,10 +1595,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "התקן את הרחבת הדפדפן של Readest כדי לשלוח את המאמר שאתה קורא לספרייה שלך. היא חותכת את הדף מהדפדפן שלך כך שאתרים בתשלום ואתרים הדורשים התחברות עדיין יעבדו.",
"Added to your library. It will sync to your other devices.": "נוסף לספרייה שלך. הוא יסונכרן עם המכשירים האחרים שלך.",
"Sync passphrase forgotten. All encrypted fields cleared.": "משפט הסיסמה לסנכרון נשכח. כל השדות המוצפנים נמחקו.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "רק סנכרונים ידניים וניקויים. סנכרונים אוטומטיים בזמן קריאה אינם נרשמים כאן.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "למחוק {{n}} ספרים משרת ה-WebDAV?\n\nפעולה זו מסירה רק את הקבצים המרוחקים; הספרייה המקומית שלך אינה מושפעת. לא ניתן לבטל את המחיקה. הבייטים בשרת ייעלמו לתמיד.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "מעלה את קובצי הספרים למכשירים האחרים שלך.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "משפט סיסמה לסנכרון שגוי. לא ניתן היה לפענח את פרטי הכניסה המסונכרנים.",
"Email books straight to your library": "שלח ספרים ישירות לספרייה שלך באמצעות אימייל",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "העבר קבצים מצורפים ומאמרים לכתובת Readest הפרטית שלך. זמין בתוכניות Plus, Pro ו-Lifetime.",
@@ -1825,9 +1788,6 @@
"Also erase reading progress, notes, and bookmarks.": "מוחק גם את התקדמות הקריאה, ההערות והסימניות.",
"Background Image (Library)": "תמונת רקע (ספרייה)",
"Background Image (Reader)": "תמונת רקע (מצב קריאה)",
"updated metadata for {{n}} book(s)": "המטא-נתונים עודכנו עבור {{n}} ספרים",
"{{n}} metadata": "{{n}} מטא-נתונים",
"Metadata updated": "המטא-נתונים עודכנו",
"Filter": "סינון",
"Sort by": "מיין לפי",
"Date modified": "תאריך שינוי",
@@ -1872,8 +1832,6 @@
"Decrease Contrast": "הפחת ניגודיות",
"Reset Contrast": "אפס ניגודיות",
"Increase Contrast": "הגבר ניגודיות",
"Google Drive session expired. Reconnect in Settings.": "פג תוקף החיבור ל-Google Drive. התחבר מחדש בהגדרות.",
"Cloud sync session expired. Reconnect in Settings.": "פג תוקף החיבור לסנכרון הענן. התחבר מחדש בהגדרות.",
"Push": "דחיפה",
"Slide": "החלקה",
"Page Curl": "קיפול דף",
@@ -1882,7 +1840,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "קובע את גודל הטקסט של תוצאות המילון, ללא תלות בתצוגת הקריאה.",
"Authentication failed. Reconnect in Settings.": "האימות נכשל. התחבר מחדש בהגדרות.",
"Full Sync": "סנכרון מלא",
"Re-check every book instead of only changed ones.": "בדיקה מחדש של כל ספר במקום רק אלה שהשתנו.",
"Waiting for sign-in…": "ממתין להתחברות…",
"Reconnect": "התחבר מחדש",
"Connected as {{account}}": "מחובר כ-{{account}}",
@@ -1907,17 +1864,13 @@
"Reading aloud continues in the background": "ההקראה בקול ממשיכה ברקע",
"Stopped reading aloud": "ההקראה בקול הופסקה",
"Read aloud stopped": "ההקראה הופסקה",
"Synced via {{provider}} {{time}}": "סונכרן דרך {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "ספרים מסתנכרנים דרך {{provider}} - אחסון Readest Cloud אינו בשימוש",
"Cloud provider switched": "ספק הענן הוחלף",
"Synced via {{provider}}": "סונכרן דרך {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "העלאות ל-Readest Cloud מושהות כל עוד סנכרון {{provider}} נבחר",
"Managed by {{provider}} while it is your cloud sync provider": "מנוהל על ידי {{provider}} כל עוד הוא ספק סנכרון הענן שלך",
"Not signed in": "לא מחובר",
"Active — syncing your library on this device": "פעיל — מסנכרן את הספרייה שלך במכשיר זה",
"Paused — plan required": "מושהה — נדרש מינוי",
"Active · Book file uploads off": "פעיל · העלאת קובצי ספרים כבויה",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "מעלה את קובצי הספרים למכשירים האחרים שלך. העלאות ל-Readest Cloud מושהות כל עוד ספק זה נבחר.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "כל עוד WebDAV נבחר, ספרים, התקדמות והדגשות מסתנכרנים רק עם השרת שלך.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "הגדרות האפליקציה, סטטיסטיקות קריאה ומילונים ממשיכים להסתנכרן דרך חשבון Readest שלך כל עוד אתה מחובר.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "כל עוד Google Drive נבחר, ספרים, התקדמות והדגשות מסתנכרנים רק עם ה-Drive שלך.",
@@ -1925,11 +1878,16 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "סנכרן את הספרייה, התקדמות הקריאה וההדגשות שלך עם Readest Cloud.",
"Account and Storage": "חשבון ואחסון",
"Manage your plan and stored files": "נהל את המינוי והקבצים המאוחסנים שלך",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "בחר לאן הספרייה שלך — ספרים, התקדמות, הדגשות — מסתנכרנת במכשיר זה. הגדרות האפליקציה, סטטיסטיקות קריאה ומילונים תמיד מסתנכרנים עם חשבון Readest שלך כל עוד אתה מחובר.",
"Cloud sync provider": "ספק סנכרון ענן",
"Use Readest Cloud": "השתמש ב-Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "מכשיר אחר עדיין מסנכרן את הספרייה הזו דרך Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "העלאה {{count}} נכשלה: מכסת אחסון לא מספקת",
"{{count}} uploads failed: insufficient storage quota_two": "{{count}} העלאות נכשלו: מכסת אחסון לא מספקת",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} העלאות נכשלו: מכסת אחסון לא מספקת"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} העלאות נכשלו: מכסת אחסון לא מספקת",
"Library sync via {{provider}}": "סנכרון הספרייה באמצעות {{provider}}",
"Google Drive session expired": "פג תוקף ההפעלה של Google Drive",
"Cloud sync session expired": "פג תוקף ההפעלה של סנכרון הענן",
"Uploads book files to your other devices": "מעלה קובצי ספרים למכשירים האחרים שלך",
"Re-check every book instead of only changed ones": "בדיקה מחדש של כל ספר במקום רק אלה שהשתנו",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "{{userDisplayName}} के रूप में लॉग इन किया",
"Match Case": "केस मैच करें",
"Match Diacritics": "डायाक्रिटिक्स मैच करें",
"Match Whole Words": "पूरे शब्द मैच करें",
"Maximum Number of Columns": "कॉलम की अधिकतम संख्या",
"Minimum Font Size": "न्यूनतम फ़ॉन्ट साइज़",
"Monospace Font": "मोनोस्पेस फ़ॉन्ट",
@@ -583,8 +582,6 @@
"Advanced Settings": "उन्नत सेटिंग्स",
"File count: {{size}}": "फ़ाइलों की संख्या: {{size}}",
"Background Read Aloud": "पृष्ठभूमि में वाचन",
"Ready to read aloud": "उच्च स्वर में पढ़ने के लिए तैयार",
"Read Aloud": "उच्च स्वर में पढ़ें",
"Screen Brightness": "स्क्रीन ब्राइटनेस",
"Background Image": "पृष्ठभूमि छवि",
"Import Image": "छवि आयात करें",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV प्रमाणीकरण विफल। सेटिंग्स में पुनः कनेक्ट करें।",
"Downloading": "डाउनलोड हो रहा है",
"Uploading": "अपलोड हो रहा है",
"downloaded {{n}} book(s)": "{{n}} किताब(ें) डाउनलोड",
"pushed {{n}} config(s)": "{{n}} कॉन्फ़िग भेजे गए",
"uploaded {{n}} new file(s)": "{{n}} नई फ़ाइलें अपलोड",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "सिंक {{failed}} विफलताओं के साथ समाप्त। {{ok}} सफल।",
"Sync complete": "सिंक पूरा हुआ",
"Everything is already up to date.": "सब कुछ पहले से अद्यतन है।",
"Browsing {{path}} on {{server}}": "{{server}} पर {{path}} ब्राउज़ कर रहे हैं",
"Connect to a WebDAV server to browse your remote files.": "अपनी रिमोट फ़ाइलें ब्राउज़ करने के लिए WebDAV सर्वर से कनेक्ट करें।",
"WebDAV": "WebDAV",
"Upload Book Files": "पुस्तक फ़ाइलें अपलोड करें",
"Sync now": "अभी सिंक करें",
@@ -1546,33 +1536,8 @@
"Show password": "पासवर्ड दिखाएँ",
"Root Directory": "रूट निर्देशिका",
"Syncing…": "सिंक हो रहा है…",
"pulled progress for {{n}} book(s)": "{{n}} किताब(ों) की प्रगति प्राप्त की",
"Sync History": "सिंक इतिहास",
"Clear Sync History": "सिंक इतिहास साफ़ करें",
"No manual syncs yet": "अभी तक कोई मैन्युअल सिंक नहीं",
"Partial": "आंशिक",
"Cleanup": "सफाई",
"Cleanup failed": "सफाई विफल",
"Sync failed": "सिंक विफल",
"{{n}} deleted": "{{n}} हटाई गईं",
"{{n}} failed": "{{n}} विफल",
"Nothing deleted": "कुछ नहीं हटाया गया",
"{{n}} downloaded": "{{n}} डाउनलोड",
"{{n}} uploaded": "{{n}} अपलोड",
"{{n}} progress": "{{n}} प्रगति",
"Up to date": "अद्यतन",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "डाउनलोड की गई किताबें",
"Files uploaded": "अपलोड की गई फ़ाइलें",
"Configs uploaded": "अपलोड किए गए कॉन्फ़िग",
"Configs downloaded": "डाउनलोड किए गए कॉन्फ़िग",
"Covers uploaded": "अपलोड किए गए कवर",
"Books deleted": "हटाई गई किताबें",
"Files in sync": "सिंक में फ़ाइलें",
"Failures": "विफलताएँ",
"Total books": "कुल किताबें",
"Error:": "त्रुटि:",
"Failed books": "विफल किताबें",
"Deleted {{n}} book(s) from server.": "सर्वर से {{n}} किताब(ें) हटाई गईं।",
"Failed to load directory": "निर्देशिका लोड करने में विफल",
"File download is only supported on the desktop and mobile apps.": "फ़ाइल डाउनलोड केवल डेस्कटॉप और मोबाइल ऐप्स में समर्थित है।",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "जो लेख आप पढ़ रहे हैं उसे अपनी लाइब्रेरी में भेजने के लिए Readest ब्राउज़र एक्सटेंशन इंस्टॉल करें। यह आपके ब्राउज़र से पृष्ठ को क्लिप करता है ताकि पेवॉल और लॉगिन-केवल साइटें भी काम करें।",
"Added to your library. It will sync to your other devices.": "आपकी लाइब्रेरी में जोड़ा गया। यह आपके अन्य उपकरणों के साथ सिंक होगा।",
"Sync passphrase forgotten. All encrypted fields cleared.": "सिंक पासफ़्रेज़ भुलाया गया। सभी एन्क्रिप्ट किए गए फ़ील्ड साफ़ कर दिए गए।",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "केवल मैन्युअल सिंक और सफाई। पढ़ते समय स्वचालित सिंक यहाँ लॉग नहीं किए जाते।",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV सर्वर से {{n}} किताब(ें) हटाएं?\n\nयह केवल रिमोट फ़ाइलें हटाता है; आपकी स्थानीय लाइब्रेरी अप्रभावित रहती है। हटाना पूर्ववत नहीं किया जा सकता। सर्वर पर डेटा हमेशा के लिए चला जाएगा।",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "पुस्तक फ़ाइलें आपके अन्य उपकरणों पर अपलोड करता है।",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "गलत सिंक पासफ़्रेज़। सिंक की गई क्रेडेंशियल्स को डिक्रिप्ट नहीं किया जा सका।",
"Email books straight to your library": "अपनी लाइब्रेरी में सीधे ईमेल से किताबें भेजें",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "अनुलग्नक और लेख अपने निजी Readest पते पर अग्रेषित करें। Plus, Pro और Lifetime प्लान में उपलब्ध।",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "पढ़ने की प्रगति, नोट्स और बुकमार्क भी मिटा देता है।",
"Background Image (Library)": "पृष्ठभूमि छवि (लाइब्रेरी)",
"Background Image (Reader)": "पृष्ठभूमि छवि (रीडर)",
"updated metadata for {{n}} book(s)": "{{n}} पुस्तक(ों) के मेटाडेटा अपडेट किए गए",
"{{n}} metadata": "{{n}} मेटाडेटा",
"Metadata updated": "मेटाडेटा अपडेट किया गया",
"Filter": "फ़िल्टर",
"Sort by": "इसके अनुसार क्रमित करें",
"Date modified": "संशोधन तिथि",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "विरोधाभास कम करें",
"Reset Contrast": "विरोधाभास रीसेट करें",
"Increase Contrast": "विरोधाभास बढ़ाएं",
"Google Drive session expired. Reconnect in Settings.": "Google Drive सत्र समाप्त हो गया। सेटिंग्स में फिर से कनेक्ट करें।",
"Cloud sync session expired. Reconnect in Settings.": "क्लाउड सिंक सत्र समाप्त हो गया। सेटिंग्स में फिर से कनेक्ट करें।",
"Push": "पुश",
"Slide": "स्लाइड",
"Page Curl": "पेज कर्ल",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "पठन दृश्य से स्वतंत्र रूप से शब्दकोश परिणामों के टेक्स्ट का आकार सेट करता है।",
"Authentication failed. Reconnect in Settings.": "प्रमाणीकरण विफल रहा। सेटिंग्स में फिर से कनेक्ट करें।",
"Full Sync": "पूर्ण सिंक",
"Re-check every book instead of only changed ones.": "केवल बदली गई पुस्तकों के बजाय हर पुस्तक की फिर से जाँच करें।",
"Waiting for sign-in…": "साइन-इन की प्रतीक्षा में…",
"Reconnect": "फिर से कनेक्ट करें",
"Connected as {{account}}": "{{account}} के रूप में कनेक्टेड",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "उच्च स्वर में पढ़ना पृष्ठभूमि में जारी रहता है",
"Stopped reading aloud": "उच्च स्वर में पढ़ना रोक दिया गया",
"Read aloud stopped": "उच्च स्वर में पढ़ना रुक गया",
"Synced via {{provider}} {{time}}": "{{provider}} के माध्यम से {{time}} सिंक हुआ",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "पुस्तकें {{provider}} के माध्यम से सिंक होती हैं - Readest Cloud स्टोरेज का उपयोग नहीं होता",
"Cloud provider switched": "क्लाउड प्रदाता बदला गया",
"Synced via {{provider}}": "{{provider}} के माध्यम से सिंक हुआ",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "जब तक {{provider}} सिंक चयनित है, Readest Cloud पर अपलोड रुके रहेंगे",
"Managed by {{provider}} while it is your cloud sync provider": "जब तक {{provider}} आपका क्लाउड सिंक प्रदाता है, इसे {{provider}} प्रबंधित करता है",
"Not signed in": "साइन इन नहीं किया गया",
"Active — syncing your library on this device": "सक्रिय — इस डिवाइस पर आपकी लाइब्रेरी सिंक हो रही है",
"Paused — plan required": "रुका हुआ — प्लान आवश्यक",
"Active · Book file uploads off": "सक्रिय · पुस्तक फ़ाइल अपलोड बंद",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "पुस्तक फ़ाइलें आपके अन्य उपकरणों पर अपलोड करता है। जब तक यह प्रदाता चयनित है, Readest Cloud पर अपलोड रुके रहते हैं।",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "जब तक WebDAV चयनित है, पुस्तकें, प्रगति और हाइलाइट्स केवल आपके सर्वर से सिंक होते हैं।",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "ऐप सेटिंग्स, पढ़ने के आँकड़े और शब्दकोश साइन इन रहने तक आपके Readest खाते के माध्यम से सिंक होते रहते हैं।",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "जब तक Google Drive चयनित है, पुस्तकें, प्रगति और हाइलाइट्स केवल आपकी Drive से सिंक होते हैं।",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "अपनी लाइब्रेरी, पढ़ने की प्रगति और हाइलाइट्स को Readest Cloud से सिंक करें।",
"Account and Storage": "खाता और स्टोरेज",
"Manage your plan and stored files": "अपने प्लान और संग्रहीत फ़ाइलों का प्रबंधन करें",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "चुनें कि इस डिवाइस पर आपकी लाइब्रेरी — पुस्तकें, प्रगति, हाइलाइट्स — कहाँ सिंक हो। ऐप सेटिंग्स, पढ़ने के आँकड़े और शब्दकोश साइन इन रहने तक हमेशा आपके Readest खाते से सिंक होते हैं।",
"Cloud sync provider": "क्लाउड सिंक प्रदाता",
"Use Readest Cloud": "Readest Cloud का उपयोग करें",
"Another device is still syncing this library via Readest Cloud": "कोई अन्य डिवाइस अभी भी Readest Cloud के माध्यम से इस लाइब्रेरी को सिंक कर रहा है",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} अपलोड विफल: अपर्याप्त स्टोरेज कोटा",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} अपलोड विफल: अपर्याप्त स्टोरेज कोटा"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} अपलोड विफल: अपर्याप्त स्टोरेज कोटा",
"Library sync via {{provider}}": "{{provider}} के माध्यम से लाइब्रेरी सिंक",
"Google Drive session expired": "Google Drive सत्र समाप्त हो गया",
"Cloud sync session expired": "क्लाउड सिंक सत्र समाप्त हो गया",
"Uploads book files to your other devices": "आपके अन्य उपकरणों पर पुस्तक फ़ाइलें अपलोड करता है",
"Re-check every book instead of only changed ones": "केवल बदली गई पुस्तकों के बजाय हर पुस्तक की फिर से जाँच करें",
"KOReader": "KOReader"
}
@@ -605,7 +605,6 @@
"Clear search history": "Keresési előzmények törlése",
"Chapter": "Fejezet",
"Match Case": "Kis- és nagybetűk megkülönböztetése",
"Match Whole Words": "Teljes szavak egyezése",
"Match Diacritics": "Ékezetek egyezése",
"Search results for '{{term}}'": "Keresési eredmények: '{{term}}'",
"Previous Result": "Előző találat",
@@ -673,8 +672,6 @@
"Translating...": "Fordítás...",
"Please log in to use advanced TTS features": "Kérjük, jelentkezzen be a haladó TTS-funkciók használatához",
"TTS not supported for this document": "A TTS nem támogatott ehhez a dokumentumhoz",
"Read Aloud": "Felolvasás",
"Ready to read aloud": "Felolvasásra kész",
"Delete Your Account?": "Törli a fiókját?",
"This action cannot be undone. All your data in the cloud will be permanently deleted.": "Ez a művelet nem vonható vissza. Minden felhőbeli adata véglegesen törlődik.",
"Delete Permanently": "Végleges törlés",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV hitelesítés sikertelen. Csatlakozzon újra a Beállításokban.",
"Downloading": "Letöltés",
"Uploading": "Feltöltés",
"downloaded {{n}} book(s)": "{{n}} könyv letöltve",
"pushed {{n}} config(s)": "{{n}} konfiguráció feltöltve",
"uploaded {{n}} new file(s)": "{{n}} új fájl feltöltve",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Szinkronizálás befejeződött {{failed}} hibával. {{ok}} sikeres.",
"Sync complete": "Szinkronizálás kész",
"Everything is already up to date.": "Minden naprakész.",
"Browsing {{path}} on {{server}}": "{{path}} böngészése a következőn: {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Csatlakozzon WebDAV-kiszolgálóhoz a távoli fájlok böngészéséhez.",
"WebDAV": "WebDAV",
"Upload Book Files": "Könyvfájlok feltöltése",
"Sync now": "Szinkronizálás most",
@@ -1546,33 +1536,8 @@
"Show password": "Jelszó megjelenítése",
"Root Directory": "Gyökérkönyvtár",
"Syncing…": "Szinkronizálás…",
"pulled progress for {{n}} book(s)": "{{n}} könyv folyamata letöltve",
"Sync History": "Szinkronizálási előzmények",
"Clear Sync History": "Szinkronizálási előzmények törlése",
"No manual syncs yet": "Még nincs kézi szinkronizálás",
"Partial": "Részleges",
"Cleanup": "Takarítás",
"Cleanup failed": "A takarítás sikertelen",
"Sync failed": "A szinkronizálás sikertelen",
"{{n}} deleted": "{{n}} törölve",
"{{n}} failed": "{{n}} sikertelen",
"Nothing deleted": "Semmi sem lett törölve",
"{{n}} downloaded": "{{n}} letöltve",
"{{n}} uploaded": "{{n}} feltöltve",
"{{n}} progress": "{{n}} folyamat",
"Up to date": "Naprakész",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Letöltött könyvek",
"Files uploaded": "Feltöltött fájlok",
"Configs uploaded": "Feltöltött konfigurációk",
"Configs downloaded": "Letöltött konfigurációk",
"Covers uploaded": "Feltöltött borítók",
"Books deleted": "Törölt könyvek",
"Files in sync": "Szinkronban lévő fájlok",
"Failures": "Hibák",
"Total books": "Összes könyv",
"Error:": "Hiba:",
"Failed books": "Sikertelen könyvek",
"Deleted {{n}} book(s) from server.": "{{n}} könyv törölve a kiszolgálóról.",
"Failed to load directory": "Nem sikerült betölteni a mappát",
"File download is only supported on the desktop and mobile apps.": "A fájlletöltés csak az asztali és mobilalkalmazásokban támogatott.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Telepítse a Readest böngészőkiegészítőt, hogy az éppen olvasott cikket a könyvtárába küldje. A bővítmény a böngészőből vágja ki az oldalt, így a fizetős és bejelentkezést igénylő oldalak is működnek.",
"Added to your library. It will sync to your other devices.": "Hozzáadva a könyvtárhoz. Szinkronizálódik a többi eszközével.",
"Sync passphrase forgotten. All encrypted fields cleared.": "A szinkronizálási jelmondat törölve. Minden titkosított mező törölve.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Csak kézi szinkronizálások és takarítások. Az olvasás közbeni automatikus szinkronizálások itt nem szerepelnek.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Törli a(z) {{n}} könyvet a WebDAV kiszolgálóról?\n\nEz csak a távoli fájlokat törli; a helyi könyvtárát nem érinti. A törlés nem vonható vissza. A kiszolgálón lévő adatok véglegesen eltűnnek.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Feltölti a könyvfájlokat a többi eszközére.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Hibás szinkronizálási jelmondat. A szinkronizált hitelesítő adatokat nem sikerült visszafejteni.",
"Email books straight to your library": "Küldjön könyveket közvetlenül e-mailben a könyvtárába",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Továbbítsa a mellékleteket és cikkeket a privát Readest-címére. Elérhető a Plus, Pro és Lifetime csomagokban.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "Az olvasási haladást, jegyzeteket és könyvjelzőket is törli.",
"Background Image (Library)": "Háttérkép (Könyvtár)",
"Background Image (Reader)": "Háttérkép (Olvasónézet)",
"updated metadata for {{n}} book(s)": "{{n}} könyv metaadatai frissítve",
"{{n}} metadata": "{{n}} metaadat",
"Metadata updated": "Metaadatok frissítve",
"Filter": "Szűrés",
"Sort by": "Rendezés alapja",
"Date modified": "Módosítás dátuma",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "Kontraszt csökkentése",
"Reset Contrast": "Kontraszt visszaállítása",
"Increase Contrast": "Kontraszt növelése",
"Google Drive session expired. Reconnect in Settings.": "A Google Drive-munkamenet lejárt. Csatlakozzon újra a Beállításokban.",
"Cloud sync session expired. Reconnect in Settings.": "A felhőszinkronizálási munkamenet lejárt. Csatlakozzon újra a Beállításokban.",
"Push": "Tolás",
"Slide": "Csúsztatás",
"Page Curl": "Lapozás",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "A szótári találatok szövegméretét állítja be, az olvasási nézettől függetlenül.",
"Authentication failed. Reconnect in Settings.": "A hitelesítés sikertelen. Csatlakozzon újra a Beállításokban.",
"Full Sync": "Teljes szinkronizálás",
"Re-check every book instead of only changed ones.": "Minden könyv újraellenőrzése, nem csak a módosultaké.",
"Waiting for sign-in…": "Várakozás a bejelentkezésre…",
"Reconnect": "Újracsatlakozás",
"Connected as {{account}}": "Csatlakozva mint {{account}}",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "A felolvasás a háttérben folytatódik",
"Stopped reading aloud": "A felolvasás leállt",
"Read aloud stopped": "Felolvasás leállítva",
"Synced via {{provider}} {{time}}": "Szinkronizálva {{provider}} útján {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "A könyvek {{provider}} útján szinkronizálódnak - a Readest Cloud tárhely nincs használatban",
"Cloud provider switched": "Felhőszolgáltató váltva",
"Synced via {{provider}}": "Szinkronizálva {{provider}} útján",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "A Readest Cloudba történő feltöltések szünetelnek, amíg a {{provider}} szinkronizálás van kiválasztva",
"Managed by {{provider}} while it is your cloud sync provider": "A {{provider}} kezeli, amíg az a felhőszinkronizálási szolgáltatója",
"Not signed in": "Nincs bejelentkezve",
"Active — syncing your library on this device": "Aktív — szinkronizálja könyvtárát ezen az eszközön",
"Paused — plan required": "Szüneteltetve — előfizetés szükséges",
"Active · Book file uploads off": "Aktív · Könyvfájlok feltöltése kikapcsolva",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Feltölti a könyvfájlokat a többi eszközére. A Readest Cloudba történő feltöltések szünetelnek, amíg ez a szolgáltató van kiválasztva.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Amíg a WebDAV van kiválasztva, a könyvek, a haladás és a kiemelések csak az Ön szerverével szinkronizálódnak.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Az alkalmazásbeállítások, az olvasási statisztikák és a szótárak bejelentkezve továbbra is a Readest-fiókján keresztül szinkronizálódnak.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Amíg a Google Drive van kiválasztva, a könyvek, a haladás és a kiemelések csak az Ön Drive-jával szinkronizálódnak.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Szinkronizálja könyvtárát, olvasási haladását és kiemeléseit a Readest Clouddal.",
"Account and Storage": "Fiók és tárhely",
"Manage your plan and stored files": "Előfizetés és tárolt fájlok kezelése",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Válassza ki, hová szinkronizálódjon a könyvtára — könyvek, haladás, kiemelések — ezen az eszközön. Az alkalmazásbeállítások, az olvasási statisztikák és a szótárak bejelentkezve mindig a Readest-fiókjával szinkronizálódnak.",
"Cloud sync provider": "Felhőszinkronizálási szolgáltató",
"Use Readest Cloud": "Readest Cloud használata",
"Another device is still syncing this library via Readest Cloud": "Egy másik eszköz még mindig a Readest Cloudon keresztül szinkronizálja ezt a könyvtárat",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} feltöltés sikertelen: nincs elegendő tárhelykvóta",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} feltöltés sikertelen: nincs elegendő tárhelykvóta"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} feltöltés sikertelen: nincs elegendő tárhelykvóta",
"Library sync via {{provider}}": "Könyvtár szinkronizálása a következőn keresztül: {{provider}}",
"Google Drive session expired": "A Google Drive-munkamenet lejárt",
"Cloud sync session expired": "A felhőszinkronizálási munkamenet lejárt",
"Uploads book files to your other devices": "Feltölti a könyvfájlokat a többi eszközére",
"Re-check every book instead of only changed ones": "Minden könyv újraellenőrzése a módosítottak helyett",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Masuk sebagai {{userDisplayName}}",
"Match Case": "Cocokkan Huruf Besar/Kecil",
"Match Diacritics": "Cocokkan Diakritik",
"Match Whole Words": "Cocokkan Kata Utuh",
"Maximum Number of Columns": "Jumlah Kolom Maksimum",
"Minimum Font Size": "Ukuran Font Minimum",
"Monospace Font": "Font Monospace",
@@ -579,8 +578,6 @@
"Advanced Settings": "Pengaturan Lanjutan",
"File count: {{size}}": "Jumlah file: {{size}}",
"Background Read Aloud": "Bacakan Latar Belakang",
"Ready to read aloud": "Siap untuk dibacakan",
"Read Aloud": "Bacakan",
"Screen Brightness": "Kecerahan Layar",
"Background Image": "Gambar Latar Belakang",
"Import Image": "Impor Gambar",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Autentikasi WebDAV gagal. Hubungkan ulang di Pengaturan.",
"Downloading": "Mengunduh",
"Uploading": "Mengunggah",
"downloaded {{n}} book(s)": "mengunduh {{n}} buku",
"pushed {{n}} config(s)": "mengirim {{n}} konfigurasi",
"uploaded {{n}} new file(s)": "mengunggah {{n}} file baru",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sinkronisasi selesai dengan {{failed}} kegagalan. {{ok}} berhasil.",
"Sync complete": "Sinkronisasi selesai",
"Everything is already up to date.": "Semua sudah terbaru.",
"Browsing {{path}} on {{server}}": "Menjelajahi {{path}} di {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Hubungkan ke server WebDAV untuk menjelajahi file jarak jauh Anda.",
"WebDAV": "WebDAV",
"Upload Book Files": "Unggah file buku",
"Sync now": "Sinkronkan sekarang",
@@ -1517,33 +1507,8 @@
"Show password": "Tampilkan kata sandi",
"Root Directory": "Direktori root",
"Syncing…": "Menyinkronkan…",
"pulled progress for {{n}} book(s)": "menarik progres {{n}} buku",
"Sync History": "Riwayat sinkronisasi",
"Clear Sync History": "Hapus riwayat sinkronisasi",
"No manual syncs yet": "Belum ada sinkronisasi manual",
"Partial": "Sebagian",
"Cleanup": "Bersihkan",
"Cleanup failed": "Pembersihan gagal",
"Sync failed": "Sinkronisasi gagal",
"{{n}} deleted": "{{n}} dihapus",
"{{n}} failed": "{{n}} gagal",
"Nothing deleted": "Tidak ada yang dihapus",
"{{n}} downloaded": "{{n}} diunduh",
"{{n}} uploaded": "{{n}} diunggah",
"{{n}} progress": "{{n}} progres",
"Up to date": "Terbaru",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Buku diunduh",
"Files uploaded": "File diunggah",
"Configs uploaded": "Konfigurasi diunggah",
"Configs downloaded": "Konfigurasi diunduh",
"Covers uploaded": "Sampul diunggah",
"Books deleted": "Buku dihapus",
"Files in sync": "File sinkron",
"Failures": "Kegagalan",
"Total books": "Total buku",
"Error:": "Galat:",
"Failed books": "Buku gagal",
"Deleted {{n}} book(s) from server.": "Menghapus {{n}} buku dari server.",
"Failed to load directory": "Gagal memuat direktori",
"File download is only supported on the desktop and mobile apps.": "Unduhan file hanya didukung di aplikasi desktop dan ponsel.",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Pasang ekstensi browser Readest untuk mengirim artikel yang Anda baca ke perpustakaan. Ekstensi memotong halaman dari browser sehingga situs berbayar dan situs khusus login tetap dapat dibaca.",
"Added to your library. It will sync to your other devices.": "Ditambahkan ke perpustakaan Anda. Akan disinkronkan ke perangkat Anda yang lain.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Frasa sandi sinkronisasi dilupakan. Semua bidang terenkripsi dihapus.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Hanya sinkronisasi manual dan pembersihan. Sinkronisasi otomatis saat membaca tidak dicatat di sini.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Hapus {{n}} buku dari server WebDAV?\n\nIni hanya menghapus file jarak jauh; perpustakaan lokal Anda tidak terpengaruh. Penghapusan tidak dapat dibatalkan. Data di server akan hilang permanen.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Mengunggah file buku ke perangkat Anda yang lain.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frasa sandi sinkronisasi salah. Kredensial yang disinkronkan tidak dapat didekripsi.",
"Email books straight to your library": "Kirim buku langsung ke perpustakaan Anda melalui email",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Teruskan lampiran dan artikel ke alamat Readest pribadi Anda. Tersedia di paket Plus, Pro, dan Lifetime.",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "Juga menghapus progres membaca, catatan, dan penanda.",
"Background Image (Library)": "Gambar Latar Belakang (Perpustakaan)",
"Background Image (Reader)": "Gambar Latar Belakang (Tampilan Baca)",
"updated metadata for {{n}} book(s)": "metadata diperbarui untuk {{n}} buku",
"{{n}} metadata": "{{n}} metadata",
"Metadata updated": "Metadata diperbarui",
"Filter": "Filter",
"Sort by": "Urutkan menurut",
"Date modified": "Tanggal diubah",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "Kurangi Kontras",
"Reset Contrast": "Atur Ulang Kontras",
"Increase Contrast": "Tingkatkan Kontras",
"Google Drive session expired. Reconnect in Settings.": "Sesi Google Drive kedaluwarsa. Hubungkan ulang di Pengaturan.",
"Cloud sync session expired. Reconnect in Settings.": "Sesi sinkronisasi cloud kedaluwarsa. Hubungkan ulang di Pengaturan.",
"Push": "Dorong",
"Slide": "Geser",
"Page Curl": "Lengkung Halaman",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Mengatur ukuran teks hasil kamus, tidak bergantung pada tampilan baca.",
"Authentication failed. Reconnect in Settings.": "Autentikasi gagal. Hubungkan ulang di Pengaturan.",
"Full Sync": "Sinkronisasi Penuh",
"Re-check every book instead of only changed ones.": "Periksa ulang semua buku, bukan hanya yang berubah.",
"Waiting for sign-in…": "Menunggu proses masuk…",
"Reconnect": "Hubungkan Ulang",
"Connected as {{account}}": "Terhubung sebagai {{account}}",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "Pembacaan berlanjut di latar belakang",
"Stopped reading aloud": "Pembacaan dihentikan",
"Read aloud stopped": "Pembacaan telah berhenti",
"Synced via {{provider}} {{time}}": "Disinkronkan via {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Buku disinkronkan via {{provider}} - penyimpanan Readest Cloud tidak digunakan",
"Cloud provider switched": "Penyedia cloud diganti",
"Synced via {{provider}}": "Disinkronkan via {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Unggahan ke Readest Cloud dijeda selama sinkronisasi {{provider}} dipilih",
"Managed by {{provider}} while it is your cloud sync provider": "Dikelola oleh {{provider}} selama menjadi penyedia sinkronisasi cloud Anda",
"Not signed in": "Belum masuk",
"Active — syncing your library on this device": "Aktif — menyinkronkan perpustakaan Anda di perangkat ini",
"Paused — plan required": "Dijeda — memerlukan paket",
"Active · Book file uploads off": "Aktif · Unggah file buku nonaktif",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Mengunggah file buku ke perangkat Anda yang lain. Unggahan ke Readest Cloud dijeda selama penyedia ini dipilih.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Selama WebDAV dipilih, buku, progres, dan sorotan hanya disinkronkan dengan server Anda.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Pengaturan aplikasi, statistik membaca, dan kamus tetap disinkronkan melalui akun Readest Anda selama Anda masuk.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Selama Google Drive dipilih, buku, progres, dan sorotan hanya disinkronkan dengan Drive Anda.",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sinkronkan perpustakaan, progres membaca, dan sorotan Anda dengan Readest Cloud.",
"Account and Storage": "Akun dan penyimpanan",
"Manage your plan and stored files": "Kelola paket dan file tersimpan Anda",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Pilih ke mana perpustakaan Anda — buku, progres, sorotan — disinkronkan di perangkat ini. Pengaturan aplikasi, statistik membaca, dan kamus selalu disinkronkan dengan akun Readest Anda selama Anda masuk.",
"Cloud sync provider": "Penyedia sinkronisasi cloud",
"Use Readest Cloud": "Gunakan Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Perangkat lain masih menyinkronkan perpustakaan ini via Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} unggahan gagal: kuota penyimpanan tidak mencukupi"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} unggahan gagal: kuota penyimpanan tidak mencukupi",
"Library sync via {{provider}}": "Sinkronisasi pustaka melalui {{provider}}",
"Google Drive session expired": "Sesi Google Drive telah kedaluwarsa",
"Cloud sync session expired": "Sesi sinkronisasi cloud telah kedaluwarsa",
"Uploads book files to your other devices": "Mengunggah berkas buku ke perangkat Anda yang lain",
"Re-check every book instead of only changed ones": "Periksa ulang setiap buku alih-alih hanya yang berubah",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Accesso effettuato come {{userDisplayName}}",
"Match Case": "Maiuscole/minuscole",
"Match Diacritics": "Corrispondenza diacritici",
"Match Whole Words": "Parole intere",
"Maximum Number of Columns": "Numero massimo di colonne",
"Minimum Font Size": "Dimensione minima font",
"Monospace Font": "Font monospazio",
@@ -587,8 +586,6 @@
"Advanced Settings": "Impostazioni Avanzate",
"File count: {{size}}": "Conteggio file: {{size}}",
"Background Read Aloud": "Riproduzione in background",
"Ready to read aloud": "Pronto per la lettura ad alta voce",
"Read Aloud": "Leggi ad alta voce",
"Screen Brightness": "Luminosità dello schermo",
"Background Image": "Immagine di sfondo",
"Import Image": "Importa immagine",
@@ -1560,14 +1557,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Autenticazione WebDAV non riuscita. Riconnetti dalle Impostazioni.",
"Downloading": "Download",
"Uploading": "Caricamento",
"downloaded {{n}} book(s)": "scaricati {{n}} libri",
"pushed {{n}} config(s)": "inviate {{n}} configurazioni",
"uploaded {{n}} new file(s)": "caricati {{n}} nuovi file",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronizzazione completata con {{failed}} errori. {{ok}} riusciti.",
"Sync complete": "Sincronizzazione completata",
"Everything is already up to date.": "È tutto già aggiornato.",
"Browsing {{path}} on {{server}}": "Esplorazione di {{path}} su {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Collegati a un server WebDAV per sfogliare i tuoi file remoti.",
"WebDAV": "WebDAV",
"Upload Book Files": "Carica file dei libri",
"Sync now": "Sincronizza ora",
@@ -1575,33 +1565,8 @@
"Show password": "Mostra password",
"Root Directory": "Cartella root",
"Syncing…": "Sincronizzazione…",
"pulled progress for {{n}} book(s)": "avanzamento recuperato per {{n}} libro/i",
"Sync History": "Cronologia sincronizzazione",
"Clear Sync History": "Cancella cronologia sincronizzazione",
"No manual syncs yet": "Ancora nessuna sincronizzazione manuale",
"Partial": "Parziale",
"Cleanup": "Pulizia",
"Cleanup failed": "Pulizia non riuscita",
"Sync failed": "Sincronizzazione non riuscita",
"{{n}} deleted": "{{n}} eliminati",
"{{n}} failed": "{{n}} non riusciti",
"Nothing deleted": "Nessuna eliminazione",
"{{n}} downloaded": "{{n}} scaricati",
"{{n}} uploaded": "{{n}} caricati",
"{{n}} progress": "{{n}} progresso",
"Up to date": "Aggiornato",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Libri scaricati",
"Files uploaded": "File caricati",
"Configs uploaded": "Configurazioni caricate",
"Configs downloaded": "Configurazioni scaricate",
"Covers uploaded": "Copertine caricate",
"Books deleted": "Libri eliminati",
"Files in sync": "File sincronizzati",
"Failures": "Errori",
"Total books": "Libri totali",
"Error:": "Errore:",
"Failed books": "Libri non riusciti",
"Deleted {{n}} book(s) from server.": "Eliminati {{n}} libro/i dal server.",
"Failed to load directory": "Caricamento cartella non riuscito",
"File download is only supported on the desktop and mobile apps.": "Il download dei file è supportato solo nelle app desktop e mobile.",
@@ -1630,10 +1595,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installa l'estensione browser di Readest per inviare l'articolo che stai leggendo alla tua libreria. Ritaglia la pagina dal tuo browser così anche i siti a pagamento e con login funzionano.",
"Added to your library. It will sync to your other devices.": "Aggiunto alla tua libreria. Verrà sincronizzato con gli altri tuoi dispositivi.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Passphrase di sincronizzazione dimenticata. Tutti i campi cifrati sono stati cancellati.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Solo sincronizzazioni manuali e pulizie. Le sincronizzazioni automatiche durante la lettura non vengono registrate qui.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Eliminare {{n}} libro/i dal server WebDAV?\n\nQuesto rimuove solo i file remoti; la tua libreria locale non è interessata. L'eliminazione non può essere annullata. I byte sul server saranno persi per sempre.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Carica i file dei libri sugli altri tuoi dispositivi.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Passphrase di sincronizzazione errata. Impossibile decifrare le credenziali sincronizzate.",
"Email books straight to your library": "Invia i libri direttamente alla tua libreria via email",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Inoltra allegati e articoli al tuo indirizzo Readest privato. Disponibile nei piani Plus, Pro e Lifetime.",
@@ -1825,9 +1788,6 @@
"Also erase reading progress, notes, and bookmarks.": "Cancella anche il progresso di lettura, le note e i segnalibri.",
"Background Image (Library)": "Immagine di sfondo (Libreria)",
"Background Image (Reader)": "Immagine di sfondo (Vista di lettura)",
"updated metadata for {{n}} book(s)": "metadati aggiornati per {{n}} libro/i",
"{{n}} metadata": "{{n}} metadati",
"Metadata updated": "Metadati aggiornati",
"Filter": "Filtra",
"Sort by": "Ordina per",
"Date modified": "Data di modifica",
@@ -1872,8 +1832,6 @@
"Decrease Contrast": "Diminuisci contrasto",
"Reset Contrast": "Reimposta contrasto",
"Increase Contrast": "Aumenta contrasto",
"Google Drive session expired. Reconnect in Settings.": "Sessione Google Drive scaduta. Riconnetti dalle Impostazioni.",
"Cloud sync session expired. Reconnect in Settings.": "Sessione di sincronizzazione cloud scaduta. Riconnetti dalle Impostazioni.",
"Push": "Spinta",
"Slide": "Scivolamento",
"Page Curl": "Curvatura pagina",
@@ -1882,7 +1840,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Imposta la dimensione del testo dei risultati del dizionario, indipendente dalla vista di lettura.",
"Authentication failed. Reconnect in Settings.": "Autenticazione non riuscita. Riconnetti dalle Impostazioni.",
"Full Sync": "Sincronizzazione completa",
"Re-check every book instead of only changed ones.": "Ricontrolla tutti i libri, non solo quelli modificati.",
"Waiting for sign-in…": "In attesa dell'accesso…",
"Reconnect": "Riconnetti",
"Connected as {{account}}": "Collegato come {{account}}",
@@ -1907,17 +1864,13 @@
"Reading aloud continues in the background": "La lettura ad alta voce continua in background",
"Stopped reading aloud": "Lettura ad alta voce interrotta",
"Read aloud stopped": "Lettura ad alta voce interrotta",
"Synced via {{provider}} {{time}}": "Sincronizzato via {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "I libri si sincronizzano via {{provider}} - lo spazio di Readest Cloud non viene usato",
"Cloud provider switched": "Provider cloud cambiato",
"Synced via {{provider}}": "Sincronizzato via {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "I caricamenti su Readest Cloud sono in pausa finché è selezionata la sincronizzazione {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "Gestito da {{provider}} finché è il tuo provider di sincronizzazione cloud",
"Not signed in": "Accesso non effettuato",
"Active — syncing your library on this device": "Attivo — sincronizza la tua biblioteca su questo dispositivo",
"Paused — plan required": "In pausa — è richiesto un piano",
"Active · Book file uploads off": "Attivo · Caricamento dei file dei libri disattivato",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Carica i file dei libri sugli altri tuoi dispositivi. I caricamenti su Readest Cloud sono in pausa finché questo provider è selezionato.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Finché WebDAV è selezionato, libri, progresso ed evidenziazioni si sincronizzano solo con il tuo server.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Le impostazioni dell'app, le statistiche di lettura e i dizionari continuano a sincronizzarsi tramite il tuo account Readest finché hai effettuato l'accesso.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Finché Google Drive è selezionato, libri, progresso ed evidenziazioni si sincronizzano solo con il tuo Drive.",
@@ -1925,11 +1878,16 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronizza la tua biblioteca, il progresso di lettura e le evidenziazioni con Readest Cloud.",
"Account and Storage": "Account e archiviazione",
"Manage your plan and stored files": "Gestisci il tuo piano e i file archiviati",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Scegli dove sincronizzare la tua biblioteca — libri, progresso, evidenziazioni — su questo dispositivo. Le impostazioni dell'app, le statistiche di lettura e i dizionari si sincronizzano sempre con il tuo account Readest finché hai effettuato l'accesso.",
"Cloud sync provider": "Provider di sincronizzazione cloud",
"Use Readest Cloud": "Usa Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Un altro dispositivo sta ancora sincronizzando questa biblioteca via Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} caricamento non riuscito: quota di archiviazione insufficiente",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} caricamenti non riusciti: quota di archiviazione insufficiente",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} caricamenti non riusciti: quota di archiviazione insufficiente"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} caricamenti non riusciti: quota di archiviazione insufficiente",
"Library sync via {{provider}}": "Sincronizzazione della libreria tramite {{provider}}",
"Google Drive session expired": "Sessione di Google Drive scaduta",
"Cloud sync session expired": "Sessione di sincronizzazione cloud scaduta",
"Uploads book files to your other devices": "Carica i file dei libri sui tuoi altri dispositivi",
"Re-check every book instead of only changed ones": "Ricontrolla ogni libro invece dei soli modificati",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "{{userDisplayName}}としてログイン中",
"Match Case": "大文字・小文字を区別",
"Match Diacritics": "アクセント記号を区別",
"Match Whole Words": "単語全体を一致",
"Maximum Number of Columns": "最大列数",
"Minimum Font Size": "最小フォントサイズ",
"Monospace Font": "等幅フォント",
@@ -579,8 +578,6 @@
"Advanced Settings": "詳細設定",
"File count: {{size}}": "ファイル数: {{size}}",
"Background Read Aloud": "バックグラウンド読み上げ",
"Ready to read aloud": "読み上げの準備ができました",
"Read Aloud": "読み上げ",
"Screen Brightness": "画面の明るさ",
"Background Image": "背景画像",
"Import Image": "画像をインポート",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 認証に失敗しました。設定で再接続してください。",
"Downloading": "ダウンロード中",
"Uploading": "アップロード中",
"downloaded {{n}} book(s)": "{{n}} 冊ダウンロード",
"pushed {{n}} config(s)": "{{n}} 件の設定をアップロード",
"uploaded {{n}} new file(s)": "{{n}} 件の新規ファイルをアップロード",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "同期は {{failed}} 件失敗で完了しました。成功 {{ok}} 件。",
"Sync complete": "同期完了",
"Everything is already up to date.": "すべて最新の状態です。",
"Browsing {{path}} on {{server}}": "{{server}} の {{path}} を閲覧中",
"Connect to a WebDAV server to browse your remote files.": "リモートファイルを閲覧するには WebDAV サーバーに接続してください。",
"WebDAV": "WebDAV",
"Upload Book Files": "書籍ファイルをアップロード",
"Sync now": "今すぐ同期",
@@ -1517,33 +1507,8 @@
"Show password": "パスワードを表示",
"Root Directory": "ルートディレクトリ",
"Syncing…": "同期中…",
"pulled progress for {{n}} book(s)": "{{n}} 冊分の進捗を取得",
"Sync History": "同期履歴",
"Clear Sync History": "同期履歴をクリア",
"No manual syncs yet": "手動同期はまだありません",
"Partial": "一部",
"Cleanup": "クリーンアップ",
"Cleanup failed": "クリーンアップ失敗",
"Sync failed": "同期失敗",
"{{n}} deleted": "{{n}} 件削除",
"{{n}} failed": "{{n}} 件失敗",
"Nothing deleted": "削除なし",
"{{n}} downloaded": "{{n}} 件ダウンロード",
"{{n}} uploaded": "{{n}} 件アップロード",
"{{n}} progress": "{{n}} 件進捗",
"Up to date": "最新の状態",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "ダウンロードした書籍",
"Files uploaded": "アップロードしたファイル",
"Configs uploaded": "アップロードした設定",
"Configs downloaded": "ダウンロードした設定",
"Covers uploaded": "アップロードしたカバー",
"Books deleted": "削除した書籍",
"Files in sync": "同期済みファイル",
"Failures": "失敗",
"Total books": "書籍合計",
"Error:": "エラー:",
"Failed books": "失敗した書籍",
"Deleted {{n}} book(s) from server.": "サーバーから {{n}} 冊削除しました。",
"Failed to load directory": "ディレクトリの読み込みに失敗しました",
"File download is only supported on the desktop and mobile apps.": "ファイルのダウンロードはデスクトップアプリとモバイルアプリでのみサポートされています。",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "読んでいる記事をライブラリに送信するには、Readest ブラウザ拡張機能をインストールしてください。ページをブラウザから切り出すため、有料記事やログイン必須のサイトでも利用できます。",
"Added to your library. It will sync to your other devices.": "ライブラリに追加しました。他のデバイスと同期されます。",
"Sync passphrase forgotten. All encrypted fields cleared.": "同期パスフレーズを忘却しました。すべての暗号化フィールドがクリアされました。",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "手動同期とクリーンアップのみ。読書中の自動同期はここには記録されません。",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV サーバーから {{n}} 冊を削除しますか?\n\nこの操作はリモートファイルのみを削除します。ローカルライブラリには影響しません。削除は元に戻せません。サーバー上のデータは完全に失われます。",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "書籍ファイルを他のデバイスにアップロードします。",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "同期パスフレーズが正しくありません。同期された認証情報を復号できませんでした。",
"Email books straight to your library": "本をメールで直接ライブラリに送信",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "添付ファイルや記事をあなた専用の Readest アドレスに転送できます。Plus、Pro、Lifetime プランで利用可能。",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "読書進捗、メモ、ブックマークも消去します。",
"Background Image (Library)": "背景画像(ライブラリ)",
"Background Image (Reader)": "背景画像(リーダー)",
"updated metadata for {{n}} book(s)": "{{n}} 冊分のメタデータを更新",
"{{n}} metadata": "{{n}} 件メタデータ",
"Metadata updated": "更新したメタデータ",
"Filter": "フィルター",
"Sort by": "並べ替え",
"Date modified": "更新日",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "コントラストを下げる",
"Reset Contrast": "コントラストをリセット",
"Increase Contrast": "コントラストを上げる",
"Google Drive session expired. Reconnect in Settings.": "Google Drive のセッションが期限切れです。設定で再接続してください。",
"Cloud sync session expired. Reconnect in Settings.": "クラウド同期のセッションが期限切れです。設定で再接続してください。",
"Push": "プッシュ",
"Slide": "スライド",
"Page Curl": "ページカール",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "辞書の検索結果の文字サイズを、読書画面とは独立して設定します。",
"Authentication failed. Reconnect in Settings.": "認証に失敗しました。設定で再接続してください。",
"Full Sync": "完全同期",
"Re-check every book instead of only changed ones.": "変更のあった本だけでなく、すべての本を再チェックします。",
"Waiting for sign-in…": "サインインを待っています…",
"Reconnect": "再接続",
"Connected as {{account}}": "{{account}} として接続済み",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "読み上げはバックグラウンドで継続します",
"Stopped reading aloud": "読み上げを停止しました",
"Read aloud stopped": "読み上げが停止しました",
"Synced via {{provider}} {{time}}": "{{provider}} 経由で{{time}}に同期",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "書籍は {{provider}} 経由で同期されます - Readest クラウドストレージは使用されません",
"Cloud provider switched": "クラウドプロバイダーが切り替わりました",
"Synced via {{provider}}": "{{provider}} 経由で同期しました",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} 同期が選択されている間、Readest Cloud へのアップロードは一時停止されます",
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} がクラウド同期プロバイダーである間は {{provider}} が管理します",
"Not signed in": "未ログイン",
"Active — syncing your library on this device": "有効 — このデバイスでライブラリを同期中",
"Paused — plan required": "一時停止中 — プランが必要です",
"Active · Book file uploads off": "有効 · 書籍ファイルのアップロードはオフ",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "書籍ファイルを他のデバイスにアップロードします。このプロバイダーが選択されている間、Readest Cloud へのアップロードは一時停止されます。",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV が選択されている間、書籍・進捗・ハイライトはお使いのサーバーにのみ同期されます。",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "アプリ設定、読書統計、辞書は、ログイン中は引き続き Readest アカウント経由で同期されます。",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive が選択されている間、書籍・進捗・ハイライトはお使いの Drive にのみ同期されます。",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "ライブラリ、読書進捗、ハイライトを Readest Cloud と同期します。",
"Account and Storage": "アカウントとストレージ",
"Manage your plan and stored files": "プランと保存済みファイルを管理",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "このデバイスでライブラリ(書籍・進捗・ハイライト)をどこに同期するか選択します。アプリ設定、読書統計、辞書は、ログイン中は常に Readest アカウントと同期されます。",
"Cloud sync provider": "クラウド同期プロバイダー",
"Use Readest Cloud": "Readest Cloud を使用",
"Another device is still syncing this library via Readest Cloud": "別のデバイスがまだ Readest Cloud 経由でこのライブラリを同期しています",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 件のアップロードが失敗しました: ストレージクォータが不足しています"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 件のアップロードが失敗しました: ストレージクォータが不足しています",
"Library sync via {{provider}}": "{{provider}} 経由でライブラリを同期",
"Google Drive session expired": "Google Drive のセッションが期限切れです",
"Cloud sync session expired": "クラウド同期のセッションが期限切れです",
"Uploads book files to your other devices": "書籍ファイルを他のデバイスにアップロードします",
"Re-check every book instead of only changed ones": "変更されたものだけでなく、すべての書籍を再確認",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "{{userDisplayName}}(으)로 로그인됨",
"Match Case": "대소문자 구분",
"Match Diacritics": "발음 구별 부호 구분",
"Match Whole Words": "전체 단어 일치",
"Maximum Number of Columns": "최대 열 수",
"Minimum Font Size": "최소 글꼴 크기",
"Monospace Font": "고정폭 글꼴",
@@ -579,8 +578,6 @@
"Advanced Settings": "고급 설정",
"File count: {{size}}": "파일 수: {{size}}",
"Background Read Aloud": "백그라운드 음성 읽기",
"Ready to read aloud": "읽기 준비 완료",
"Read Aloud": "음성 읽기",
"Screen Brightness": "화면 밝기",
"Background Image": "배경 이미지",
"Import Image": "이미지 가져오기",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 인증에 실패했습니다. 설정에서 다시 연결하세요.",
"Downloading": "다운로드 중",
"Uploading": "업로드 중",
"downloaded {{n}} book(s)": "{{n}}권 다운로드",
"pushed {{n}} config(s)": "{{n}}개 설정 업로드",
"uploaded {{n}} new file(s)": "{{n}}개 새 파일 업로드",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "동기화가 {{failed}}건의 실패로 완료되었습니다. {{ok}}건 성공.",
"Sync complete": "동기화 완료",
"Everything is already up to date.": "모든 것이 이미 최신 상태입니다.",
"Browsing {{path}} on {{server}}": "{{server}}의 {{path}} 탐색 중",
"Connect to a WebDAV server to browse your remote files.": "원격 파일을 탐색하려면 WebDAV 서버에 연결하세요.",
"WebDAV": "WebDAV",
"Upload Book Files": "책 파일 업로드",
"Sync now": "지금 동기화",
@@ -1517,33 +1507,8 @@
"Show password": "비밀번호 표시",
"Root Directory": "루트 디렉터리",
"Syncing…": "동기화 중…",
"pulled progress for {{n}} book(s)": "{{n}}권의 진행도를 가져옴",
"Sync History": "동기화 기록",
"Clear Sync History": "동기화 기록 지우기",
"No manual syncs yet": "아직 수동 동기화 없음",
"Partial": "부분",
"Cleanup": "정리",
"Cleanup failed": "정리 실패",
"Sync failed": "동기화 실패",
"{{n}} deleted": "{{n}}개 삭제",
"{{n}} failed": "{{n}}개 실패",
"Nothing deleted": "삭제된 항목 없음",
"{{n}} downloaded": "{{n}}개 다운로드",
"{{n}} uploaded": "{{n}}개 업로드",
"{{n}} progress": "{{n}}개 진행도",
"Up to date": "최신 상태",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "다운로드한 책",
"Files uploaded": "업로드한 파일",
"Configs uploaded": "업로드한 설정",
"Configs downloaded": "다운로드한 설정",
"Covers uploaded": "업로드한 표지",
"Books deleted": "삭제한 책",
"Files in sync": "동기화된 파일",
"Failures": "실패",
"Total books": "전체 책",
"Error:": "오류:",
"Failed books": "실패한 책",
"Deleted {{n}} book(s) from server.": "서버에서 {{n}}권 삭제했습니다.",
"Failed to load directory": "디렉터리를 불러오지 못했습니다",
"File download is only supported on the desktop and mobile apps.": "파일 다운로드는 데스크톱 및 모바일 앱에서만 지원됩니다.",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "읽고 있는 기사를 라이브러리로 보내려면 Readest 브라우저 확장 프로그램을 설치하세요. 브라우저에서 페이지를 잘라내기 때문에 유료 및 로그인 전용 사이트에서도 작동합니다.",
"Added to your library. It will sync to your other devices.": "라이브러리에 추가되었습니다. 다른 기기에도 동기화됩니다.",
"Sync passphrase forgotten. All encrypted fields cleared.": "동기화 암호구를 잊었습니다. 모든 암호화된 필드가 지워졌습니다.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "수동 동기화 및 정리만 표시됩니다. 읽는 중에 자동으로 수행된 동기화는 여기에 기록되지 않습니다.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV 서버에서 {{n}}권을 삭제하시겠습니까?\n\n이 작업은 원격 파일만 제거합니다; 로컬 라이브러리에는 영향을 주지 않습니다. 삭제는 취소할 수 없습니다. 서버의 데이터는 영구히 사라집니다.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "책 파일을 다른 기기로 업로드합니다.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "동기화 암호구가 잘못되었습니다. 동기화된 자격 증명을 복호화할 수 없습니다.",
"Email books straight to your library": "이메일로 책을 라이브러리에 바로 전송",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "첨부 파일과 기사를 개인 Readest 주소로 전달하세요. Plus, Pro, Lifetime 요금제에서 사용할 수 있습니다.",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "읽기 진행 상황, 메모, 북마크도 함께 지웁니다.",
"Background Image (Library)": "배경 이미지 (라이브러리)",
"Background Image (Reader)": "배경 이미지 (리더)",
"updated metadata for {{n}} book(s)": "{{n}}권의 메타데이터 업데이트됨",
"{{n}} metadata": "{{n}} 메타데이터",
"Metadata updated": "메타데이터 업데이트됨",
"Filter": "필터",
"Sort by": "정렬 기준",
"Date modified": "수정한 날짜",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "대비 낮추기",
"Reset Contrast": "대비 재설정",
"Increase Contrast": "대비 높이기",
"Google Drive session expired. Reconnect in Settings.": "Google Drive 세션이 만료되었습니다. 설정에서 다시 연결하세요.",
"Cloud sync session expired. Reconnect in Settings.": "클라우드 동기화 세션이 만료되었습니다. 설정에서 다시 연결하세요.",
"Push": "밀기",
"Slide": "슬라이드",
"Page Curl": "책장 넘김",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "읽기 화면과 별개로 사전 결과의 텍스트 크기를 설정합니다.",
"Authentication failed. Reconnect in Settings.": "인증에 실패했습니다. 설정에서 다시 연결하세요.",
"Full Sync": "전체 동기화",
"Re-check every book instead of only changed ones.": "변경된 책만이 아니라 모든 책을 다시 확인합니다.",
"Waiting for sign-in…": "로그인을 기다리는 중…",
"Reconnect": "다시 연결",
"Connected as {{account}}": "{{account}}(으)로 연결됨",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "백그라운드에서 음성 읽기가 계속됩니다",
"Stopped reading aloud": "음성 읽기를 중지했습니다",
"Read aloud stopped": "음성 읽기가 중지되었습니다",
"Synced via {{provider}} {{time}}": "{{provider}}을(를) 통해 {{time}} 동기화됨",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "책은 {{provider}}을(를) 통해 동기화됩니다 - Readest Cloud 저장소는 사용되지 않습니다",
"Cloud provider switched": "클라우드 제공자가 전환되었습니다",
"Synced via {{provider}}": "{{provider}}을(를) 통해 동기화됨",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} 동기화가 선택되어 있는 동안 Readest Cloud 업로드가 일시 중지됩니다",
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}}이(가) 클라우드 동기화 제공자인 동안 {{provider}}이(가) 관리합니다",
"Not signed in": "로그인하지 않음",
"Active — syncing your library on this device": "활성 — 이 기기에서 라이브러리를 동기화 중",
"Paused — plan required": "일시 중지됨 — 요금제 필요",
"Active · Book file uploads off": "활성 · 책 파일 업로드 꺼짐",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "책 파일을 다른 기기로 업로드합니다. 이 제공자가 선택되어 있는 동안 Readest Cloud 업로드는 일시 중지됩니다.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV가 선택되어 있는 동안 책, 진행 상황, 하이라이트는 사용자의 서버와만 동기화됩니다.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "앱 설정, 독서 통계, 사전은 로그인되어 있는 동안 Readest 계정을 통해 계속 동기화됩니다.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive가 선택되어 있는 동안 책, 진행 상황, 하이라이트는 사용자의 Drive와만 동기화됩니다.",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "라이브러리, 읽기 진행 상황, 하이라이트를 Readest Cloud와 동기화합니다.",
"Account and Storage": "계정 및 저장소",
"Manage your plan and stored files": "요금제와 저장된 파일 관리",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "이 기기에서 라이브러리(책, 진행 상황, 하이라이트)를 어디와 동기화할지 선택하세요. 앱 설정, 독서 통계, 사전은 로그인되어 있는 동안 항상 Readest 계정과 동기화됩니다.",
"Cloud sync provider": "클라우드 동기화 제공자",
"Use Readest Cloud": "Readest Cloud 사용",
"Another device is still syncing this library via Readest Cloud": "다른 기기가 아직 Readest Cloud를 통해 이 라이브러리를 동기화하고 있습니다",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}}개의 업로드 실패: 저장소 할당량 부족"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}}개의 업로드 실패: 저장소 할당량 부족",
"Library sync via {{provider}}": "{{provider}}을(를) 통한 서재 동기화",
"Google Drive session expired": "Google Drive 세션이 만료되었습니다",
"Cloud sync session expired": "클라우드 동기화 세션이 만료되었습니다",
"Uploads book files to your other devices": "책 파일을 다른 기기에 업로드합니다",
"Re-check every book instead of only changed ones": "변경된 책뿐 아니라 모든 책을 다시 확인",
"KOReader": "KOReader"
}
@@ -274,7 +274,6 @@
"Book": "Buku",
"Chapter": "Bab",
"Match Case": "Padankan Kes",
"Match Whole Words": "Padankan Seluruh Perkataan",
"Match Diacritics": "Padankan Diakritik",
"Sidebar": "Bar Sisi",
"Resize Sidebar": "Ubah Saiz Bar Sisi",
@@ -291,8 +290,6 @@
"Play": "Main",
"Next Sentence": "Ayat Seterusnya",
"Next Paragraph": "Perenggan Seterusnya",
"Read Aloud": "Baca Dengan Kuat",
"Ready to read aloud": "Bersedia untuk baca dengan kuat",
"TTS not supported for this document": "TTS tidak disokong untuk dokumen ini",
"No Timeout": "Tiada Had Masa",
"{{value}} minute": "{{value}} minit",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Pengesahan WebDAV gagal. Sambung semula di Tetapan.",
"Downloading": "Memuat turun",
"Uploading": "Memuat naik",
"downloaded {{n}} book(s)": "memuat turun {{n}} buah buku",
"pushed {{n}} config(s)": "menghantar {{n}} konfigurasi",
"uploaded {{n}} new file(s)": "memuat naik {{n}} fail baharu",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Penyegerakan selesai dengan {{failed}} kegagalan. {{ok}} berjaya.",
"Sync complete": "Penyegerakan selesai",
"Everything is already up to date.": "Semuanya sudah terkini.",
"Browsing {{path}} on {{server}}": "Melayari {{path}} di {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Sambung ke pelayan WebDAV untuk melayari fail jauh anda.",
"WebDAV": "WebDAV",
"Upload Book Files": "Muat naik fail buku",
"Sync now": "Segerakkan sekarang",
@@ -1517,33 +1507,8 @@
"Show password": "Tunjukkan kata laluan",
"Root Directory": "Direktori akar",
"Syncing…": "Menyegerakkan…",
"pulled progress for {{n}} book(s)": "mengambil kemajuan untuk {{n}} buah buku",
"Sync History": "Sejarah Penyegerakan",
"Clear Sync History": "Kosongkan Sejarah Penyegerakan",
"No manual syncs yet": "Belum ada penyegerakan manual",
"Partial": "Sebahagian",
"Cleanup": "Pembersihan",
"Cleanup failed": "Pembersihan gagal",
"Sync failed": "Penyegerakan gagal",
"{{n}} deleted": "{{n}} dipadam",
"{{n}} failed": "{{n}} gagal",
"Nothing deleted": "Tiada yang dipadam",
"{{n}} downloaded": "{{n}} dimuat turun",
"{{n}} uploaded": "{{n}} dimuat naik",
"{{n}} progress": "{{n}} kemajuan",
"Up to date": "Terkini",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Buku dimuat turun",
"Files uploaded": "Fail dimuat naik",
"Configs uploaded": "Konfigurasi dimuat naik",
"Configs downloaded": "Konfigurasi dimuat turun",
"Covers uploaded": "Kulit dimuat naik",
"Books deleted": "Buku dipadam",
"Files in sync": "Fail tersegerak",
"Failures": "Kegagalan",
"Total books": "Jumlah buku",
"Error:": "Ralat:",
"Failed books": "Buku gagal",
"Deleted {{n}} book(s) from server.": "Memadam {{n}} buah buku dari pelayan.",
"Failed to load directory": "Gagal memuatkan direktori",
"File download is only supported on the desktop and mobile apps.": "Muat turun fail hanya disokong pada aplikasi desktop dan mudah alih.",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Pasang sambungan pelayar Readest untuk menghantar artikel yang sedang anda baca ke perpustakaan. Sambungan ini memotong halaman dari pelayar anda supaya laman berbayar dan laman log masuk sahaja masih berfungsi.",
"Added to your library. It will sync to your other devices.": "Ditambah ke perpustakaan anda. Akan disegerakkan ke peranti anda yang lain.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Frasa kata laluan penyegerakan dilupakan. Semua medan yang disulitkan dibersihkan.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Hanya penyegerakan manual dan pembersihan. Penyegerakan automatik semasa membaca tidak dilog di sini.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Padam {{n}} buah buku dari pelayan WebDAV?\n\nIni hanya membuang fail jauh; perpustakaan tempatan anda tidak terjejas. Pemadaman tidak boleh dibatalkan. Bait di pelayan akan hilang selamanya.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Memuat naik fail buku ke peranti anda yang lain.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frasa kata laluan penyegerakan salah. Bukti kelayakan yang disegerakkan tidak dapat dinyahsulit.",
"Email books straight to your library": "E-mel buku terus ke perpustakaan anda",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Majukan lampiran dan artikel ke alamat Readest peribadi anda. Tersedia pada pelan Plus, Pro dan Lifetime.",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "Turut memadam kemajuan membaca, nota dan penanda buku.",
"Background Image (Library)": "Imej Latar Belakang (Perpustakaan)",
"Background Image (Reader)": "Imej Latar Belakang (Paparan Bacaan)",
"updated metadata for {{n}} book(s)": "metadata dikemas kini untuk {{n}} buku",
"{{n}} metadata": "{{n}} metadata",
"Metadata updated": "Metadata dikemas kini",
"Filter": "Tapis",
"Sort by": "Isih mengikut",
"Date modified": "Tarikh diubah suai",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "Kurangkan Kontras",
"Reset Contrast": "Tetapkan Semula Kontras",
"Increase Contrast": "Tingkatkan Kontras",
"Google Drive session expired. Reconnect in Settings.": "Sesi Google Drive telah tamat tempoh. Sambung semula di Tetapan.",
"Cloud sync session expired. Reconnect in Settings.": "Sesi segerak awan telah tamat tempoh. Sambung semula di Tetapan.",
"Push": "Tolak",
"Slide": "Luncur",
"Page Curl": "Lengkung Halaman",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Menetapkan saiz teks hasil kamus, tidak bergantung pada paparan bacaan.",
"Authentication failed. Reconnect in Settings.": "Pengesahan gagal. Sambung semula di Tetapan.",
"Full Sync": "Segerak Penuh",
"Re-check every book instead of only changed ones.": "Semak semula setiap buku dan bukan hanya yang berubah.",
"Waiting for sign-in…": "Menunggu log masuk…",
"Reconnect": "Sambung Semula",
"Connected as {{account}}": "Disambungkan sebagai {{account}}",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "Bacaan kuat diteruskan di latar belakang",
"Stopped reading aloud": "Berhenti membaca dengan kuat",
"Read aloud stopped": "Bacaan kuat dihentikan",
"Synced via {{provider}} {{time}}": "Disegerakkan melalui {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Buku disegerakkan melalui {{provider}} - storan Readest Cloud tidak digunakan",
"Cloud provider switched": "Penyedia awan ditukar",
"Synced via {{provider}}": "Disegerakkan melalui {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Muat naik ke Readest Cloud dijeda selagi penyegerakan {{provider}} dipilih",
"Managed by {{provider}} while it is your cloud sync provider": "Diuruskan oleh {{provider}} selagi ia penyedia penyegerakan awan anda",
"Not signed in": "Belum log masuk",
"Active — syncing your library on this device": "Aktif — menyegerakkan perpustakaan anda pada peranti ini",
"Paused — plan required": "Dijeda — pelan diperlukan",
"Active · Book file uploads off": "Aktif · Muat naik fail buku dimatikan",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Memuat naik fail buku ke peranti anda yang lain. Muat naik ke Readest Cloud dijeda selagi penyedia ini dipilih.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Selagi WebDAV dipilih, buku, kemajuan dan penonjolan hanya disegerakkan dengan pelayan anda.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Tetapan aplikasi, statistik bacaan dan kamus terus disegerakkan melalui akaun Readest anda selagi anda log masuk.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Selagi Google Drive dipilih, buku, kemajuan dan penonjolan hanya disegerakkan dengan Drive anda.",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Segerakkan perpustakaan, kemajuan bacaan dan penonjolan anda dengan Readest Cloud.",
"Account and Storage": "Akaun dan storan",
"Manage your plan and stored files": "Urus pelan dan fail tersimpan anda",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Pilih ke mana perpustakaan anda — buku, kemajuan, penonjolan — disegerakkan pada peranti ini. Tetapan aplikasi, statistik bacaan dan kamus sentiasa disegerakkan dengan akaun Readest anda selagi anda log masuk.",
"Cloud sync provider": "Penyedia penyegerakan awan",
"Use Readest Cloud": "Guna Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Peranti lain masih menyegerakkan perpustakaan ini melalui Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} muat naik gagal: kuota storan tidak mencukupi"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} muat naik gagal: kuota storan tidak mencukupi",
"Library sync via {{provider}}": "Penyegerakan pustaka melalui {{provider}}",
"Google Drive session expired": "Sesi Google Drive telah tamat tempoh",
"Cloud sync session expired": "Sesi penyegerakan awan telah tamat tempoh",
"Uploads book files to your other devices": "Memuat naik fail buku ke peranti anda yang lain",
"Re-check every book instead of only changed ones": "Semak semula setiap buku dan bukan hanya yang berubah",
"KOReader": "KOReader"
}
@@ -199,7 +199,6 @@
"Book": "Boek",
"Chapter": "Hoofdstuk",
"Match Case": "Hoofdlettergevoelig",
"Match Whole Words": "Hele woorden",
"Match Diacritics": "Diakritische tekens",
"TOC": "Inhoudsopgave",
"Table of Contents": "Inhoudsopgave",
@@ -583,8 +582,6 @@
"Advanced Settings": "Geavanceerde Instellingen",
"File count: {{size}}": "Bestandsaantal: {{size}}",
"Background Read Aloud": "Achtergrond Voorlezen",
"Ready to read aloud": "Klaar om voor te lezen",
"Read Aloud": "Voorlezen",
"Screen Brightness": "Schermhelderheid",
"Background Image": "Achtergrondafbeelding",
"Import Image": "Afbeelding importeren",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV-authenticatie mislukt. Verbind opnieuw in Instellingen.",
"Downloading": "Downloaden",
"Uploading": "Uploaden",
"downloaded {{n}} book(s)": "{{n}} boek(en) gedownload",
"pushed {{n}} config(s)": "{{n}} configuratie(s) verzonden",
"uploaded {{n}} new file(s)": "{{n}} nieuw(e) bestand(en) geüpload",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronisatie voltooid met {{failed}} fout(en). {{ok}} ok.",
"Sync complete": "Synchronisatie voltooid",
"Everything is already up to date.": "Alles is al up-to-date.",
"Browsing {{path}} on {{server}}": "{{path}} bekijken op {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Maak verbinding met een WebDAV-server om je externe bestanden te bekijken.",
"WebDAV": "WebDAV",
"Upload Book Files": "Boekbestanden uploaden",
"Sync now": "Nu synchroniseren",
@@ -1546,33 +1536,8 @@
"Show password": "Wachtwoord tonen",
"Root Directory": "Hoofdmap",
"Syncing…": "Synchroniseren…",
"pulled progress for {{n}} book(s)": "voortgang opgehaald voor {{n}} boek(en)",
"Sync History": "Synchronisatiegeschiedenis",
"Clear Sync History": "Synchronisatiegeschiedenis wissen",
"No manual syncs yet": "Nog geen handmatige synchronisaties",
"Partial": "Gedeeltelijk",
"Cleanup": "Opschonen",
"Cleanup failed": "Opschonen mislukt",
"Sync failed": "Synchronisatie mislukt",
"{{n}} deleted": "{{n}} verwijderd",
"{{n}} failed": "{{n}} mislukt",
"Nothing deleted": "Niets verwijderd",
"{{n}} downloaded": "{{n}} gedownload",
"{{n}} uploaded": "{{n}} geüpload",
"{{n}} progress": "{{n}} voortgang",
"Up to date": "Up-to-date",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Boeken gedownload",
"Files uploaded": "Bestanden geüpload",
"Configs uploaded": "Configuraties geüpload",
"Configs downloaded": "Configuraties gedownload",
"Covers uploaded": "Omslagen geüpload",
"Books deleted": "Verwijderde boeken",
"Files in sync": "Gesynchroniseerde bestanden",
"Failures": "Fouten",
"Total books": "Totaal aantal boeken",
"Error:": "Fout:",
"Failed books": "Mislukte boeken",
"Deleted {{n}} book(s) from server.": "{{n}} boek(en) van server verwijderd.",
"Failed to load directory": "Map kon niet worden geladen",
"File download is only supported on the desktop and mobile apps.": "Bestanden downloaden wordt alleen ondersteund in de desktop- en mobiele apps.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installeer de Readest-browserextensie om het artikel dat je leest naar je bibliotheek te sturen. De extensie knipt de pagina vanuit je browser, zodat ook betaalsites en login-only sites werken.",
"Added to your library. It will sync to your other devices.": "Toegevoegd aan je bibliotheek. Het wordt gesynchroniseerd met je andere apparaten.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Sync-wachtwoordzin vergeten. Alle versleutelde velden gewist.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Alleen handmatige synchronisaties en opschoonacties. Automatische synchronisaties tijdens het lezen worden hier niet vastgelegd.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "{{n}} boek(en) van WebDAV-server verwijderen?\n\nDit verwijdert alleen de externe bestanden; je lokale bibliotheek wordt niet beïnvloed. Verwijderen kan niet ongedaan worden gemaakt. De bytes op de server zijn permanent verloren.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Uploadt boekbestanden naar uw andere apparaten.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Verkeerde sync-wachtwoordzin. Gesynchroniseerde inloggegevens konden niet worden ontsleuteld.",
"Email books straight to your library": "Mail boeken rechtstreeks naar je bibliotheek",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Stuur bijlagen en artikelen door naar je privé Readest-adres. Beschikbaar in de Plus-, Pro- en Lifetime-abonnementen.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "Wist ook leesvoortgang, notities en bladwijzers.",
"Background Image (Library)": "Achtergrondafbeelding (Bibliotheek)",
"Background Image (Reader)": "Achtergrondafbeelding (Leesweergave)",
"updated metadata for {{n}} book(s)": "metadata bijgewerkt voor {{n}} boek(en)",
"{{n}} metadata": "{{n}} metadata",
"Metadata updated": "Metadata bijgewerkt",
"Filter": "Filteren",
"Sort by": "Sorteren op",
"Date modified": "Wijzigingsdatum",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "Contrast verlagen",
"Reset Contrast": "Contrast resetten",
"Increase Contrast": "Contrast verhogen",
"Google Drive session expired. Reconnect in Settings.": "Google Drive-sessie verlopen. Verbind opnieuw via Instellingen.",
"Cloud sync session expired. Reconnect in Settings.": "Cloudsynchronisatie-sessie verlopen. Verbind opnieuw via Instellingen.",
"Push": "Duwen",
"Slide": "Schuiven",
"Page Curl": "Omslaan",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Stelt de tekstgrootte van woordenboekresultaten in, onafhankelijk van de leesweergave.",
"Authentication failed. Reconnect in Settings.": "Verificatie mislukt. Verbind opnieuw via Instellingen.",
"Full Sync": "Volledige synchronisatie",
"Re-check every book instead of only changed ones.": "Controleer elk boek opnieuw in plaats van alleen gewijzigde boeken.",
"Waiting for sign-in…": "Wachten op inloggen…",
"Reconnect": "Opnieuw verbinden",
"Connected as {{account}}": "Verbonden als {{account}}",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "Voorlezen gaat door op de achtergrond",
"Stopped reading aloud": "Voorlezen gestopt",
"Read aloud stopped": "Voorlezen is gestopt",
"Synced via {{provider}} {{time}}": "Gesynchroniseerd via {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Boeken synchroniseren via {{provider}} - Readest Cloud-opslag wordt niet gebruikt",
"Cloud provider switched": "Cloudprovider gewisseld",
"Synced via {{provider}}": "Gesynchroniseerd via {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Uploads naar Readest Cloud zijn gepauzeerd zolang {{provider}}-synchronisatie is geselecteerd",
"Managed by {{provider}} while it is your cloud sync provider": "Beheerd door {{provider}} zolang het je cloudsynchronisatieprovider is",
"Not signed in": "Niet ingelogd",
"Active — syncing your library on this device": "Actief — synchroniseert je bibliotheek op dit apparaat",
"Paused — plan required": "Gepauzeerd — abonnement vereist",
"Active · Book file uploads off": "Actief · Uploaden van boekbestanden uit",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Uploadt boekbestanden naar uw andere apparaten. Uploads naar Readest Cloud worden gepauzeerd zolang deze provider is geselecteerd.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Zolang WebDAV is geselecteerd, worden boeken, voortgang en markeringen alleen met je server gesynchroniseerd.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "App-instellingen, leesstatistieken en woordenboeken blijven via je Readest-account synchroniseren zolang je bent ingelogd.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Zolang Google Drive is geselecteerd, worden boeken, voortgang en markeringen alleen met je Drive gesynchroniseerd.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchroniseer je bibliotheek, leesvoortgang en markeringen met Readest Cloud.",
"Account and Storage": "Account en opslag",
"Manage your plan and stored files": "Beheer je abonnement en opgeslagen bestanden",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Kies waar je bibliotheek — boeken, voortgang, markeringen — op dit apparaat synchroniseert. App-instellingen, leesstatistieken en woordenboeken synchroniseren altijd met je Readest-account zolang je bent ingelogd.",
"Cloud sync provider": "Cloudsynchronisatieprovider",
"Use Readest Cloud": "Readest Cloud gebruiken",
"Another device is still syncing this library via Readest Cloud": "Een ander apparaat synchroniseert deze bibliotheek nog via Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} upload mislukt: onvoldoende opslagruimte",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} uploads mislukt: onvoldoende opslagruimte"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} uploads mislukt: onvoldoende opslagruimte",
"Library sync via {{provider}}": "Bibliotheeksynchronisatie via {{provider}}",
"Google Drive session expired": "Google Drive-sessie verlopen",
"Cloud sync session expired": "Cloudsynchronisatiesessie verlopen",
"Uploads book files to your other devices": "Uploadt boekbestanden naar je andere apparaten",
"Re-check every book instead of only changed ones": "Controleer elk boek opnieuw in plaats van alleen gewijzigde",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Zalogowano jako {{userDisplayName}}",
"Match Case": "Uwzględnij wielkość liter",
"Match Diacritics": "Uwzględnij znaki diakrytyczne",
"Match Whole Words": "Uwzględnij całe słowa",
"Maximum Number of Columns": "Maksymalna liczba kolumn",
"Minimum Font Size": "Minimalny rozmiar czcionki",
"Monospace Font": "Czcionka o stałej szerokości",
@@ -591,8 +590,6 @@
"Advanced Settings": "Ustawienia zaawansowane",
"File count: {{size}}": "Liczba plików: {{size}}",
"Background Read Aloud": "Czytanie na głos w tle",
"Ready to read aloud": "Gotowy do przeczytania na głos",
"Read Aloud": "Czytaj na głos",
"Screen Brightness": "Jasność ekranu",
"Background Image": "Obraz tła",
"Import Image": "Importuj obraz",
@@ -1589,14 +1586,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Uwierzytelnienie WebDAV nie powiodło się. Połącz ponownie w Ustawieniach.",
"Downloading": "Pobieranie",
"Uploading": "Wysyłanie",
"downloaded {{n}} book(s)": "pobrano {{n}} książkę/książek",
"pushed {{n}} config(s)": "wysłano {{n}} konfigurację/konfiguracji",
"uploaded {{n}} new file(s)": "wysłano {{n}} nowy plik/plików",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronizacja zakończona z {{failed}} niepowodzeniami. {{ok}} ok.",
"Sync complete": "Synchronizacja zakończona",
"Everything is already up to date.": "Wszystko jest aktualne.",
"Browsing {{path}} on {{server}}": "Przeglądanie {{path}} na {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Połącz się z serwerem WebDAV, aby przeglądać zdalne pliki.",
"WebDAV": "WebDAV",
"Upload Book Files": "Wyślij pliki książek",
"Sync now": "Synchronizuj teraz",
@@ -1604,33 +1594,8 @@
"Show password": "Pokaż hasło",
"Root Directory": "Katalog główny",
"Syncing…": "Synchronizacja…",
"pulled progress for {{n}} book(s)": "pobrano postępy {{n}} książek",
"Sync History": "Historia synchronizacji",
"Clear Sync History": "Wyczyść historię synchronizacji",
"No manual syncs yet": "Brak ręcznych synchronizacji",
"Partial": "Częściowo",
"Cleanup": "Porządkowanie",
"Cleanup failed": "Porządkowanie nieudane",
"Sync failed": "Synchronizacja nieudana",
"{{n}} deleted": "{{n}} usunięto",
"{{n}} failed": "{{n}} nie powiodło się",
"Nothing deleted": "Nic nie usunięto",
"{{n}} downloaded": "{{n}} pobrano",
"{{n}} uploaded": "{{n}} wysłano",
"{{n}} progress": "{{n}} postępów",
"Up to date": "Aktualne",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Pobrane książki",
"Files uploaded": "Wysłane pliki",
"Configs uploaded": "Wysłane konfiguracje",
"Configs downloaded": "Pobrane konfiguracje",
"Covers uploaded": "Wysłane okładki",
"Books deleted": "Usunięte książki",
"Files in sync": "Pliki w synchronizacji",
"Failures": "Niepowodzenia",
"Total books": "Łącznie książek",
"Error:": "Błąd:",
"Failed books": "Książki z błędem",
"Deleted {{n}} book(s) from server.": "Usunięto {{n}} książkę/książek z serwera.",
"Failed to load directory": "Nie udało się załadować katalogu",
"File download is only supported on the desktop and mobile apps.": "Pobieranie plików jest obsługiwane tylko w aplikacjach na komputer i urządzenia mobilne.",
@@ -1660,10 +1625,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Zainstaluj rozszerzenie przeglądarki Readest, aby wysłać czytany artykuł do biblioteki. Wycina stronę z przeglądarki, dzięki czemu działają również strony płatne i wymagające logowania.",
"Added to your library. It will sync to your other devices.": "Dodano do biblioteki. Zostanie zsynchronizowane z innymi urządzeniami.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Zapomniano hasło synchronizacji. Wszystkie zaszyfrowane pola wyczyszczone.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Tylko ręczne synchronizacje i porządkowanie. Automatyczne synchronizacje podczas czytania nie są tu rejestrowane.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Usunąć {{n}} książek z serwera WebDAV?\n\nUsuwa to tylko zdalne pliki; lokalna biblioteka pozostaje nienaruszona. Usunięcia nie można cofnąć. Bajty na serwerze zostaną trwale utracone.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Przesyła pliki książek na Twoje inne urządzenia.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Nieprawidłowe hasło synchronizacji. Nie udało się odszyfrować zsynchronizowanych poświadczeń.",
"Email books straight to your library": "Wysyłaj książki e-mailem prosto do biblioteki",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Przekazuj załączniki i artykuły na swój prywatny adres Readest. Dostępne w planach Plus, Pro i Lifetime.",
@@ -1858,9 +1821,6 @@
"Also erase reading progress, notes, and bookmarks.": "Usuwa również postęp czytania, notatki i zakładki.",
"Background Image (Library)": "Obraz tła (Biblioteka)",
"Background Image (Reader)": "Obraz tła (Widok czytania)",
"updated metadata for {{n}} book(s)": "zaktualizowano metadane dla {{n}} książek",
"{{n}} metadata": "{{n}} metadane",
"Metadata updated": "Zaktualizowane metadane",
"Filter": "Filtruj",
"Sort by": "Sortuj według",
"Date modified": "Data modyfikacji",
@@ -1906,8 +1866,6 @@
"Decrease Contrast": "Zmniejsz kontrast",
"Reset Contrast": "Zresetuj kontrast",
"Increase Contrast": "Zwiększ kontrast",
"Google Drive session expired. Reconnect in Settings.": "Sesja Google Drive wygasła. Połącz ponownie w Ustawieniach.",
"Cloud sync session expired. Reconnect in Settings.": "Sesja synchronizacji w chmurze wygasła. Połącz ponownie w Ustawieniach.",
"Push": "Przesunięcie",
"Slide": "Nasunięcie",
"Page Curl": "Zawijanie strony",
@@ -1916,7 +1874,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Ustawia rozmiar tekstu wyników słownika, niezależnie od widoku czytania.",
"Authentication failed. Reconnect in Settings.": "Uwierzytelnianie nie powiodło się. Połącz ponownie w Ustawieniach.",
"Full Sync": "Pełna synchronizacja",
"Re-check every book instead of only changed ones.": "Sprawdzaj ponownie wszystkie książki, a nie tylko zmienione.",
"Waiting for sign-in…": "Oczekiwanie na zalogowanie…",
"Reconnect": "Połącz ponownie",
"Connected as {{account}}": "Połączono jako {{account}}",
@@ -1941,17 +1898,13 @@
"Reading aloud continues in the background": "Czytanie na głos jest kontynuowane w tle",
"Stopped reading aloud": "Zatrzymano czytanie na głos",
"Read aloud stopped": "Czytanie na głos zatrzymane",
"Synced via {{provider}} {{time}}": "Zsynchronizowano przez {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Książki synchronizują się przez {{provider}} - magazyn Readest Cloud nie jest używany",
"Cloud provider switched": "Zmieniono dostawcę chmury",
"Synced via {{provider}}": "Zsynchronizowano przez {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Przesyłanie do Readest Cloud jest wstrzymane, dopóki wybrana jest synchronizacja {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "Zarządzane przez {{provider}}, dopóki jest Twoim dostawcą synchronizacji w chmurze",
"Not signed in": "Nie zalogowano",
"Active — syncing your library on this device": "Aktywne — synchronizuje Twoją bibliotekę na tym urządzeniu",
"Paused — plan required": "Wstrzymano — wymagany plan",
"Active · Book file uploads off": "Aktywne · Przesyłanie plików książek wyłączone",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Przesyła pliki książek na Twoje inne urządzenia. Przesyłanie do Readest Cloud jest wstrzymane, dopóki wybrany jest ten dostawca.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Dopóki wybrany jest WebDAV, książki, postęp i zaznaczenia synchronizują się tylko z Twoim serwerem.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Ustawienia aplikacji, statystyki czytania i słowniki nadal synchronizują się przez Twoje konto Readest, dopóki jesteś zalogowany.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Dopóki wybrany jest Google Drive, książki, postęp i zaznaczenia synchronizują się tylko z Twoim Drive.",
@@ -1959,12 +1912,17 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchronizuj bibliotekę, postęp czytania i zaznaczenia z Readest Cloud.",
"Account and Storage": "Konto i przechowywanie",
"Manage your plan and stored files": "Zarządzaj swoim planem i przechowywanymi plikami",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Wybierz, dokąd synchronizuje się Twoja biblioteka — książki, postęp, zaznaczenia — na tym urządzeniu. Ustawienia aplikacji, statystyki czytania i słowniki zawsze synchronizują się z Twoim kontem Readest, dopóki jesteś zalogowany.",
"Cloud sync provider": "Dostawca synchronizacji w chmurze",
"Use Readest Cloud": "Użyj Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Inne urządzenie nadal synchronizuje tę bibliotekę przez Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} przesyłanie nieudane: niewystarczająca kwota przechowywania",
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} przesyłania nieudane: niewystarczająca kwota przechowywania",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} przesyłań nieudanych: niewystarczająca kwota przechowywania",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} przesyłania nieudane: niewystarczająca kwota przechowywania"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} przesyłania nieudane: niewystarczająca kwota przechowywania",
"Library sync via {{provider}}": "Synchronizacja biblioteki przez {{provider}}",
"Google Drive session expired": "Sesja Google Drive wygasła",
"Cloud sync session expired": "Sesja synchronizacji w chmurze wygasła",
"Uploads book files to your other devices": "Przesyła pliki książek na Twoje inne urządzenia",
"Re-check every book instead of only changed ones": "Ponownie sprawdź każdą książkę zamiast tylko zmienionych",
"KOReader": "KOReader"
}
@@ -671,7 +671,6 @@
"Clear search history": "Limpar histórico de pesquisa",
"Chapter": "Capítulo",
"Match Case": "Diferenciar maiúsculas e minúsculas",
"Match Whole Words": "Corresponder palavras inteiras",
"Match Diacritics": "Corresponder acentos",
"Search results for '{{term}}'": "Resultados para '{{term}}'",
"Previous Result": "Resultado anterior",
@@ -746,8 +745,6 @@
"Translating...": "Traduzindo...",
"Please log in to use advanced TTS features": "Faça login para usar recursos avançados de TTS",
"TTS not supported for this document": "TTS não suportado para este documento",
"Read Aloud": "Ler em voz alta",
"Ready to read aloud": "Pronto para leitura em voz alta",
"Expires in {{count}} days_one": "Expira em 1 dia",
"Expires in {{count}} days_many": "Expira em {{count}} dias",
"Expires in {{count}} days_other": "Expira em {{count}} dias",
@@ -1560,14 +1557,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Autenticação WebDAV falhou. Reconecte em Configurações.",
"Downloading": "Baixando",
"Uploading": "Enviando",
"downloaded {{n}} book(s)": "{{n}} livro(s) baixado(s)",
"pushed {{n}} config(s)": "{{n}} configuração(ões) enviada(s)",
"uploaded {{n}} new file(s)": "{{n}} novo(s) arquivo(s) enviado(s)",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronização concluída com {{failed}} falha(s). {{ok}} ok.",
"Sync complete": "Sincronização concluída",
"Everything is already up to date.": "Tudo já está atualizado.",
"Browsing {{path}} on {{server}}": "Navegando em {{path}} no {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Conecte-se a um servidor WebDAV para navegar nos seus arquivos remotos.",
"WebDAV": "WebDAV",
"Upload Book Files": "Enviar arquivos de livros",
"Sync now": "Sincronizar agora",
@@ -1575,33 +1565,8 @@
"Show password": "Mostrar senha",
"Root Directory": "Diretório raiz",
"Syncing…": "Sincronizando…",
"pulled progress for {{n}} book(s)": "progresso de {{n}} livro(s) obtido",
"Sync History": "Histórico de sincronização",
"Clear Sync History": "Limpar histórico de sincronização",
"No manual syncs yet": "Sem sincronizações manuais ainda",
"Partial": "Parcial",
"Cleanup": "Limpeza",
"Cleanup failed": "Limpeza falhou",
"Sync failed": "Sincronização falhou",
"{{n}} deleted": "{{n}} excluídos",
"{{n}} failed": "{{n}} com falha",
"Nothing deleted": "Nada excluído",
"{{n}} downloaded": "{{n}} baixados",
"{{n}} uploaded": "{{n}} enviados",
"{{n}} progress": "{{n}} progressos",
"Up to date": "Atualizado",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Livros baixados",
"Files uploaded": "Arquivos enviados",
"Configs uploaded": "Configurações enviadas",
"Configs downloaded": "Configurações baixadas",
"Covers uploaded": "Capas enviadas",
"Books deleted": "Livros excluídos",
"Files in sync": "Arquivos em sincronia",
"Failures": "Falhas",
"Total books": "Total de livros",
"Error:": "Erro:",
"Failed books": "Livros com falha",
"Deleted {{n}} book(s) from server.": "{{n}} livro(s) excluído(s) do servidor.",
"Failed to load directory": "Falha ao carregar diretório",
"File download is only supported on the desktop and mobile apps.": "O download de arquivos só é suportado nos aplicativos para desktop e celular.",
@@ -1630,10 +1595,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instale a extensão de navegador Readest para enviar o artigo que você está lendo para sua biblioteca. Ela recorta a página do seu navegador, então sites pagos e somente com login continuam funcionando.",
"Added to your library. It will sync to your other devices.": "Adicionado à sua biblioteca. Será sincronizado com seus outros dispositivos.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Frase-senha de sincronização esquecida. Todos os campos criptografados foram limpos.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Apenas sincronizações manuais e limpezas. As sincronizações automáticas durante a leitura não são registradas aqui.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Excluir {{n}} livro(s) do servidor WebDAV?\n\nIsso apenas remove os arquivos remotos; sua biblioteca local não é afetada. A exclusão não pode ser desfeita. Os bytes no servidor desaparecerão permanentemente.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Envia os arquivos de livros para os seus outros dispositivos.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frase-senha de sincronização incorreta. Não foi possível descriptografar as credenciais sincronizadas.",
"Email books straight to your library": "Envie livros por e-mail direto para sua biblioteca",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Encaminhe anexos e artigos para seu endereço Readest privado. Disponível nos planos Plus, Pro e Lifetime.",
@@ -1825,9 +1788,6 @@
"Also erase reading progress, notes, and bookmarks.": "Também apaga o progresso de leitura, as notas e os marcadores.",
"Background Image (Library)": "Imagem de fundo (Biblioteca)",
"Background Image (Reader)": "Imagem de fundo (Vista de leitura)",
"updated metadata for {{n}} book(s)": "metadados atualizados de {{n}} livro(s)",
"{{n}} metadata": "{{n}} metadados",
"Metadata updated": "Metadados atualizados",
"Filter": "Filtrar",
"Sort by": "Ordenar por",
"Date modified": "Data de modificação",
@@ -1872,8 +1832,6 @@
"Decrease Contrast": "Diminuir contraste",
"Reset Contrast": "Redefinir contraste",
"Increase Contrast": "Aumentar contraste",
"Google Drive session expired. Reconnect in Settings.": "A sessão do Google Drive expirou. Reconecte em Configurações.",
"Cloud sync session expired. Reconnect in Settings.": "A sessão de sincronização na nuvem expirou. Reconecte em Configurações.",
"Push": "Empurrar",
"Slide": "Deslizar",
"Page Curl": "Curvatura de página",
@@ -1882,7 +1840,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Define o tamanho do texto dos resultados do dicionário, independente da visualização de leitura.",
"Authentication failed. Reconnect in Settings.": "A autenticação falhou. Reconecte em Configurações.",
"Full Sync": "Sincronização completa",
"Re-check every book instead of only changed ones.": "Verifica novamente todos os livros, não apenas os alterados.",
"Waiting for sign-in…": "Aguardando login…",
"Reconnect": "Reconectar",
"Connected as {{account}}": "Conectado como {{account}}",
@@ -1907,17 +1864,13 @@
"Reading aloud continues in the background": "A leitura em voz alta continua em segundo plano",
"Stopped reading aloud": "Leitura em voz alta interrompida",
"Read aloud stopped": "Leitura em voz alta interrompida",
"Synced via {{provider}} {{time}}": "Sincronizado via {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Os livros sincronizam via {{provider}} - o armazenamento do Readest Cloud não é usado",
"Cloud provider switched": "Provedor de nuvem alterado",
"Synced via {{provider}}": "Sincronizado via {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Os envios para o Readest Cloud estão pausados enquanto a sincronização {{provider}} estiver selecionada",
"Managed by {{provider}} while it is your cloud sync provider": "Gerenciado por {{provider}} enquanto for o seu provedor de sincronização na nuvem",
"Not signed in": "Não conectado",
"Active — syncing your library on this device": "Ativo — sincronizando sua biblioteca neste dispositivo",
"Paused — plan required": "Pausado — é necessário um plano",
"Active · Book file uploads off": "Ativo · Envio de arquivos de livros desligado",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Envia os arquivos de livros para os seus outros dispositivos. Os envios para o Readest Cloud ficam pausados enquanto este provedor estiver selecionado.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Enquanto o WebDAV estiver selecionado, os livros, o progresso e os destaques sincronizam apenas com o seu servidor.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "As configurações do aplicativo, as estatísticas de leitura e os dicionários continuam sincronizando pela sua conta Readest enquanto você estiver conectado.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Enquanto o Google Drive estiver selecionado, os livros, o progresso e os destaques sincronizam apenas com o seu Drive.",
@@ -1925,11 +1878,16 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronize sua biblioteca, progresso de leitura e destaques com o Readest Cloud.",
"Account and Storage": "Conta e armazenamento",
"Manage your plan and stored files": "Gerencie seu plano e arquivos armazenados",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Escolha para onde sua biblioteca — livros, progresso, destaques — sincroniza neste dispositivo. As configurações do aplicativo, as estatísticas de leitura e os dicionários sempre sincronizam com a sua conta Readest enquanto você estiver conectado.",
"Cloud sync provider": "Provedor de sincronização na nuvem",
"Use Readest Cloud": "Usar o Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Outro dispositivo ainda está sincronizando esta biblioteca via Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} envio falhou: cota de armazenamento insuficiente",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} envios falharam: cota de armazenamento insuficiente",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} envios falharam: cota de armazenamento insuficiente"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} envios falharam: cota de armazenamento insuficiente",
"Library sync via {{provider}}": "Sincronização da biblioteca via {{provider}}",
"Google Drive session expired": "A sessão do Google Drive expirou",
"Cloud sync session expired": "A sessão de sincronização na nuvem expirou",
"Uploads book files to your other devices": "Envia arquivos de livros para seus outros dispositivos",
"Re-check every book instead of only changed ones": "Verificar novamente todos os livros em vez de apenas os alterados",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Conectado como {{userDisplayName}}",
"Match Case": "Diferenciar Maiúsculas e Minúsculas",
"Match Diacritics": "Corresponder Acentos",
"Match Whole Words": "Corresponder Palavras Inteiras",
"Maximum Number of Columns": "Número Máximo de Colunas",
"Minimum Font Size": "Tamanho Mínimo da Fonte",
"Monospace Font": "Fonte Monoespaçada",
@@ -587,8 +586,6 @@
"Advanced Settings": "Configurações Avançadas",
"File count: {{size}}": "Contagem de arquivos: {{size}}",
"Background Read Aloud": "Leitura em Segundo Plano",
"Ready to read aloud": "Pronto para leitura em voz alta",
"Read Aloud": "Ler em Voz Alta",
"Screen Brightness": "Brilho da Tela",
"Background Image": "Imagem de Fundo",
"Import Image": "Importar Imagem",
@@ -1560,14 +1557,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Autenticação WebDAV falhou. Ligue novamente em Definições.",
"Downloading": "A descarregar",
"Uploading": "A enviar",
"downloaded {{n}} book(s)": "{{n}} livro(s) descarregado(s)",
"pushed {{n}} config(s)": "{{n}} configuração(ões) enviada(s)",
"uploaded {{n}} new file(s)": "{{n}} novo(s) ficheiro(s) enviado(s)",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronização concluída com {{failed}} falha(s). {{ok}} ok.",
"Sync complete": "Sincronização concluída",
"Everything is already up to date.": "Está tudo atualizado.",
"Browsing {{path}} on {{server}}": "A navegar em {{path}} em {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Ligue-se a um servidor WebDAV para navegar nos seus ficheiros remotos.",
"WebDAV": "WebDAV",
"Upload Book Files": "Enviar ficheiros de livros",
"Sync now": "Sincronizar agora",
@@ -1575,33 +1565,8 @@
"Show password": "Mostrar palavra-passe",
"Root Directory": "Diretório raiz",
"Syncing…": "A sincronizar…",
"pulled progress for {{n}} book(s)": "progresso de {{n}} livro(s) obtido",
"Sync History": "Histórico de sincronização",
"Clear Sync History": "Limpar histórico de sincronização",
"No manual syncs yet": "Sem sincronizações manuais",
"Partial": "Parcial",
"Cleanup": "Limpeza",
"Cleanup failed": "Limpeza falhou",
"Sync failed": "Sincronização falhou",
"{{n}} deleted": "{{n}} eliminados",
"{{n}} failed": "{{n}} com falha",
"Nothing deleted": "Nada eliminado",
"{{n}} downloaded": "{{n}} descarregados",
"{{n}} uploaded": "{{n}} enviados",
"{{n}} progress": "{{n}} progressos",
"Up to date": "Atualizado",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Livros descarregados",
"Files uploaded": "Ficheiros enviados",
"Configs uploaded": "Configurações enviadas",
"Configs downloaded": "Configurações descarregadas",
"Covers uploaded": "Capas enviadas",
"Books deleted": "Livros eliminados",
"Files in sync": "Ficheiros sincronizados",
"Failures": "Falhas",
"Total books": "Total de livros",
"Error:": "Erro:",
"Failed books": "Livros com falha",
"Deleted {{n}} book(s) from server.": "Eliminado(s) {{n}} livro(s) do servidor.",
"Failed to load directory": "Falha ao carregar diretório",
"File download is only supported on the desktop and mobile apps.": "O download de ficheiros só é suportado nas aplicações de desktop e móvel.",
@@ -1630,10 +1595,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instale a extensão de navegador Readest para enviar o artigo que está a ler para a sua biblioteca. Recorta a página a partir do seu navegador, para que sites pagos e que exigem início de sessão continuem a funcionar.",
"Added to your library. It will sync to your other devices.": "Adicionado à sua biblioteca. Será sincronizado com os seus outros dispositivos.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Frase-passe de sincronização esquecida. Todos os campos encriptados foram limpos.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Apenas sincronizações manuais e limpezas. As sincronizações automáticas durante a leitura não são registadas aqui.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Eliminar {{n}} livro(s) do servidor WebDAV?\n\nIsto apenas remove os ficheiros remotos; a sua biblioteca local não é afetada. A eliminação não pode ser anulada. Os bytes no servidor desaparecerão permanentemente.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Envia os ficheiros de livros para os seus outros dispositivos.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frase-passe de sincronização incorreta. Não foi possível desencriptar as credenciais sincronizadas.",
"Email books straight to your library": "Envie livros por e-mail diretamente para a sua biblioteca",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Encaminhe anexos e artigos para o seu endereço Readest privado. Disponível nos planos Plus, Pro e Lifetime.",
@@ -1825,9 +1788,6 @@
"Also erase reading progress, notes, and bookmarks.": "Também apaga o progresso de leitura, notas e marcadores.",
"Background Image (Library)": "Imagem de Fundo (Biblioteca)",
"Background Image (Reader)": "Imagem de Fundo (Vista de leitura)",
"updated metadata for {{n}} book(s)": "metadados atualizados de {{n}} livro(s)",
"{{n}} metadata": "{{n}} metadados",
"Metadata updated": "Metadados atualizados",
"Filter": "Filtrar",
"Sort by": "Ordenar por",
"Date modified": "Data de modificação",
@@ -1872,8 +1832,6 @@
"Decrease Contrast": "Diminuir Contraste",
"Reset Contrast": "Redefinir Contraste",
"Increase Contrast": "Aumentar Contraste",
"Google Drive session expired. Reconnect in Settings.": "A sessão do Google Drive expirou. Ligue novamente em Definições.",
"Cloud sync session expired. Reconnect in Settings.": "A sessão de sincronização na nuvem expirou. Ligue novamente em Definições.",
"Push": "Empurrar",
"Slide": "Deslizar",
"Page Curl": "Curvatura da Página",
@@ -1882,7 +1840,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Define o tamanho do texto dos resultados do dicionário, independente da vista de leitura.",
"Authentication failed. Reconnect in Settings.": "A autenticação falhou. Ligue novamente em Definições.",
"Full Sync": "Sincronização Completa",
"Re-check every book instead of only changed ones.": "Volta a verificar todos os livros, não apenas os alterados.",
"Waiting for sign-in…": "A aguardar o início de sessão…",
"Reconnect": "Ligar novamente",
"Connected as {{account}}": "Ligado como {{account}}",
@@ -1907,17 +1864,13 @@
"Reading aloud continues in the background": "A leitura em voz alta continua em segundo plano",
"Stopped reading aloud": "Leitura em voz alta interrompida",
"Read aloud stopped": "Leitura em voz alta interrompida",
"Synced via {{provider}} {{time}}": "Sincronizado via {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Os livros sincronizam via {{provider}} - o armazenamento do Readest Cloud não é usado",
"Cloud provider switched": "Fornecedor de nuvem alterado",
"Synced via {{provider}}": "Sincronizado via {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Os envios para o Readest Cloud estão em pausa enquanto a sincronização {{provider}} estiver selecionada",
"Managed by {{provider}} while it is your cloud sync provider": "Gerido por {{provider}} enquanto for o seu fornecedor de sincronização na nuvem",
"Not signed in": "Sessão não iniciada",
"Active — syncing your library on this device": "Ativo — a sincronizar a sua biblioteca neste dispositivo",
"Paused — plan required": "Em pausa — é necessário um plano",
"Active · Book file uploads off": "Ativo · Envio de ficheiros de livros desligado",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Envia os ficheiros de livros para os seus outros dispositivos. Os envios para o Readest Cloud ficam em pausa enquanto este fornecedor estiver selecionado.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Enquanto o WebDAV estiver selecionado, os livros, o progresso e os destaques sincronizam apenas com o seu servidor.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "As definições da aplicação, as estatísticas de leitura e os dicionários continuam a sincronizar através da sua conta Readest enquanto tiver sessão iniciada.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Enquanto o Google Drive estiver selecionado, os livros, o progresso e os destaques sincronizam apenas com o seu Drive.",
@@ -1925,11 +1878,16 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronize a sua biblioteca, o progresso de leitura e os destaques com o Readest Cloud.",
"Account and Storage": "Conta e armazenamento",
"Manage your plan and stored files": "Faça a gestão do seu plano e dos ficheiros armazenados",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Escolha para onde a sua biblioteca — livros, progresso, destaques — sincroniza neste dispositivo. As definições da aplicação, as estatísticas de leitura e os dicionários sincronizam sempre com a sua conta Readest enquanto tiver sessão iniciada.",
"Cloud sync provider": "Fornecedor de sincronização na nuvem",
"Use Readest Cloud": "Usar o Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Outro dispositivo ainda está a sincronizar esta biblioteca via Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} envio falhou: cota de armazenamento insuficiente",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} envios falharam: cota de armazenamento insuficiente",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} envios falharam: cota de armazenamento insuficiente"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} envios falharam: cota de armazenamento insuficiente",
"Library sync via {{provider}}": "Sincronização da biblioteca via {{provider}}",
"Google Drive session expired": "A sessão do Google Drive expirou",
"Cloud sync session expired": "A sessão de sincronização na nuvem expirou",
"Uploads book files to your other devices": "Carrega ficheiros de livros para os seus outros dispositivos",
"Re-check every book instead of only changed ones": "Verificar novamente todos os livros em vez de apenas os alterados",
"KOReader": "KOReader"
}
@@ -598,7 +598,6 @@
"Clear search history": "Șterge istoricul căutărilor",
"Chapter": "Capitol",
"Match Case": "Sensibil la majuscule/minuscule",
"Match Whole Words": "Doar cuvinte întregi",
"Match Diacritics": "Potrivește diacriticele",
"Search results for '{{term}}'": "Rezultatele căutării pentru „{{term}}”",
"Previous Result": "Rezultatul anterior",
@@ -660,8 +659,6 @@
"Translating...": "Se traduce...",
"Please log in to use advanced TTS features": "Vă rugăm să vă conectați pentru a utiliza funcțiile TTS avansate",
"TTS not supported for this document": "TTS nu este acceptat pentru acest document",
"Read Aloud": "Citiți cu voce tare",
"Ready to read aloud": "Gata pentru citire cu voce tare",
"Delete Your Account?": "Ștergeți contul dvs.?",
"This action cannot be undone. All your data in the cloud will be permanently deleted.": "Această acțiune nu poate fi anulată. Toate datele dvs. din cloud vor fi șterse permanent.",
"Delete Permanently": "Șterge definitiv",
@@ -1560,14 +1557,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Autentificarea WebDAV a eșuat. Reconectează-te în Setări.",
"Downloading": "Se descarcă",
"Uploading": "Se încarcă",
"downloaded {{n}} book(s)": "s-au descărcat {{n}} carte/cărți",
"pushed {{n}} config(s)": "s-au trimis {{n}} configurări",
"uploaded {{n}} new file(s)": "s-au încărcat {{n}} fișier(e) nou(noi)",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronizare finalizată cu {{failed}} eșec(uri). {{ok}} ok.",
"Sync complete": "Sincronizare completă",
"Everything is already up to date.": "Totul este deja la zi.",
"Browsing {{path}} on {{server}}": "Răsfoiește {{path}} pe {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Conectează-te la un server WebDAV pentru a-ți răsfoi fișierele de la distanță.",
"WebDAV": "WebDAV",
"Upload Book Files": "Încarcă fișierele de carte",
"Sync now": "Sincronizează acum",
@@ -1575,33 +1565,8 @@
"Show password": "Arată parola",
"Root Directory": "Director rădăcină",
"Syncing…": "Se sincronizează…",
"pulled progress for {{n}} book(s)": "s-a preluat progresul pentru {{n}} carte/cărți",
"Sync History": "Istoric sincronizare",
"Clear Sync History": "Șterge istoricul de sincronizare",
"No manual syncs yet": "Nicio sincronizare manuală încă",
"Partial": "Parțial",
"Cleanup": "Curățare",
"Cleanup failed": "Curățarea a eșuat",
"Sync failed": "Sincronizarea a eșuat",
"{{n}} deleted": "{{n}} șterse",
"{{n}} failed": "{{n}} eșuate",
"Nothing deleted": "Nimic șters",
"{{n}} downloaded": "{{n}} descărcate",
"{{n}} uploaded": "{{n}} încărcate",
"{{n}} progress": "{{n}} progres",
"Up to date": "La zi",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Cărți descărcate",
"Files uploaded": "Fișiere încărcate",
"Configs uploaded": "Configurări încărcate",
"Configs downloaded": "Configurări descărcate",
"Covers uploaded": "Coperți încărcate",
"Books deleted": "Cărți șterse",
"Files in sync": "Fișiere sincronizate",
"Failures": "Eșecuri",
"Total books": "Total cărți",
"Error:": "Eroare:",
"Failed books": "Cărți eșuate",
"Deleted {{n}} book(s) from server.": "S-au șters {{n}} carte/cărți de pe server.",
"Failed to load directory": "Eroare la încărcarea directorului",
"File download is only supported on the desktop and mobile apps.": "Descărcarea fișierelor este acceptată doar în aplicațiile desktop și mobile.",
@@ -1630,10 +1595,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instalează extensia de browser Readest pentru a trimite articolul pe care îl citești în biblioteca ta. Extensia decupează pagina din browser, astfel încât și site-urile cu plată sau care necesită conectare să funcționeze.",
"Added to your library. It will sync to your other devices.": "Adăugat în biblioteca ta. Se va sincroniza cu celelalte dispozitive.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Parola de sincronizare uitată. Toate câmpurile criptate au fost șterse.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Doar sincronizări manuale și curățări. Sincronizările automate în timpul citirii nu sunt înregistrate aici.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Ștergi {{n}} carte/cărți de pe serverul WebDAV?\n\nAceasta elimină doar fișierele de la distanță; biblioteca locală nu este afectată. Ștergerea nu poate fi anulată. Datele de pe server vor dispărea definitiv.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Încarcă fișierele de carte pe celelalte dispozitive ale tale.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Parolă de sincronizare incorectă. Acreditările sincronizate nu au putut fi decriptate.",
"Email books straight to your library": "Trimite cărți prin e-mail direct în biblioteca ta",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Redirecționează atașamente și articole către adresa ta Readest privată. Disponibil în planurile Plus, Pro și Lifetime.",
@@ -1825,9 +1788,6 @@
"Also erase reading progress, notes, and bookmarks.": "Șterge de asemenea progresul citirii, notele și marcajele.",
"Background Image (Library)": "Imagine de fundal (Bibliotecă)",
"Background Image (Reader)": "Imagine de fundal (Vizualizare de lectură)",
"updated metadata for {{n}} book(s)": "metadate actualizate pentru {{n}} carte/cărți",
"{{n}} metadata": "{{n}} metadate",
"Metadata updated": "Metadate actualizate",
"Filter": "Filtrează",
"Sort by": "Sortează după",
"Date modified": "Data modificării",
@@ -1872,8 +1832,6 @@
"Decrease Contrast": "Micșorează contrastul",
"Reset Contrast": "Resetează contrastul",
"Increase Contrast": "Mărește contrastul",
"Google Drive session expired. Reconnect in Settings.": "Sesiunea Google Drive a expirat. Reconectează-te în Setări.",
"Cloud sync session expired. Reconnect in Settings.": "Sesiunea de sincronizare în cloud a expirat. Reconectează-te în Setări.",
"Push": "Împingere",
"Slide": "Glisare",
"Page Curl": "Răsfoire de pagină",
@@ -1882,7 +1840,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Setează dimensiunea textului rezultatelor din dicționar, independent de vizualizarea de lectură.",
"Authentication failed. Reconnect in Settings.": "Autentificarea a eșuat. Reconectează-te în Setări.",
"Full Sync": "Sincronizare integrală",
"Re-check every book instead of only changed ones.": "Verifică din nou toate cărțile, nu doar pe cele modificate.",
"Waiting for sign-in…": "Se așteaptă conectarea…",
"Reconnect": "Reconectare",
"Connected as {{account}}": "Conectat ca {{account}}",
@@ -1907,17 +1864,13 @@
"Reading aloud continues in the background": "Citirea cu voce tare continuă în fundal",
"Stopped reading aloud": "Citirea cu voce tare a fost oprită",
"Read aloud stopped": "Citirea cu voce tare a fost oprită",
"Synced via {{provider}} {{time}}": "Sincronizat prin {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Cărțile se sincronizează prin {{provider}} - stocarea Readest Cloud nu este folosită",
"Cloud provider switched": "Furnizorul de cloud a fost schimbat",
"Synced via {{provider}}": "Sincronizat prin {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Încărcările în Readest Cloud sunt suspendate cât timp este selectată sincronizarea {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "Gestionat de {{provider}} cât timp este furnizorul tău de sincronizare cloud",
"Not signed in": "Neautentificat",
"Active — syncing your library on this device": "Activ — îți sincronizează biblioteca pe acest dispozitiv",
"Paused — plan required": "Suspendat — este necesar un abonament",
"Active · Book file uploads off": "Activ · Încărcarea fișierelor de carte este oprită",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Încarcă fișierele de carte pe celelalte dispozitive ale tale. Încărcările în Readest Cloud sunt suspendate cât timp acest furnizor este selectat.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Cât timp WebDAV este selectat, cărțile, progresul și evidențierile se sincronizează doar cu serverul tău.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Setările aplicației, statisticile de citire și dicționarele continuă să se sincronizeze prin contul tău Readest cât timp ești autentificat.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Cât timp Google Drive este selectat, cărțile, progresul și evidențierile se sincronizează doar cu Drive-ul tău.",
@@ -1925,11 +1878,16 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronizează-ți biblioteca, progresul citirii și evidențierile cu Readest Cloud.",
"Account and Storage": "Cont și stocare",
"Manage your plan and stored files": "Gestionează-ți abonamentul și fișierele stocate",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Alege unde se sincronizează biblioteca ta — cărți, progres, evidențieri — pe acest dispozitiv. Setările aplicației, statisticile de citire și dicționarele se sincronizează întotdeauna cu contul tău Readest cât timp ești autentificat.",
"Cloud sync provider": "Furnizor de sincronizare cloud",
"Use Readest Cloud": "Folosește Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Un alt dispozitiv încă sincronizează această bibliotecă prin Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} încărcare eșuată: cotă de stocare insuficientă",
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} încărcări eșuate: cotă de stocare insuficientă",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} de încărcări eșuate: cotă de stocare insuficientă"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} de încărcări eșuate: cotă de stocare insuficientă",
"Library sync via {{provider}}": "Sincronizarea bibliotecii prin {{provider}}",
"Google Drive session expired": "Sesiunea Google Drive a expirat",
"Cloud sync session expired": "Sesiunea de sincronizare în cloud a expirat",
"Uploads book files to your other devices": "Încarcă fișierele cărților pe celelalte dispozitive ale tale",
"Re-check every book instead of only changed ones": "Reverifică fiecare carte în loc de doar cele modificate",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Вход выполнен как {{userDisplayName}}",
"Match Case": "Учитывать регистр",
"Match Diacritics": "Учитывать диакритические знаки",
"Match Whole Words": "Только целые слова",
"Maximum Number of Columns": "Максимальное количество колонок",
"Minimum Font Size": "Минимальный размер шрифта",
"Monospace Font": "Моноширинный шрифт",
@@ -591,8 +590,6 @@
"Advanced Settings": "Расширенные настройки",
"File count: {{size}}": "Количество файлов: {{size}}",
"Background Read Aloud": "Озвучивание в фоне",
"Ready to read aloud": "Готов к чтению вслух",
"Read Aloud": "Читать вслух",
"Screen Brightness": "Яркость экрана",
"Background Image": "Фоновое изображение",
"Import Image": "Импортировать изображение",
@@ -1589,14 +1586,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Аутентификация WebDAV не удалась. Подключитесь заново в настройках.",
"Downloading": "Загрузка",
"Uploading": "Отправка",
"downloaded {{n}} book(s)": "загружено {{n}} книг",
"pushed {{n}} config(s)": "отправлено {{n}} конфигураций",
"uploaded {{n}} new file(s)": "отправлено {{n}} новых файлов",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Синхронизация завершена с {{failed}} ошибками. {{ok}} ок.",
"Sync complete": "Синхронизация завершена",
"Everything is already up to date.": "Всё уже актуально.",
"Browsing {{path}} on {{server}}": "Просмотр {{path}} на {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Подключитесь к серверу WebDAV, чтобы просматривать удалённые файлы.",
"WebDAV": "WebDAV",
"Upload Book Files": "Отправить файлы книг",
"Sync now": "Синхронизировать сейчас",
@@ -1604,33 +1594,8 @@
"Show password": "Показать пароль",
"Root Directory": "Корневой каталог",
"Syncing…": "Синхронизация…",
"pulled progress for {{n}} book(s)": "получен прогресс для {{n}} книг",
"Sync History": "История синхронизации",
"Clear Sync History": "Очистить историю синхронизации",
"No manual syncs yet": "Ручных синхронизаций пока нет",
"Partial": "Частично",
"Cleanup": "Очистка",
"Cleanup failed": "Очистка не удалась",
"Sync failed": "Синхронизация не удалась",
"{{n}} deleted": "{{n}} удалено",
"{{n}} failed": "{{n}} с ошибкой",
"Nothing deleted": "Ничего не удалено",
"{{n}} downloaded": "{{n}} загружено",
"{{n}} uploaded": "{{n}} отправлено",
"{{n}} progress": "{{n}} прогресса",
"Up to date": "Актуально",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Загруженные книги",
"Files uploaded": "Отправленные файлы",
"Configs uploaded": "Отправленные конфигурации",
"Configs downloaded": "Загруженные конфигурации",
"Covers uploaded": "Отправленные обложки",
"Books deleted": "Удалённые книги",
"Files in sync": "Синхронизированные файлы",
"Failures": "Ошибки",
"Total books": "Всего книг",
"Error:": "Ошибка:",
"Failed books": "Книги с ошибкой",
"Deleted {{n}} book(s) from server.": "Удалено {{n}} книг с сервера.",
"Failed to load directory": "Не удалось загрузить папку",
"File download is only supported on the desktop and mobile apps.": "Загрузка файлов поддерживается только в настольных и мобильных приложениях.",
@@ -1660,10 +1625,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Установите браузерное расширение Readest, чтобы отправлять читаемые статьи в библиотеку. Расширение вырезает страницу из браузера, поэтому работают даже сайты по подписке и сайты, требующие входа.",
"Added to your library. It will sync to your other devices.": "Добавлено в вашу библиотеку. Синхронизируется с другими устройствами.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Парольная фраза синхронизации забыта. Все зашифрованные поля очищены.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Только ручные синхронизации и очистки. Автоматические синхронизации во время чтения здесь не отображаются.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Удалить {{n}} книг с сервера WebDAV?\n\nЭто удалит только удалённые файлы; ваша локальная библиотека не пострадает. Удаление невозможно отменить. Данные на сервере исчезнут навсегда.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Загружает файлы книг на ваши другие устройства.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Неверная парольная фраза синхронизации. Не удалось расшифровать синхронизированные данные.",
"Email books straight to your library": "Отправляйте книги по электронной почте прямо в библиотеку",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Пересылайте вложения и статьи на ваш личный адрес Readest. Доступно в тарифах Plus, Pro и Lifetime.",
@@ -1858,9 +1821,6 @@
"Also erase reading progress, notes, and bookmarks.": "Также удаляет прогресс чтения, заметки и закладки.",
"Background Image (Library)": "Фоновое изображение (Библиотека)",
"Background Image (Reader)": "Фоновое изображение (Режим чтения)",
"updated metadata for {{n}} book(s)": "обновлены метаданные для {{n}} книг",
"{{n}} metadata": "{{n}} метаданные",
"Metadata updated": "Метаданные обновлены",
"Filter": "Фильтр",
"Sort by": "Сортировать по",
"Date modified": "Дата изменения",
@@ -1906,8 +1866,6 @@
"Decrease Contrast": "Уменьшить контраст",
"Reset Contrast": "Сбросить контраст",
"Increase Contrast": "Увеличить контраст",
"Google Drive session expired. Reconnect in Settings.": "Сессия Google Drive истекла. Переподключитесь в настройках.",
"Cloud sync session expired. Reconnect in Settings.": "Сессия облачной синхронизации истекла. Переподключитесь в настройках.",
"Push": "Сдвиг",
"Slide": "Скольжение",
"Page Curl": "Загиб страницы",
@@ -1916,7 +1874,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Задаёт размер текста результатов словаря независимо от области чтения.",
"Authentication failed. Reconnect in Settings.": "Ошибка аутентификации. Переподключитесь в настройках.",
"Full Sync": "Полная синхронизация",
"Re-check every book instead of only changed ones.": "Проверять все книги, а не только изменённые.",
"Waiting for sign-in…": "Ожидание входа…",
"Reconnect": "Переподключиться",
"Connected as {{account}}": "Подключено как {{account}}",
@@ -1941,17 +1898,13 @@
"Reading aloud continues in the background": "Чтение вслух продолжается в фоновом режиме",
"Stopped reading aloud": "Чтение вслух остановлено",
"Read aloud stopped": "Озвучивание остановлено",
"Synced via {{provider}} {{time}}": "Синхронизировано через {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Книги синхронизируются через {{provider}} - хранилище Readest Cloud не используется",
"Cloud provider switched": "Облачный провайдер изменён",
"Synced via {{provider}}": "Синхронизировано через {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Загрузки в Readest Cloud приостановлены, пока выбрана синхронизация {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "Управляется {{provider}}, пока это ваш провайдер облачной синхронизации",
"Not signed in": "Вход не выполнен",
"Active — syncing your library on this device": "Активно — синхронизирует вашу библиотеку на этом устройстве",
"Paused — plan required": "Приостановлено — требуется тарифный план",
"Active · Book file uploads off": "Активно · Загрузка файлов книг выключена",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Загружает файлы книг на ваши другие устройства. Загрузки в Readest Cloud приостанавливаются, пока выбран этот провайдер.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Пока выбран WebDAV, книги, прогресс и выделения синхронизируются только с вашим сервером.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Настройки приложения, статистика чтения и словари продолжают синхронизироваться через ваш аккаунт Readest, пока вы вошли в систему.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Пока выбран Google Drive, книги, прогресс и выделения синхронизируются только с вашим Drive.",
@@ -1959,12 +1912,17 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Синхронизируйте свою библиотеку, прогресс чтения и выделения с Readest Cloud.",
"Account and Storage": "Аккаунт и хранилище",
"Manage your plan and stored files": "Управляйте тарифом и сохранёнными файлами",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Выберите, куда синхронизируется ваша библиотека — книги, прогресс, выделения — на этом устройстве. Настройки приложения, статистика чтения и словари всегда синхронизируются с вашим аккаунтом Readest, пока вы вошли в систему.",
"Cloud sync provider": "Провайдер облачной синхронизации",
"Use Readest Cloud": "Использовать Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Другое устройство всё ещё синхронизирует эту библиотеку через Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} загрузка не удалась: недостаточно квоты хранилища",
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} загрузки не удались: недостаточно квоты хранилища",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} загрузок не удалось: недостаточно квоты хранилища",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} загрузки не удалось: недостаточно квоты хранилища"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} загрузки не удалось: недостаточно квоты хранилища",
"Library sync via {{provider}}": "Синхронизация библиотеки через {{provider}}",
"Google Drive session expired": "Сеанс Google Drive истёк",
"Cloud sync session expired": "Сеанс облачной синхронизации истёк",
"Uploads book files to your other devices": "Загружает файлы книг на другие ваши устройства",
"Re-check every book instead of only changed ones": "Повторно проверять каждую книгу, а не только изменённые",
"KOReader": "KOReader"
}
@@ -308,7 +308,6 @@
"Book": "පොත",
"Chapter": "පරිච්ඡේදය",
"Match Case": "අකුරු ගැළපීම",
"Match Whole Words": "සම්පූර්ණ වචන ගැළපීම",
"Match Diacritics": "ධ්වනි ලකුණු ගැළපීම",
"TOC": "සූචිය",
"Table of Contents": "සූචිය",
@@ -583,8 +582,6 @@
"Advanced Settings": "උසස් සැකසුම්",
"File count: {{size}}": "ගොනු ගණන: {{size}}",
"Background Read Aloud": "පසුබිම් පවසා කියවීම",
"Ready to read aloud": "වාදනය කිරීමට සූදානම්",
"Read Aloud": "පවසා කියවීම",
"Screen Brightness": "තිරයේ දිදුලනුම",
"Background Image": "පසුබිම් රූපය",
"Import Image": "රූපය ආයාත කරන්න",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV සත්‍යාපනය අසාර්ථකයි. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.",
"Downloading": "බාගත වෙමින්",
"Uploading": "උඩුගත වෙමින්",
"downloaded {{n}} book(s)": "පොත් {{n}} බාගත කළා",
"pushed {{n}} config(s)": "වින්‍යාසයන් {{n}}ක් යවන ලදී",
"uploaded {{n}} new file(s)": "නව ගොනු {{n}}ක් උඩුගත කළා",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "සමමුහුර්තකරණය අසාර්ථකතා {{failed}}ක් සමඟ අවසන් විය. {{ok}} සාර්ථකයි.",
"Sync complete": "සමමුහුර්තකරණය සම්පූර්ණයි",
"Everything is already up to date.": "සියල්ල දැනටමත් යාවත්කාලීනයි.",
"Browsing {{path}} on {{server}}": "{{server}} මත {{path}} බ්‍රවුස් කරමින්",
"Connect to a WebDAV server to browse your remote files.": "ඔබේ දුරස්ථ ගොනු බ්‍රවුස් කිරීමට WebDAV සේවාදායකයකට සම්බන්ධ වන්න.",
"WebDAV": "WebDAV",
"Upload Book Files": "පොත් ගොනු උඩුගත කරන්න",
"Sync now": "දැන් සමමුහුර්ත කරන්න",
@@ -1546,33 +1536,8 @@
"Show password": "මුරපදය පෙන්වන්න",
"Root Directory": "මූල නාමාවලිය",
"Syncing…": "සමමුහුර්ත කරමින්…",
"pulled progress for {{n}} book(s)": "පොත් {{n}}ක ප්‍රගතිය ලබා ගත්තා",
"Sync History": "සමමුහුර්ත ඉතිහාසය",
"Clear Sync History": "සමමුහුර්ත ඉතිහාසය හිස් කරන්න",
"No manual syncs yet": "තවම අතින් සමමුහුර්තකරණ නැත",
"Partial": "අර්ධ",
"Cleanup": "පිරිසිදු කිරීම",
"Cleanup failed": "පිරිසිදු කිරීම අසාර්ථකයි",
"Sync failed": "සමමුහුර්තකරණය අසාර්ථකයි",
"{{n}} deleted": "{{n}} මකා දැමුවා",
"{{n}} failed": "{{n}} අසාර්ථකයි",
"Nothing deleted": "කිසිවක් මකා නැත",
"{{n}} downloaded": "{{n}} බාගත කළා",
"{{n}} uploaded": "{{n}} උඩුගත කළා",
"{{n}} progress": "{{n}} ප්‍රගතිය",
"Up to date": "යාවත්කාලීනයි",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "බාගත කළ පොත්",
"Files uploaded": "උඩුගත කළ ගොනු",
"Configs uploaded": "උඩුගත කළ වින්‍යාසයන්",
"Configs downloaded": "බාගත කළ වින්‍යාසයන්",
"Covers uploaded": "උඩුගත කළ කවර",
"Books deleted": "මකා දැමූ පොත්",
"Files in sync": "සමමුහුර්ත ගොනු",
"Failures": "අසාර්ථකතා",
"Total books": "සම්පූර්ණ පොත්",
"Error:": "දෝෂය:",
"Failed books": "අසාර්ථක පොත්",
"Deleted {{n}} book(s) from server.": "සේවාදායකයෙන් පොත් {{n}} මකන ලදී.",
"Failed to load directory": "නාමාවලිය පූරණය කිරීමට අසමත් විය",
"File download is only supported on the desktop and mobile apps.": "ගොනු බාගත කිරීම සඳහා සහාය වන්නේ ඩෙස්ක්ටොප් සහ ජංගම යෙදුම්වල පමණි.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ඔබ කියවන ලිපිය ඔබේ පුස්තකාලයට යැවීමට Readest බ්‍රවුසර දිගුව ස්ථාපනය කරන්න. එය ඔබේ බ්‍රවුසරයේ සිට පිටුව කපා ගන්නා නිසා ගෙවීම් සහ පිවිසුම් අවශ්‍ය වෙබ් අඩවි ද ක්‍රියා කරයි.",
"Added to your library. It will sync to your other devices.": "ඔබේ පුස්තකාලයට එක් කරන ලදී. එය ඔබේ අනෙකුත් උපාංගවලට සමමුහුර්ත වේ.",
"Sync passphrase forgotten. All encrypted fields cleared.": "සමමුහුර්ත මුරපදය අමතක කරන ලදී. සියලුම සංකේතාංකන ක්ෂේත්‍ර හිස් කරන ලදී.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "අතින් සමමුහුර්තකරණ සහ පිරිසිදු කිරීම් පමණක්. කියවීමේදී ස්වයංක්‍රීය සමමුහුර්තකරණ මෙහි සටහන් නොවේ.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV සේවාදායකයෙන් පොත් {{n}}ක් මකන්න ද?\n\nමෙය දුරස්ථ ගොනු පමණක් ඉවත් කරයි; ඔබේ දේශීය පුස්තකාලය බලපාන්නේ නැත. මැකීම අහෝසි කළ නොහැක. සේවාදායකයේ දත්ත සදහටම නැති වේ.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "පොත් ගොනු ඔබගේ අනෙක් උපාංගවලට උඩුගත කරයි.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "වැරදි සමමුහුර්ත මුරපදය. සමමුහුර්ත අක්තපත්‍ර විකේතනය කළ නොහැකි විය.",
"Email books straight to your library": "ඊමේල් මගින් ඔබේ පුස්තකාලයට කෙලින්ම පොත් යවන්න",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "ඇමුණුම් සහ ලිපි ඔබේ පෞද්ගලික Readest ලිපිනය වෙත ඉදිරියට යවන්න. Plus, Pro සහ Lifetime සැලසුම් වල ලබා ගත හැක.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "කියවීමේ ප්‍රගතිය, සටහන් සහ පොත් සලකුණු ද මකා දමයි.",
"Background Image (Library)": "පසුබිම් රූපය (පුස්තකාලය)",
"Background Image (Reader)": "පසුබිම් රූපය (කියවීමේ දසුන)",
"updated metadata for {{n}} book(s)": "පොත් {{n}}ක මෙටාඩේටා යාවත්කාලීන කරන ලදී",
"{{n}} metadata": "{{n}} මෙටාඩේටා",
"Metadata updated": "මෙටාඩේටා යාවත්කාලීන කරන ලදී",
"Filter": "පෙරහන",
"Sort by": "අනුව සකසන්න",
"Date modified": "වෙනස් කළ දිනය",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "පරස්පරය අඩු කරන්න",
"Reset Contrast": "පරස්පරය යළි සකසන්න",
"Increase Contrast": "පරස්පරය වැඩි කරන්න",
"Google Drive session expired. Reconnect in Settings.": "Google Drive සැසිය කල් ඉකුත් වී ඇත. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.",
"Cloud sync session expired. Reconnect in Settings.": "Cloud සමමුහුර්ත සැසිය කල් ඉකුත් වී ඇත. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.",
"Push": "තල්ලුව",
"Slide": "ලිස්සීම",
"Page Curl": "පිටු නැමීම",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "කියවීමේ දසුනෙන් ස්වාධීනව ශබ්දකෝෂ ප්‍රතිඵලවල අකුරු ප්‍රමාණය සකසයි.",
"Authentication failed. Reconnect in Settings.": "සත්‍යාපනය අසාර්ථක විය. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.",
"Full Sync": "සම්පූර්ණ සමමුහුර්තය",
"Re-check every book instead of only changed ones.": "වෙනස් වූ පොත් පමණක් නොව සෑම පොතක්ම නැවත පරීක්ෂා කරන්න.",
"Waiting for sign-in…": "ඇතුල් වීම සඳහා රැඳී සිටිමින්…",
"Reconnect": "නැවත සම්බන්ධ වන්න",
"Connected as {{account}}": "{{account}} ලෙස සම්බන්ධ වී ඇත",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "පවසා කියවීම පසුබිමේ දිගටම සිදු වේ",
"Stopped reading aloud": "පවසා කියවීම නවත්වන ලදී",
"Read aloud stopped": "පවසා කියවීම නතර විය",
"Synced via {{provider}} {{time}}": "{{provider}} හරහා {{time}} සමමුහුර්ත විය",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "පොත් {{provider}} හරහා සමමුහුර්ත වේ - Readest Cloud ගබඩාව භාවිතා නොවේ",
"Cloud provider switched": "වලාකුළු සැපයුම්කරු වෙනස් විය",
"Synced via {{provider}}": "{{provider}} හරහා සමමුහුර්ත විය",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} සමමුහුර්තකරණය තෝරා ඇති අතරතුර Readest Cloud වෙත උඩුගත කිරීම් නවතා ඇත",
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} ඔබේ වලාකුළු සමමුහුර්ත සැපයුම්කරු ලෙස පවතින අතරතුර එය මගින් කළමනාකරණය වේ",
"Not signed in": "පුරනය වී නැත",
"Active — syncing your library on this device": "සක්‍රීය — මෙම උපාංගයේ ඔබේ පුස්තකාලය සමමුහුර්ත වෙමින්",
"Paused — plan required": "නවතා ඇත — සැලසුමක් අවශ්‍යයි",
"Active · Book file uploads off": "සක්‍රීය · පොත් ගොනු උඩුගත කිරීම අක්‍රීයයි",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "පොත් ගොනු ඔබගේ අනෙක් උපාංගවලට උඩුගත කරයි. මෙම සැපයුම්කරු තෝරා ඇති අතරතුර Readest Cloud වෙත උඩුගත කිරීම් නවතී.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV තෝරා ඇති අතරතුර, පොත්, ප්‍රගතිය සහ ඉස්මතු කිරීම් ඔබේ සේවාදායකය සමඟ පමණක් සමමුහුර්ත වේ.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "පුරනය වී සිටින අතරතුර යෙදුම් සැකසුම්, කියවීම් සංඛ්‍යාලේඛන සහ ශබ්දකෝෂ ඔබේ Readest ගිණුම හරහා දිගටම සමමුහුර්ත වේ.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive තෝරා ඇති අතරතුර, පොත්, ප්‍රගතිය සහ ඉස්මතු කිරීම් ඔබේ Drive සමඟ පමණක් සමමුහුර්ත වේ.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "ඔබේ පුස්තකාලය, කියවීමේ ප්‍රගතිය සහ ඉස්මතු කිරීම් Readest Cloud සමඟ සමමුහුර්ත කරන්න.",
"Account and Storage": "ගිණුම සහ ගබඩාව",
"Manage your plan and stored files": "ඔබේ සැලසුම සහ ගබඩා කළ ගොනු කළමනාකරණය කරන්න",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "මෙම උපාංගයේ ඔබේ පුස්තකාලය — පොත්, ප්‍රගතිය, ඉස්මතු කිරීම් — සමමුහුර්ත වන ස්ථානය තෝරන්න. පුරනය වී සිටින අතරතුර යෙදුම් සැකසුම්, කියවීම් සංඛ්‍යාලේඛන සහ ශබ්දකෝෂ සැමවිටම ඔබේ Readest ගිණුම සමඟ සමමුහුර්ත වේ.",
"Cloud sync provider": "වලාකුළු සමමුහුර්ත සැපයුම්කරු",
"Use Readest Cloud": "Readest Cloud භාවිතා කරන්න",
"Another device is still syncing this library via Readest Cloud": "තවත් උපාංගයක් තවමත් Readest Cloud හරහා මෙම පුස්තකාලය සමමුහුර්ත කරයි",
"{{count}} uploads failed: insufficient storage quota_one": "උඩුගත කිරීම් {{count}}ක් අසාර්ථකයි: ප්‍රමාණවත් නොවන ගබඩා ප්‍රමාණය",
"{{count}} uploads failed: insufficient storage quota_other": "උඩුගත කිරීම් {{count}}ක් අසාර්ථකයි: ප්‍රමාණවත් නොවන ගබඩා ප්‍රමාණය"
"{{count}} uploads failed: insufficient storage quota_other": "උඩුගත කිරීම් {{count}}ක් අසාර්ථකයි: ප්‍රමාණවත් නොවන ගබඩා ප්‍රමාණය",
"Library sync via {{provider}}": "{{provider}} හරහා පුස්තකාල සමමුහූර්තකරණය",
"Google Drive session expired": "Google Drive සැසිය කල් ඉකුත් වී ඇත",
"Cloud sync session expired": "වලාකුළු සමමුහූර්ත සැසිය කල් ඉකුත් වී ඇත",
"Uploads book files to your other devices": "පොත් ගොනු ඔබගේ අනෙක් උපාංගවලට උඩුගත කරයි",
"Re-check every book instead of only changed ones": "වෙනස් වූ ඒවා පමණක් නොව සෑම පොතක්ම නැවත පරීක්ෂා කරන්න",
"KOReader": "KOReader"
}
@@ -571,7 +571,6 @@
"Clear search history": "Počisti zgodovino iskanja",
"Chapter": "Poglavje",
"Match Case": "Razlikuj velike/male črke",
"Match Whole Words": "Ujemanje celih besed",
"Match Diacritics": "Ujemanje diakritičnih znakov",
"Search results for '{{term}}'": "Rezultati iskanja za '{{term}}'",
"Previous Result": "Prejšnji rezultat",
@@ -634,8 +633,6 @@
"Translating...": "Prevajanje...",
"Please log in to use advanced TTS features": "Prosimo, prijavite se za uporabo naprednih TTS funkcij",
"TTS not supported for this document": "TTS ni podprt za ta dokument",
"Read Aloud": "Branje na glas",
"Ready to read aloud": "Pripravljeno na branje na glas",
"Delete Your Account?": "Izbrišem vaš račun?",
"This action cannot be undone. All your data in the cloud will be permanently deleted.": "Tega dejanja ni mogoče razveljaviti. Vsi vaši podatki v oblaku bodo trajno izbrisani.",
"Delete Permanently": "Trajno izbriši",
@@ -1589,14 +1586,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Overjanje WebDAV ni uspelo. Ponovno se povežite v Nastavitvah.",
"Downloading": "Prenašanje",
"Uploading": "Nalaganje",
"downloaded {{n}} book(s)": "preneseno {{n}} knjig",
"pushed {{n}} config(s)": "poslano {{n}} konfiguracij",
"uploaded {{n}} new file(s)": "naloženo {{n}} novih datotek",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sinhronizacija končana z {{failed}} napakami. {{ok}} ok.",
"Sync complete": "Sinhronizacija končana",
"Everything is already up to date.": "Vse je že posodobljeno.",
"Browsing {{path}} on {{server}}": "Brskanje po {{path}} na {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Povežite se s strežnikom WebDAV za brskanje po oddaljenih datotekah.",
"WebDAV": "WebDAV",
"Upload Book Files": "Naloži datoteke knjig",
"Sync now": "Sinhroniziraj zdaj",
@@ -1604,33 +1594,8 @@
"Show password": "Pokaži geslo",
"Root Directory": "Korenska mapa",
"Syncing…": "Sinhronizacija…",
"pulled progress for {{n}} book(s)": "preneseno napredek za {{n}} knjig",
"Sync History": "Zgodovina sinhronizacije",
"Clear Sync History": "Počisti zgodovino sinhronizacije",
"No manual syncs yet": "Še ni ročnih sinhronizacij",
"Partial": "Delno",
"Cleanup": "Čiščenje",
"Cleanup failed": "Čiščenje ni uspelo",
"Sync failed": "Sinhronizacija ni uspela",
"{{n}} deleted": "{{n}} izbrisano",
"{{n}} failed": "{{n}} neuspelo",
"Nothing deleted": "Nič ni bilo izbrisano",
"{{n}} downloaded": "{{n}} preneseno",
"{{n}} uploaded": "{{n}} naloženo",
"{{n}} progress": "{{n}} napredek",
"Up to date": "Posodobljeno",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Prenesene knjige",
"Files uploaded": "Naložene datoteke",
"Configs uploaded": "Naložene konfiguracije",
"Configs downloaded": "Prenesene konfiguracije",
"Covers uploaded": "Naložene naslovnice",
"Books deleted": "Izbrisane knjige",
"Files in sync": "Sinhronizirane datoteke",
"Failures": "Napake",
"Total books": "Skupaj knjig",
"Error:": "Napaka:",
"Failed books": "Neuspele knjige",
"Deleted {{n}} book(s) from server.": "Iz strežnika izbrisano {{n}} knjig.",
"Failed to load directory": "Mape ni bilo mogoče naložiti",
"File download is only supported on the desktop and mobile apps.": "Prenos datotek je podprt samo v namizni in mobilni aplikaciji.",
@@ -1660,10 +1625,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Namestite razširitev brskalnika Readest, da članek, ki ga berete, pošljete v knjižnico. Razširitev izreže stran iz brskalnika, zato delujejo tudi plačljive in samo za prijavljene strani.",
"Added to your library. It will sync to your other devices.": "Dodano v vašo knjižnico. Sinhronizirano bo z drugimi napravami.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Sinhronizacijska gesla pozabljena. Vsa šifrirana polja so počiščena.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Samo ročne sinhronizacije in čiščenja. Samodejne sinhronizacije med branjem se tu ne beležijo.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Izbrišem {{n}} knjig s strežnika WebDAV?\n\nTo odstrani samo oddaljene datoteke; vaša lokalna knjižnica ostane nedotaknjena. Izbrisa ni mogoče razveljaviti. Biti na strežniku bodo trajno izgubljeni.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Naloži datoteke knjig v vaše druge naprave.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Napačno geslo sinhronizacije. Sinhroniziranih poverilnic ni bilo mogoče dešifrirati.",
"Email books straight to your library": "Knjige po e-pošti pošljite naravnost v knjižnico",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Posredujte priponke in članke na svoj zasebni Readest naslov. Na voljo v paketih Plus, Pro in Lifetime.",
@@ -1858,9 +1821,6 @@
"Also erase reading progress, notes, and bookmarks.": "Izbriše tudi napredek branja, opombe in zaznamke.",
"Background Image (Library)": "Slikovno ozadje (Knjižnica)",
"Background Image (Reader)": "Slikovno ozadje (Bralni pogled)",
"updated metadata for {{n}} book(s)": "posodobljeni metapodatki za {{n}} knjig",
"{{n}} metadata": "{{n}} metapodatki",
"Metadata updated": "Metapodatki posodobljeni",
"Filter": "Filtriraj",
"Sort by": "Razvrsti po",
"Date modified": "Datum spremembe",
@@ -1906,8 +1866,6 @@
"Decrease Contrast": "Zmanjšaj kontrast",
"Reset Contrast": "Ponastavi kontrast",
"Increase Contrast": "Povečaj kontrast",
"Google Drive session expired. Reconnect in Settings.": "Seja Google Drive je potekla. Znova se povežite v Nastavitvah.",
"Cloud sync session expired. Reconnect in Settings.": "Seja sinhronizacije v oblaku je potekla. Znova se povežite v Nastavitvah.",
"Push": "Potisk",
"Slide": "Drsenje",
"Page Curl": "Zvijanje strani",
@@ -1916,7 +1874,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Nastavi velikost besedila rezultatov slovarja, neodvisno od pogleda branja.",
"Authentication failed. Reconnect in Settings.": "Preverjanje pristnosti ni uspelo. Znova se povežite v Nastavitvah.",
"Full Sync": "Polna sinhronizacija",
"Re-check every book instead of only changed ones.": "Znova preveri vse knjige, ne le spremenjenih.",
"Waiting for sign-in…": "Čakanje na prijavo…",
"Reconnect": "Znova poveži",
"Connected as {{account}}": "Povezano kot {{account}}",
@@ -1941,17 +1898,13 @@
"Reading aloud continues in the background": "Branje na glas se nadaljuje v ozadju",
"Stopped reading aloud": "Branje na glas ustavljeno",
"Read aloud stopped": "Branje na glas se je ustavilo",
"Synced via {{provider}} {{time}}": "Sinhronizirano prek {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Knjige se sinhronizirajo prek {{provider}} - shramba Readest Cloud se ne uporablja",
"Cloud provider switched": "Ponudnik oblaka zamenjan",
"Synced via {{provider}}": "Sinhronizirano prek {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Nalaganja v Readest Cloud so ustavljena, dokler je izbrana sinhronizacija {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "Upravlja {{provider}}, dokler je vaš ponudnik oblačne sinhronizacije",
"Not signed in": "Niste prijavljeni",
"Active — syncing your library on this device": "Aktivno — sinhronizira vašo knjižnico na tej napravi",
"Paused — plan required": "Ustavljeno — potreben je paket",
"Active · Book file uploads off": "Aktivno · Nalaganje datotek knjig je izklopljeno",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Naloži datoteke knjig v vaše druge naprave. Nalaganja v Readest Cloud so ustavljena, dokler je izbran ta ponudnik.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Dokler je izbran WebDAV, se knjige, napredek in označbe sinhronizirajo samo z vašim strežnikom.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Nastavitve aplikacije, statistika branja in slovarji se še naprej sinhronizirajo prek vašega računa Readest, dokler ste prijavljeni.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Dokler je izbran Google Drive, se knjige, napredek in označbe sinhronizirajo samo z vašim Drivom.",
@@ -1959,12 +1912,17 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sinhronizirajte knjižnico, napredek branja in označbe z Readest Cloud.",
"Account and Storage": "Račun in shramba",
"Manage your plan and stored files": "Upravljajte svoj paket in shranjene datoteke",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Izberite, kam se na tej napravi sinhronizira vaša knjižnica — knjige, napredek, označbe. Nastavitve aplikacije, statistika branja in slovarji se vedno sinhronizirajo z vašim računom Readest, dokler ste prijavljeni.",
"Cloud sync provider": "Ponudnik oblačne sinhronizacije",
"Use Readest Cloud": "Uporabi Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Druga naprava še vedno sinhronizira to knjižnico prek Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} nalaganje ni uspelo: nezadostna kvota v shrambi",
"{{count}} uploads failed: insufficient storage quota_two": "{{count}} nalaganji nista uspeli: nezadostna kvota v shrambi",
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} nalaganja niso uspela: nezadostna kvota v shrambi",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} nalaganj ni uspelo: nezadostna kvota v shrambi"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} nalaganj ni uspelo: nezadostna kvota v shrambi",
"Library sync via {{provider}}": "Sinhronizacija knjižnice prek {{provider}}",
"Google Drive session expired": "Seja Google Drive je potekla",
"Cloud sync session expired": "Seja sinhronizacije v oblaku je potekla",
"Uploads book files to your other devices": "Naloži datoteke knjig v vaše druge naprave",
"Re-check every book instead of only changed ones": "Znova preveri vsako knjigo namesto le spremenjenih",
"KOReader": "KOReader"
}
@@ -256,7 +256,6 @@
"Book": "Bok",
"Chapter": "Kapitel",
"Match Case": "Matchning av versaler",
"Match Whole Words": "Matchning av hela ord",
"Match Diacritics": "Matchning av diakritiska tecken",
"Sidebar": "Sidofält",
"Resize Sidebar": "Ändra storlek på sidofält",
@@ -273,8 +272,6 @@
"Play": "Spela",
"Next Sentence": "Nästa mening",
"Next Paragraph": "Nästa stycke",
"Read Aloud": "Läs upp",
"Ready to read aloud": "Redo att läsa upp",
"TTS not supported for this document": "Uppläsning stöds inte för detta dokument",
"No Timeout": "Ingen timeout",
"{{value}} minute": "{{value}} minut",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV-autentisering misslyckades. Återanslut i Inställningar.",
"Downloading": "Laddar ned",
"Uploading": "Laddar upp",
"downloaded {{n}} book(s)": "{{n}} bok/böcker nedladdade",
"pushed {{n}} config(s)": "{{n}} konfiguration(er) skickade",
"uploaded {{n}} new file(s)": "{{n}} ny(a) fil(er) uppladdade",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synkroniseringen slutfördes med {{failed}} fel. {{ok}} ok.",
"Sync complete": "Synkronisering klar",
"Everything is already up to date.": "Allt är redan uppdaterat.",
"Browsing {{path}} on {{server}}": "Bläddrar i {{path}} på {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Anslut till en WebDAV-server för att bläddra bland dina fjärrfiler.",
"WebDAV": "WebDAV",
"Upload Book Files": "Ladda upp bokfiler",
"Sync now": "Synkronisera nu",
@@ -1546,33 +1536,8 @@
"Show password": "Visa lösenord",
"Root Directory": "Rotmapp",
"Syncing…": "Synkroniserar…",
"pulled progress for {{n}} book(s)": "läsförlopp för {{n}} bok/böcker hämtat",
"Sync History": "Synkroniseringshistorik",
"Clear Sync History": "Rensa synkroniseringshistorik",
"No manual syncs yet": "Inga manuella synkroniseringar än",
"Partial": "Delvis",
"Cleanup": "Rensning",
"Cleanup failed": "Rensning misslyckades",
"Sync failed": "Synkroniseringen misslyckades",
"{{n}} deleted": "{{n}} borttagna",
"{{n}} failed": "{{n}} misslyckades",
"Nothing deleted": "Inget borttaget",
"{{n}} downloaded": "{{n}} nedladdade",
"{{n}} uploaded": "{{n}} uppladdade",
"{{n}} progress": "{{n}} läsförlopp",
"Up to date": "Uppdaterad",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Nedladdade böcker",
"Files uploaded": "Uppladdade filer",
"Configs uploaded": "Uppladdade konfigurationer",
"Configs downloaded": "Nedladdade konfigurationer",
"Covers uploaded": "Uppladdade omslag",
"Books deleted": "Borttagna böcker",
"Files in sync": "Synkroniserade filer",
"Failures": "Misslyckanden",
"Total books": "Totalt antal böcker",
"Error:": "Fel:",
"Failed books": "Misslyckade böcker",
"Deleted {{n}} book(s) from server.": "Tog bort {{n}} bok/böcker från servern.",
"Failed to load directory": "Kunde inte läsa in katalogen",
"File download is only supported on the desktop and mobile apps.": "Filnedladdning stöds endast i skrivbords- och mobilappar.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installera webbläsartillägget för Readest för att skicka artikeln du läser till ditt bibliotek. Tillägget klipper sidan direkt från din webbläsare, så att betal- och inloggningssidor också fungerar.",
"Added to your library. It will sync to your other devices.": "Tillagd i ditt bibliotek. Synkroniseras med dina andra enheter.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Synklösenfras glömd. Alla krypterade fält rensade.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Endast manuella synkroniseringar och rensningar. Automatiska synkroniseringar under läsning loggas inte här.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Ta bort {{n}} bok/böcker från WebDAV-servern?\n\nDetta tar bara bort fjärrfiler; ditt lokala bibliotek påverkas inte. Borttagningen kan inte ångras. Data på servern försvinner permanent.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Laddar upp bokfiler till dina andra enheter.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Fel synklösenfras. Synkroniserade autentiseringsuppgifter kunde inte dekrypteras.",
"Email books straight to your library": "E-posta böcker direkt till ditt bibliotek",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Vidarebefordra bilagor och artiklar till din privata Readest-adress. Tillgänglig i Plus-, Pro- och Lifetime-abonnemangen.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "Raderar även läsframsteg, anteckningar och bokmärken.",
"Background Image (Library)": "Bakgrundsbild (Bibliotek)",
"Background Image (Reader)": "Bakgrundsbild (Läsvy)",
"updated metadata for {{n}} book(s)": "uppdaterade metadata för {{n}} bok/böcker",
"{{n}} metadata": "{{n}} metadata",
"Metadata updated": "Metadata uppdaterad",
"Filter": "Filtrera",
"Sort by": "Sortera efter",
"Date modified": "Ändringsdatum",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "Minska kontrast",
"Reset Contrast": "Återställ kontrast",
"Increase Contrast": "Öka kontrast",
"Google Drive session expired. Reconnect in Settings.": "Google Drive-sessionen har gått ut. Anslut igen i Inställningar.",
"Cloud sync session expired. Reconnect in Settings.": "Molnsynksessionen har gått ut. Anslut igen i Inställningar.",
"Push": "Skjut",
"Slide": "Glid",
"Page Curl": "Bläddring",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Ställer in textstorleken för ordboksresultat, oberoende av läsvyn.",
"Authentication failed. Reconnect in Settings.": "Autentiseringen misslyckades. Anslut igen i Inställningar.",
"Full Sync": "Fullständig synk",
"Re-check every book instead of only changed ones.": "Kontrollera alla böcker igen i stället för bara ändrade.",
"Waiting for sign-in…": "Väntar på inloggning…",
"Reconnect": "Anslut igen",
"Connected as {{account}}": "Ansluten som {{account}}",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "Uppläsningen fortsätter i bakgrunden",
"Stopped reading aloud": "Uppläsningen stoppades",
"Read aloud stopped": "Uppläsning stoppad",
"Synced via {{provider}} {{time}}": "Synkroniserades via {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Böcker synkas via {{provider}} - Readest Cloud-lagring används inte",
"Cloud provider switched": "Molnleverantör bytt",
"Synced via {{provider}}": "Synkroniserades via {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Uppladdningar till Readest Cloud är pausade så länge {{provider}}-synkning är vald",
"Managed by {{provider}} while it is your cloud sync provider": "Hanteras av {{provider}} så länge det är din molnsynkleverantör",
"Not signed in": "Inte inloggad",
"Active — syncing your library on this device": "Aktiv — synkar ditt bibliotek på den här enheten",
"Paused — plan required": "Pausad — abonnemang krävs",
"Active · Book file uploads off": "Aktiv · Uppladdning av bokfiler av",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Laddar upp bokfiler till dina andra enheter. Uppladdningar till Readest Cloud pausas så länge den här leverantören är vald.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Så länge WebDAV är valt synkas böcker, framsteg och markeringar endast med din server.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Appinställningar, läsestatistik och ordböcker fortsätter att synkas via ditt Readest-konto så länge du är inloggad.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Så länge Google Drive är valt synkas böcker, framsteg och markeringar endast med din Drive.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synka ditt bibliotek, dina läsframsteg och markeringar med Readest Cloud.",
"Account and Storage": "Konto och lagring",
"Manage your plan and stored files": "Hantera ditt abonnemang och lagrade filer",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Välj vart ditt bibliotek — böcker, framsteg, markeringar — synkas på den här enheten. Appinställningar, läsestatistik och ordböcker synkas alltid med ditt Readest-konto så länge du är inloggad.",
"Cloud sync provider": "Molnsynkleverantör",
"Use Readest Cloud": "Använd Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "En annan enhet synkar fortfarande det här biblioteket via Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} uppladdning misslyckades: otillräcklig lagringskvot",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} uppladdningar misslyckades: otillräcklig lagringskvot"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} uppladdningar misslyckades: otillräcklig lagringskvot",
"Library sync via {{provider}}": "Bibliotekssynkronisering via {{provider}}",
"Google Drive session expired": "Google Drive-sessionen har upphört",
"Cloud sync session expired": "Molnsynkroniseringssessionen har upphört",
"Uploads book files to your other devices": "Laddar upp bokfiler till dina andra enheter",
"Re-check every book instead of only changed ones": "Kontrollera varje bok igen i stället för bara ändrade",
"KOReader": "KOReader"
}
@@ -308,7 +308,6 @@
"Book": "புத்தகம்",
"Chapter": "அத்தியாயம்",
"Match Case": "எழுத்து பொருத்தம்",
"Match Whole Words": "முழு வார்த்தைகள் பொருத்தம்",
"Match Diacritics": "உச்சரிப்பு குறிகள் பொருத்தம்",
"TOC": "உள்ளடக்கம்",
"Table of Contents": "உள்ளடக்கம்",
@@ -583,8 +582,6 @@
"Advanced Settings": "மேம்பட்ட அமைப்புகள்",
"File count: {{size}}": "கோப்பு எண்ணிக்கை: {{size}}",
"Background Read Aloud": "பின்னணி உரை வாசிப்பு",
"Ready to read aloud": "வாசிக்க தயாராக உள்ளது",
"Read Aloud": "உரை வாசிப்பு",
"Screen Brightness": "திரை பிரகாசம்",
"Background Image": "பின்னணி படம்",
"Import Image": "புகைப்படம் இறக்குமதி",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV அங்கீகாரம் தோல்வி. அமைப்புகளில் மீண்டும் இணைக்கவும்.",
"Downloading": "பதிவிறக்கப்படுகிறது",
"Uploading": "பதிவேற்றப்படுகிறது",
"downloaded {{n}} book(s)": "{{n}} புத்தகம்(ங்கள்) பதிவிறக்கப்பட்டன",
"pushed {{n}} config(s)": "{{n}} கட்டமைப்பு(கள்) அனுப்பப்பட்டன",
"uploaded {{n}} new file(s)": "{{n}} புதிய கோப்பு(கள்) பதிவேற்றப்பட்டன",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "ஒத்திசைவு {{failed}} தோல்விகளுடன் முடிந்தது. {{ok}} சரி.",
"Sync complete": "ஒத்திசைவு முடிந்தது",
"Everything is already up to date.": "அனைத்தும் ஏற்கனவே புதுப்பித்த நிலையில் உள்ளன.",
"Browsing {{path}} on {{server}}": "{{server}} இல் {{path}} ஐ உலாவுகிறது",
"Connect to a WebDAV server to browse your remote files.": "உங்கள் தொலைதூர கோப்புகளை உலாவ WebDAV சேவையகத்துடன் இணைக்கவும்.",
"WebDAV": "WebDAV",
"Upload Book Files": "புத்தக கோப்புகளை பதிவேற்று",
"Sync now": "இப்போது ஒத்திசை",
@@ -1546,33 +1536,8 @@
"Show password": "கடவுச்சொல்லைக் காட்டு",
"Root Directory": "மூல கோப்பகம்",
"Syncing…": "ஒத்திசைக்கப்படுகிறது…",
"pulled progress for {{n}} book(s)": "{{n}} புத்தகம்(ங்கள்) முன்னேற்றம் இழுக்கப்பட்டது",
"Sync History": "ஒத்திசைவு வரலாறு",
"Clear Sync History": "ஒத்திசைவு வரலாற்றை அழி",
"No manual syncs yet": "இதுவரை கைமுறை ஒத்திசைவுகள் இல்லை",
"Partial": "பகுதியளவு",
"Cleanup": "சுத்தம்",
"Cleanup failed": "சுத்தம் தோல்வி",
"Sync failed": "ஒத்திசைவு தோல்வியடைந்தது",
"{{n}} deleted": "{{n}} நீக்கப்பட்டன",
"{{n}} failed": "{{n}} தோல்வி",
"Nothing deleted": "எதுவும் நீக்கப்படவில்லை",
"{{n}} downloaded": "{{n}} பதிவிறக்கப்பட்டன",
"{{n}} uploaded": "{{n}} பதிவேற்றப்பட்டன",
"{{n}} progress": "{{n}} முன்னேற்றம்",
"Up to date": "புதுப்பித்த நிலையில்",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "பதிவிறக்கிய புத்தகங்கள்",
"Files uploaded": "பதிவேற்றிய கோப்புகள்",
"Configs uploaded": "பதிவேற்றிய கட்டமைப்புகள்",
"Configs downloaded": "பதிவிறக்கிய கட்டமைப்புகள்",
"Covers uploaded": "பதிவேற்றிய அட்டைகள்",
"Books deleted": "நீக்கிய புத்தகங்கள்",
"Files in sync": "ஒத்திசைவில் உள்ள கோப்புகள்",
"Failures": "தோல்விகள்",
"Total books": "மொத்த புத்தகங்கள்",
"Error:": "பிழை:",
"Failed books": "தோல்வியடைந்த புத்தகங்கள்",
"Deleted {{n}} book(s) from server.": "சேவையகத்திலிருந்து {{n}} புத்தகம்(ங்கள்) நீக்கப்பட்டன.",
"Failed to load directory": "கோப்பகத்தை ஏற்ற முடியவில்லை",
"File download is only supported on the desktop and mobile apps.": "கோப்பு பதிவிறக்கம் டெஸ்க்டாப் மற்றும் மொபைல் பயன்பாடுகளில் மட்டுமே ஆதரிக்கப்படுகிறது.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "நீங்கள் படிக்கும் கட்டுரையை உங்கள் நூலகத்திற்கு அனுப்ப Readest உலாவி நீட்டிப்பை நிறுவவும். அது உங்கள் உலாவியில் இருந்து பக்கத்தை வெட்டியெடுக்கிறது, எனவே பணம் செலுத்திய மற்றும் உள்நுழைவு மட்டுமே தேவைப்படும் தளங்களும் இயங்கும்.",
"Added to your library. It will sync to your other devices.": "உங்கள் நூலகத்தில் சேர்க்கப்பட்டது. உங்கள் மற்ற சாதனங்களுக்கு ஒத்திசைக்கப்படும்.",
"Sync passphrase forgotten. All encrypted fields cleared.": "ஒத்திசைவு கடவுச்சொற்றொடர் மறக்கப்பட்டது. அனைத்து குறியாக்கப்பட்ட புலங்களும் அழிக்கப்பட்டன.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "கைமுறை ஒத்திசைவுகள் மற்றும் சுத்திகரிப்புகள் மட்டுமே. வாசிக்கும்போது தானியங்கி ஒத்திசைவுகள் இங்கு பதிவாகாது.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV சேவையகத்திலிருந்து {{n}} புத்தகம்(ங்கள்) நீக்க வேண்டுமா?\n\nஇது தொலைதூர கோப்புகளை மட்டுமே நீக்கும்; உங்கள் உள்ளூர் நூலகம் பாதிக்கப்படாது. நீக்கலை மீட்க முடியாது. சேவையகத்தில் உள்ள தரவு நிரந்தரமாக மறையும்.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "புத்தக கோப்புகளை உங்கள் பிற சாதனங்களுக்கு பதிவேற்றுகிறது.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "தவறான ஒத்திசைவு கடவுச்சொற்றொடர். ஒத்திசைக்கப்பட்ட சான்றுகளை மறைகுறியாக்க முடியவில்லை.",
"Email books straight to your library": "புத்தகங்களை மின்னஞ்சல் வழியாக நேரடியாக உங்கள் நூலகத்திற்கு அனுப்பவும்",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "இணைப்புகள் மற்றும் கட்டுரைகளை உங்கள் தனிப்பட்ட Readest முகவரிக்கு முன்னனுப்பவும். Plus, Pro மற்றும் Lifetime திட்டங்களில் கிடைக்கும்.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "வாசிப்பு முன்னேற்றம், குறிப்புகள் மற்றும் புக்மார்க்குகளையும் அழிக்கும்.",
"Background Image (Library)": "பின்னணி படம் (நூலகம்)",
"Background Image (Reader)": "பின்னணி படம் (வாசிப்புப் பக்கம்)",
"updated metadata for {{n}} book(s)": "{{n}} புத்தகத்தின் மெட்டாடேட்டா புதுப்பிக்கப்பட்டது",
"{{n}} metadata": "{{n}} மெட்டாடேட்டா",
"Metadata updated": "மெட்டாடேட்டா புதுப்பிக்கப்பட்டது",
"Filter": "வடிகட்டு",
"Sort by": "வரிசைப்படுத்து",
"Date modified": "மாற்றிய தேதி",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "மாறுபாட்டைக் குறை",
"Reset Contrast": "மாறுபாட்டை மீட்டமை",
"Increase Contrast": "மாறுபாட்டை அதிகரி",
"Google Drive session expired. Reconnect in Settings.": "Google Drive அமர்வு காலாவதியானது. அமைப்புகளில் மீண்டும் இணைக்கவும்.",
"Cloud sync session expired. Reconnect in Settings.": "Cloud ஒத்திசைவு அமர்வு காலாவதியானது. அமைப்புகளில் மீண்டும் இணைக்கவும்.",
"Push": "தள்ளல்",
"Slide": "சறுக்கல்",
"Page Curl": "பக்கச் சுருட்டல்",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "வாசிப்புக் காட்சியைச் சாராமல், அகராதி முடிவுகளின் உரை அளவை அமைக்கிறது.",
"Authentication failed. Reconnect in Settings.": "அங்கீகாரம் தோல்வியடைந்தது. அமைப்புகளில் மீண்டும் இணைக்கவும்.",
"Full Sync": "முழு ஒத்திசைவு",
"Re-check every book instead of only changed ones.": "மாற்றப்பட்ட புத்தகங்களை மட்டும் அல்லாமல் ஒவ்வொரு புத்தகத்தையும் மீண்டும் சரிபார்க்கவும்.",
"Waiting for sign-in…": "உள்நுழைவுக்காகக் காத்திருக்கிறது…",
"Reconnect": "மீண்டும் இணைக்கவும்",
"Connected as {{account}}": "{{account}} ஆக இணைக்கப்பட்டுள்ளது",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "உரை வாசிப்பு பின்னணியில் தொடர்கிறது",
"Stopped reading aloud": "உரை வாசிப்பு நிறுத்தப்பட்டது",
"Read aloud stopped": "உரை வாசிப்பு நின்றது",
"Synced via {{provider}} {{time}}": "{{provider}} வழியாக {{time}} ஒத்திசைக்கப்பட்டது",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "புத்தகங்கள் {{provider}} வழியாக ஒத்திசைக்கப்படுகின்றன - Readest Cloud சேமிப்பகம் பயன்படுத்தப்படாது",
"Cloud provider switched": "கிளவுட் வழங்குநர் மாற்றப்பட்டது",
"Synced via {{provider}}": "{{provider}} வழியாக ஒத்திசைக்கப்பட்டது",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} ஒத்திசைவு தேர்ந்தெடுக்கப்பட்டிருக்கும் வரை Readest Cloud-க்கு பதிவேற்றங்கள் இடைநிறுத்தப்படும்",
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} உங்கள் கிளவுட் ஒத்திசைவு வழங்குநராக இருக்கும் வரை அதனால் நிர்வகிக்கப்படுகிறது",
"Not signed in": "உள்நுழையவில்லை",
"Active — syncing your library on this device": "செயலில் — இந்த சாதனத்தில் உங்கள் நூலகம் ஒத்திசைக்கப்படுகிறது",
"Paused — plan required": "இடைநிறுத்தப்பட்டது — திட்டம் தேவை",
"Active · Book file uploads off": "செயலில் · புத்தக கோப்பு பதிவேற்றம் அணைக்கப்பட்டுள்ளது",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "புத்தக கோப்புகளை உங்கள் பிற சாதனங்களுக்கு பதிவேற்றுகிறது. இந்த வழங்குநர் தேர்ந்தெடுக்கப்பட்டிருக்கும் வரை Readest Cloud-க்கு பதிவேற்றங்கள் இடைநிறுத்தப்படும்.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV தேர்ந்தெடுக்கப்பட்டிருக்கும் வரை, புத்தகங்கள், முன்னேற்றம் மற்றும் சிறப்பம்சங்கள் உங்கள் சேவையகத்துடன் மட்டுமே ஒத்திசைக்கப்படும்.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "உள்நுழைந்திருக்கும் வரை ஆப் அமைப்புகள், வாசிப்பு புள்ளிவிவரங்கள் மற்றும் அகராதிகள் உங்கள் Readest கணக்கு வழியாக ஒத்திசைக்கப்பட்டுக்கொண்டே இருக்கும்.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive தேர்ந்தெடுக்கப்பட்டிருக்கும் வரை, புத்தகங்கள், முன்னேற்றம் மற்றும் சிறப்பம்சங்கள் உங்கள் Drive-உடன் மட்டுமே ஒத்திசைக்கப்படும்.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "உங்கள் நூலகம், வாசிப்பு முன்னேற்றம் மற்றும் சிறப்பம்சங்களை Readest Cloud-உடன் ஒத்திசைக்கவும்.",
"Account and Storage": "கணக்கு மற்றும் சேமிப்பகம்",
"Manage your plan and stored files": "உங்கள் திட்டம் மற்றும் சேமிக்கப்பட்ட கோப்புகளை நிர்வகிக்கவும்",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "இந்த சாதனத்தில் உங்கள் நூலகம் — புத்தகங்கள், முன்னேற்றம், சிறப்பம்சங்கள் — எங்கு ஒத்திசைக்கப்படும் என்பதைத் தேர்வுசெய்யவும். உள்நுழைந்திருக்கும் வரை ஆப் அமைப்புகள், வாசிப்பு புள்ளிவிவரங்கள் மற்றும் அகராதிகள் எப்போதும் உங்கள் Readest கணக்குடன் ஒத்திசைக்கப்படும்.",
"Cloud sync provider": "கிளவுட் ஒத்திசைவு வழங்குநர்",
"Use Readest Cloud": "Readest Cloud-ஐப் பயன்படுத்து",
"Another device is still syncing this library via Readest Cloud": "மற்றொரு சாதனம் இன்னும் Readest Cloud வழியாக இந்த நூலகத்தை ஒத்திசைக்கிறது",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} பதிவேற்றம் தோல்வியடைந்தது: போதுமான சேமிப்பக ஒதுக்கீடு இல்லை",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} பதிவேற்றங்கள் தோல்வியடைந்தன: போதுமான சேமிப்பக ஒதுக்கீடு இல்லை"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} பதிவேற்றங்கள் தோல்வியடைந்தன: போதுமான சேமிப்பக ஒதுக்கீடு இல்லை",
"Library sync via {{provider}}": "{{provider}} வழியாக நூலக ஒத்திசைவு",
"Google Drive session expired": "Google Drive அமர்வு காலாவதியானது",
"Cloud sync session expired": "கிளவுட் ஒத்திசைவு அமர்வு காலாவதியானது",
"Uploads book files to your other devices": "புத்தகக் கோப்புகளை உங்கள் மற்ற சாதனங்களுக்குப் பதிவேற்றுகிறது",
"Re-check every book instead of only changed ones": "மாற்றப்பட்டவை மட்டுமல்லாமல் ஒவ்வொரு புத்தகத்தையும் மீண்டும் சரிபார்க்கவும்",
"KOReader": "KOReader"
}
@@ -261,7 +261,6 @@
"Book": "หนังสือ",
"Chapter": "บท",
"Match Case": "ตรงตามตัวอักษร",
"Match Whole Words": "ตรงทั้งคำ",
"Match Diacritics": "ตรงตามเครื่องหมายวรรณยุกต์",
"TOC": "สารบัญ",
"Table of Contents": "สารบัญ",
@@ -579,8 +578,6 @@
"Advanced Settings": "การตั้งค่าขั้นสูง",
"File count: {{size}}": "จำนวนไฟล์: {{size}}",
"Background Read Aloud": "อ่านออกเสียงเบื้องหลัง",
"Ready to read aloud": "พร้อมที่จะอ่านออกเสียง",
"Read Aloud": "อ่านออกเสียง",
"Screen Brightness": "ความสว่างหน้าจอ",
"Background Image": "ภาพพื้นหลัง",
"Import Image": "นำเข้าภาพ",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "การยืนยันตัวตน WebDAV ล้มเหลว เชื่อมต่อใหม่ในการตั้งค่า",
"Downloading": "กำลังดาวน์โหลด",
"Uploading": "กำลังอัปโหลด",
"downloaded {{n}} book(s)": "ดาวน์โหลด {{n}} เล่ม",
"pushed {{n}} config(s)": "อัปโหลดการตั้งค่า {{n}} รายการ",
"uploaded {{n}} new file(s)": "อัปโหลด {{n}} ไฟล์ใหม่",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "ซิงค์เสร็จสิ้นโดยมี {{failed}} รายการล้มเหลว สำเร็จ {{ok}}",
"Sync complete": "ซิงค์เสร็จสมบูรณ์",
"Everything is already up to date.": "ทุกอย่างเป็นเวอร์ชันล่าสุดอยู่แล้ว",
"Browsing {{path}} on {{server}}": "กำลังเรียกดู {{path}} บน {{server}}",
"Connect to a WebDAV server to browse your remote files.": "เชื่อมต่อกับเซิร์ฟเวอร์ WebDAV เพื่อเรียกดูไฟล์ระยะไกลของคุณ",
"WebDAV": "WebDAV",
"Upload Book Files": "อัปโหลดไฟล์หนังสือ",
"Sync now": "ซิงค์ทันที",
@@ -1517,33 +1507,8 @@
"Show password": "แสดงรหัสผ่าน",
"Root Directory": "ไดเรกทอรีราก",
"Syncing…": "กำลังซิงค์…",
"pulled progress for {{n}} book(s)": "ดึงความคืบหน้าของ {{n}} เล่ม",
"Sync History": "ประวัติการซิงค์",
"Clear Sync History": "ล้างประวัติการซิงค์",
"No manual syncs yet": "ยังไม่มีการซิงค์ด้วยตนเอง",
"Partial": "บางส่วน",
"Cleanup": "ล้างข้อมูล",
"Cleanup failed": "ล้างข้อมูลไม่สำเร็จ",
"Sync failed": "ซิงค์ไม่สำเร็จ",
"{{n}} deleted": "ลบ {{n}}",
"{{n}} failed": "ล้มเหลว {{n}}",
"Nothing deleted": "ไม่มีอะไรถูกลบ",
"{{n}} downloaded": "ดาวน์โหลด {{n}}",
"{{n}} uploaded": "อัปโหลด {{n}}",
"{{n}} progress": "{{n}} ความคืบหน้า",
"Up to date": "เป็นเวอร์ชันล่าสุด",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "หนังสือที่ดาวน์โหลด",
"Files uploaded": "ไฟล์ที่อัปโหลด",
"Configs uploaded": "การตั้งค่าที่อัปโหลด",
"Configs downloaded": "การตั้งค่าที่ดาวน์โหลด",
"Covers uploaded": "ปกที่อัปโหลด",
"Books deleted": "หนังสือที่ลบ",
"Files in sync": "ไฟล์ที่ซิงค์แล้ว",
"Failures": "ความล้มเหลว",
"Total books": "หนังสือทั้งหมด",
"Error:": "ข้อผิดพลาด:",
"Failed books": "หนังสือที่ล้มเหลว",
"Deleted {{n}} book(s) from server.": "ลบหนังสือ {{n}} เล่มจากเซิร์ฟเวอร์",
"Failed to load directory": "ไม่สามารถโหลดไดเรกทอรี",
"File download is only supported on the desktop and mobile apps.": "การดาวน์โหลดไฟล์รองรับเฉพาะในแอปเดสก์ท็อปและมือถือเท่านั้น",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ติดตั้งส่วนขยายเบราว์เซอร์ Readest เพื่อส่งบทความที่คุณกำลังอ่านไปยังคลังของคุณ ส่วนขยายจะตัดหน้านี้จากเบราว์เซอร์ของคุณ ดังนั้นเว็บไซต์แบบมีเพย์วอลล์และที่ต้องล็อกอินก็ยังใช้งานได้",
"Added to your library. It will sync to your other devices.": "เพิ่มลงในคลังของคุณแล้ว จะซิงค์ไปยังอุปกรณ์อื่นๆ ของคุณ",
"Sync passphrase forgotten. All encrypted fields cleared.": "ลืมรหัสผ่านการซิงค์แล้ว ฟิลด์ที่เข้ารหัสทั้งหมดถูกล้าง",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "การซิงค์และล้างข้อมูลด้วยตนเองเท่านั้น การซิงค์อัตโนมัติระหว่างอ่านจะไม่ถูกบันทึกที่นี่",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "ลบหนังสือ {{n}} เล่มจากเซิร์ฟเวอร์ WebDAV?\n\nสิ่งนี้จะลบเฉพาะไฟล์ระยะไกล; คลังข้อมูลในเครื่องของคุณจะไม่ได้รับผลกระทบ การลบไม่สามารถย้อนกลับได้ ข้อมูลบนเซิร์ฟเวอร์จะหายไปอย่างถาวร",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "อัปโหลดไฟล์หนังสือไปยังอุปกรณ์อื่นของคุณ",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "รหัสผ่านการซิงค์ไม่ถูกต้อง ไม่สามารถถอดรหัสข้อมูลรับรองที่ซิงค์ได้",
"Email books straight to your library": "ส่งหนังสือทางอีเมลไปยังคลังของคุณโดยตรง",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "ส่งต่อไฟล์แนบและบทความไปยังที่อยู่ Readest ส่วนตัวของคุณ ใช้งานได้ในแผน Plus, Pro และ Lifetime",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "ลบความคืบหน้าในการอ่าน บันทึก และบุ๊กมาร์กด้วย",
"Background Image (Library)": "ภาพพื้นหลัง (คลังหนังสือ)",
"Background Image (Reader)": "ภาพพื้นหลัง (มุมมองการอ่าน)",
"updated metadata for {{n}} book(s)": "อัปเดตเมทาดาตาสำหรับ {{n}} เล่ม",
"{{n}} metadata": "{{n}} เมทาดาตา",
"Metadata updated": "อัปเดตเมทาดาตาแล้ว",
"Filter": "กรอง",
"Sort by": "เรียงตาม",
"Date modified": "วันที่แก้ไข",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "ลดความคมชัด",
"Reset Contrast": "รีเซ็ตความคมชัด",
"Increase Contrast": "เพิ่มความคมชัด",
"Google Drive session expired. Reconnect in Settings.": "เซสชัน Google Drive หมดอายุ เชื่อมต่อใหม่ในการตั้งค่า",
"Cloud sync session expired. Reconnect in Settings.": "เซสชันซิงค์คลาวด์หมดอายุ เชื่อมต่อใหม่ในการตั้งค่า",
"Push": "ดัน",
"Slide": "สไลด์",
"Page Curl": "ม้วนกระดาษ",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "กำหนดขนาดตัวอักษรของผลลัพธ์พจนานุกรม โดยไม่ขึ้นกับมุมมองการอ่าน",
"Authentication failed. Reconnect in Settings.": "การยืนยันตัวตนล้มเหลว เชื่อมต่อใหม่ในการตั้งค่า",
"Full Sync": "ซิงค์แบบเต็ม",
"Re-check every book instead of only changed ones.": "ตรวจสอบหนังสือทุกเล่มอีกครั้งแทนที่จะตรวจเฉพาะเล่มที่เปลี่ยนแปลง",
"Waiting for sign-in…": "กำลังรอการเข้าสู่ระบบ…",
"Reconnect": "เชื่อมต่อใหม่",
"Connected as {{account}}": "เชื่อมต่อในชื่อ {{account}}",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "การอ่านออกเสียงดำเนินต่อในเบื้องหลัง",
"Stopped reading aloud": "หยุดอ่านออกเสียงแล้ว",
"Read aloud stopped": "การอ่านออกเสียงหยุดแล้ว",
"Synced via {{provider}} {{time}}": "ซิงค์ผ่าน {{provider}} เมื่อ {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "หนังสือซิงค์ผ่าน {{provider}} - ไม่ใช้พื้นที่จัดเก็บของ Readest Cloud",
"Cloud provider switched": "เปลี่ยนผู้ให้บริการคลาวด์แล้ว",
"Synced via {{provider}}": "ซิงค์ผ่าน {{provider}} แล้ว",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "การอัปโหลดไปยัง Readest Cloud หยุดชั่วคราวขณะที่เลือกการซิงค์ {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "จัดการโดย {{provider}} ขณะที่เป็นผู้ให้บริการซิงค์คลาวด์ของคุณ",
"Not signed in": "ยังไม่ได้เข้าสู่ระบบ",
"Active — syncing your library on this device": "ใช้งานอยู่ — กำลังซิงค์คลังหนังสือของคุณบนอุปกรณ์นี้",
"Paused — plan required": "หยุดชั่วคราว — ต้องมีแพ็กเกจ",
"Active · Book file uploads off": "ใช้งานอยู่ · ปิดการอัปโหลดไฟล์หนังสือ",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "อัปโหลดไฟล์หนังสือไปยังอุปกรณ์อื่นของคุณ การอัปโหลดไปยัง Readest Cloud จะหยุดชั่วคราวขณะที่เลือกผู้ให้บริการนี้",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "ขณะที่เลือก WebDAV หนังสือ ความคืบหน้า และไฮไลต์จะซิงค์กับเซิร์ฟเวอร์ของคุณเท่านั้น",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "การตั้งค่าแอป สถิติการอ่าน และพจนานุกรมยังคงซิงค์ผ่านบัญชี Readest ของคุณขณะที่เข้าสู่ระบบอยู่",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "ขณะที่เลือก Google Drive หนังสือ ความคืบหน้า และไฮไลต์จะซิงค์กับ Drive ของคุณเท่านั้น",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "ซิงค์คลังหนังสือ ความคืบหน้าการอ่าน และไฮไลต์ของคุณกับ Readest Cloud",
"Account and Storage": "บัญชีและพื้นที่จัดเก็บ",
"Manage your plan and stored files": "จัดการแพ็กเกจและไฟล์ที่จัดเก็บของคุณ",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "เลือกว่าคลังหนังสือของคุณ — หนังสือ ความคืบหน้า ไฮไลต์ — จะซิงค์ไปที่ใดบนอุปกรณ์นี้ การตั้งค่าแอป สถิติการอ่าน และพจนานุกรมจะซิงค์กับบัญชี Readest ของคุณเสมอขณะที่เข้าสู่ระบบอยู่",
"Cloud sync provider": "ผู้ให้บริการซิงค์คลาวด์",
"Use Readest Cloud": "ใช้ Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "อุปกรณ์อื่นยังคงซิงค์คลังหนังสือนี้ผ่าน Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_other": "อัปโหลดล้มเหลว {{count}} รายการ: พื้นที่จัดเก็บไม่เพียงพอ"
"{{count}} uploads failed: insufficient storage quota_other": "อัปโหลดล้มเหลว {{count}} รายการ: พื้นที่จัดเก็บไม่เพียงพอ",
"Library sync via {{provider}}": "ซิงค์คลังหนังสือผ่าน {{provider}}",
"Google Drive session expired": "เซสชัน Google Drive หมดอายุแล้ว",
"Cloud sync session expired": "เซสชันการซิงค์บนคลาวด์หมดอายุแล้ว",
"Uploads book files to your other devices": "อัปโหลดไฟล์หนังสือไปยังอุปกรณ์อื่นของคุณ",
"Re-check every book instead of only changed ones": "ตรวจสอบหนังสือทุกเล่มอีกครั้งแทนที่จะเฉพาะเล่มที่เปลี่ยนแปลง",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "{{userDisplayName}} olarak giriş yapıldı",
"Match Case": "Büyük/Küçük Harf Eşleştir",
"Match Diacritics": "Aksan İşaretlerini Eşleştir",
"Match Whole Words": "Tam Kelimeleri Eşleştir",
"Maximum Number of Columns": "Maksimum Sütun Sayısı",
"Minimum Font Size": "Minimum Yazı Boyutu",
"Monospace Font": "Eş Aralıklı Yazı Tipi",
@@ -583,8 +582,6 @@
"Advanced Settings": "Gelişmiş Ayarlar",
"File count: {{size}}": "Dosya sayısı: {{size}}",
"Background Read Aloud": "Arka Planda Sesli Okuma",
"Ready to read aloud": "Sesli okumaya hazır",
"Read Aloud": "Sesli Oku",
"Screen Brightness": "Ekran Parlaklığı",
"Background Image": "Arka Plan Görüntüsü",
"Import Image": "Görüntü İçe Aktar",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV kimlik doğrulaması başarısız. Ayarlar'dan yeniden bağlanın.",
"Downloading": "İndiriliyor",
"Uploading": "Yükleniyor",
"downloaded {{n}} book(s)": "{{n}} kitap indirildi",
"pushed {{n}} config(s)": "{{n}} yapılandırma gönderildi",
"uploaded {{n}} new file(s)": "{{n}} yeni dosya yüklendi",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Eşitleme {{failed}} hatayla tamamlandı. {{ok}} başarılı.",
"Sync complete": "Eşitleme tamamlandı",
"Everything is already up to date.": "Her şey zaten güncel.",
"Browsing {{path}} on {{server}}": "{{server}} üzerinde {{path}} göz atılıyor",
"Connect to a WebDAV server to browse your remote files.": "Uzak dosyalarınıza göz atmak için bir WebDAV sunucusuna bağlanın.",
"WebDAV": "WebDAV",
"Upload Book Files": "Kitap dosyalarını yükle",
"Sync now": "Şimdi eşitle",
@@ -1546,33 +1536,8 @@
"Show password": "Parolayı göster",
"Root Directory": "Kök dizin",
"Syncing…": "Eşitleniyor…",
"pulled progress for {{n}} book(s)": "{{n}} kitap için ilerleme alındı",
"Sync History": "Eşitleme geçmişi",
"Clear Sync History": "Eşitleme geçmişini temizle",
"No manual syncs yet": "Henüz manuel eşitleme yok",
"Partial": "Kısmi",
"Cleanup": "Temizlik",
"Cleanup failed": "Temizlik başarısız",
"Sync failed": "Eşitleme başarısız",
"{{n}} deleted": "{{n}} silindi",
"{{n}} failed": "{{n}} başarısız",
"Nothing deleted": "Hiçbir şey silinmedi",
"{{n}} downloaded": "{{n}} indirildi",
"{{n}} uploaded": "{{n}} yüklendi",
"{{n}} progress": "{{n}} ilerleme",
"Up to date": "Güncel",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "İndirilen kitaplar",
"Files uploaded": "Yüklenen dosyalar",
"Configs uploaded": "Yüklenen yapılandırmalar",
"Configs downloaded": "İndirilen yapılandırmalar",
"Covers uploaded": "Yüklenen kapaklar",
"Books deleted": "Silinen kitaplar",
"Files in sync": "Eşitlenmiş dosyalar",
"Failures": "Başarısızlıklar",
"Total books": "Toplam kitap",
"Error:": "Hata:",
"Failed books": "Başarısız kitaplar",
"Deleted {{n}} book(s) from server.": "Sunucudan {{n}} kitap silindi.",
"Failed to load directory": "Dizin yüklenemedi",
"File download is only supported on the desktop and mobile apps.": "Dosya indirme yalnızca masaüstü ve mobil uygulamalarda desteklenir.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Okuduğunuz makaleyi kitaplığınıza göndermek için Readest tarayıcı uzantısını yükleyin. Uzantı sayfayı tarayıcınızdan keser, bu sayede ödemeli ve yalnızca girişli siteler de çalışır.",
"Added to your library. It will sync to your other devices.": "Kitaplığınıza eklendi. Diğer cihazlarınızla eşitlenecek.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Eşitleme parola tümcesi unutuldu. Tüm şifreli alanlar temizlendi.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Yalnızca manuel eşitlemeler ve temizlikler. Okuma sırasında otomatik eşitlemeler burada kaydedilmez.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV sunucusundan {{n}} kitap silinsin mi?\n\nBu yalnızca uzak dosyaları kaldırır; yerel kitaplığınız etkilenmez. Silme geri alınamaz. Sunucudaki veriler kalıcı olarak yok olur.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Kitap dosyalarını diğer cihazlarınıza yükler.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Yanlış eşitleme parola tümcesi. Eşitlenmiş kimlik bilgileri çözülemedi.",
"Email books straight to your library": "Kitapları e-postayla doğrudan kitaplığınıza gönderin",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Ekleri ve makaleleri özel Readest adresinize iletin. Plus, Pro ve Lifetime planlarında kullanılabilir.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "Okuma ilerlemesi, notlar ve yer işaretlerini de siler.",
"Background Image (Library)": "Arka Plan Görüntüsü (Kütüphane)",
"Background Image (Reader)": "Arka Plan Görüntüsü (Okuma Görünümü)",
"updated metadata for {{n}} book(s)": "{{n}} kitabın meta verileri güncellendi",
"{{n}} metadata": "{{n}} meta veri",
"Metadata updated": "Meta veriler güncellendi",
"Filter": "Filtrele",
"Sort by": "Sıralama ölçütü",
"Date modified": "Değiştirilme tarihi",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "Kontrastı Azalt",
"Reset Contrast": "Kontrastı Sıfırla",
"Increase Contrast": "Kontrastı Artır",
"Google Drive session expired. Reconnect in Settings.": "Google Drive oturumu sona erdi. Ayarlar'dan yeniden bağlanın.",
"Cloud sync session expired. Reconnect in Settings.": "Bulut senkronizasyonu oturumu sona erdi. Ayarlar'dan yeniden bağlanın.",
"Push": "İtme",
"Slide": "Kaydırma",
"Page Curl": "Sayfa Kıvırma",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Sözlük sonuçlarının metin boyutunu okuma görünümünden bağımsız olarak ayarlar.",
"Authentication failed. Reconnect in Settings.": "Kimlik doğrulama başarısız oldu. Ayarlar'dan yeniden bağlanın.",
"Full Sync": "Tam Senkronizasyon",
"Re-check every book instead of only changed ones.": "Yalnızca değişen kitapları değil, tüm kitapları yeniden kontrol eder.",
"Waiting for sign-in…": "Giriş bekleniyor…",
"Reconnect": "Yeniden Bağlan",
"Connected as {{account}}": "{{account}} olarak bağlanıldı",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "Sesli okuma arka planda devam ediyor",
"Stopped reading aloud": "Sesli okuma durduruldu",
"Read aloud stopped": "Sesli okuma durdu",
"Synced via {{provider}} {{time}}": "{{provider}} üzerinden {{time}} senkronize edildi",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Kitaplar {{provider}} üzerinden senkronize edilir - Readest Cloud depolaması kullanılmaz",
"Cloud provider switched": "Bulut sağlayıcı değiştirildi",
"Synced via {{provider}}": "{{provider}} üzerinden senkronize edildi",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} senkronizasyonu seçili olduğu sürece Readest Cloud yüklemeleri duraklatılır",
"Managed by {{provider}} while it is your cloud sync provider": "Bulut senkronizasyon sağlayıcınız olduğu sürece {{provider}} tarafından yönetilir",
"Not signed in": "Oturum açılmadı",
"Active — syncing your library on this device": "Etkin — kütüphaneniz bu cihazda senkronize ediliyor",
"Paused — plan required": "Duraklatıldı — plan gerekli",
"Active · Book file uploads off": "Etkin · Kitap dosyası yükleme kapalı",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Kitap dosyalarını diğer cihazlarınıza yükler. Bu sağlayıcı seçili olduğu sürece Readest Cloud yüklemeleri duraklatılır.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV seçili olduğu sürece kitaplar, ilerleme ve vurgular yalnızca sunucunuzla senkronize edilir.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Uygulama ayarları, okuma istatistikleri ve sözlükler, oturum açık olduğu sürece Readest hesabınız üzerinden senkronize edilmeye devam eder.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive seçili olduğu sürece kitaplar, ilerleme ve vurgular yalnızca Drive’ınızla senkronize edilir.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Kütüphanenizi, okuma ilerlemenizi ve vurgularınızı Readest Cloud ile senkronize edin.",
"Account and Storage": "Hesap ve depolama",
"Manage your plan and stored files": "Planınızı ve depolanan dosyalarınızı yönetin",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Kütüphanenizin — kitaplar, ilerleme, vurgular — bu cihazda nereyle senkronize edileceğini seçin. Uygulama ayarları, okuma istatistikleri ve sözlükler, oturum açık olduğu sürece her zaman Readest hesabınızla senkronize edilir.",
"Cloud sync provider": "Bulut senkronizasyon sağlayıcısı",
"Use Readest Cloud": "Readest Cloud kullan",
"Another device is still syncing this library via Readest Cloud": "Başka bir cihaz bu kütüphaneyi hâlâ Readest Cloud üzerinden senkronize ediyor",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} yükleme başarısız: yetersiz depolama kotası",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} yükleme başarısız: yetersiz depolama kotası"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} yükleme başarısız: yetersiz depolama kotası",
"Library sync via {{provider}}": "{{provider}} ile kitaplık eşitleme",
"Google Drive session expired": "Google Drive oturumunun süresi doldu",
"Cloud sync session expired": "Bulut eşitleme oturumunun süresi doldu",
"Uploads book files to your other devices": "Kitap dosyalarını diğer cihazlarınıza yükler",
"Re-check every book instead of only changed ones": "Yalnızca değişenleri değil her kitabı yeniden denetle",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Увійдено як {{userDisplayName}}",
"Match Case": "Враховувати реґістр",
"Match Diacritics": "Враховувати діакритичні знаки",
"Match Whole Words": "Шукати цілі слова",
"Maximum Number of Columns": "Максимальна кількість колонок",
"Minimum Font Size": "Мінімальний розмір шрифту",
"Monospace Font": "Моноширинний шрифт",
@@ -591,8 +590,6 @@
"Advanced Settings": "Розширені налаштування",
"File count: {{size}}": "Кількість файлів: {{size}}",
"Background Read Aloud": "Озвучування у фоновому режимі",
"Ready to read aloud": "Готовність до читання вголос",
"Read Aloud": "Читати вголос",
"Screen Brightness": "Яскравість екрану",
"Background Image": "Фонове зображення",
"Import Image": "Імпортувати зображення",
@@ -1589,14 +1586,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Не вдалося пройти автентифікацію WebDAV. Підключіться знову в Налаштуваннях.",
"Downloading": "Завантаження",
"Uploading": "Вивантаження",
"downloaded {{n}} book(s)": "завантажено {{n}} книг",
"pushed {{n}} config(s)": "надіслано {{n}} конфігурацій",
"uploaded {{n}} new file(s)": "вивантажено {{n}} нових файлів",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Синхронізацію завершено з {{failed}} помилок. {{ok}} успішно.",
"Sync complete": "Синхронізацію завершено",
"Everything is already up to date.": "Усе вже актуально.",
"Browsing {{path}} on {{server}}": "Перегляд {{path}} на {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Підключіться до сервера WebDAV, щоб переглядати віддалені файли.",
"WebDAV": "WebDAV",
"Upload Book Files": "Вивантажити файли книг",
"Sync now": "Синхронізувати зараз",
@@ -1604,33 +1594,8 @@
"Show password": "Показати пароль",
"Root Directory": "Кореневий каталог",
"Syncing…": "Синхронізація…",
"pulled progress for {{n}} book(s)": "отримано прогрес для {{n}} книг",
"Sync History": "Історія синхронізації",
"Clear Sync History": "Очистити історію синхронізації",
"No manual syncs yet": "Ручних синхронізацій поки немає",
"Partial": "Частково",
"Cleanup": "Очищення",
"Cleanup failed": "Очищення не вдалося",
"Sync failed": "Синхронізація не вдалася",
"{{n}} deleted": "{{n}} видалено",
"{{n}} failed": "{{n}} з помилкою",
"Nothing deleted": "Нічого не видалено",
"{{n}} downloaded": "{{n}} завантажено",
"{{n}} uploaded": "{{n}} вивантажено",
"{{n}} progress": "{{n}} прогрес",
"Up to date": "Актуально",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Завантажені книги",
"Files uploaded": "Вивантажені файли",
"Configs uploaded": "Вивантажені конфігурації",
"Configs downloaded": "Завантажені конфігурації",
"Covers uploaded": "Вивантажені обкладинки",
"Books deleted": "Видалені книги",
"Files in sync": "Синхронізовані файли",
"Failures": "Помилки",
"Total books": "Усього книг",
"Error:": "Помилка:",
"Failed books": "Книги з помилкою",
"Deleted {{n}} book(s) from server.": "Видалено {{n}} книг із сервера.",
"Failed to load directory": "Не вдалося завантажити теку",
"File download is only supported on the desktop and mobile apps.": "Завантаження файлів підтримується лише в настільному та мобільному застосунках.",
@@ -1660,10 +1625,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Встановіть розширення браузера Readest, щоб надсилати статтю, яку ви читаєте, до бібліотеки. Розширення вирізає сторінку з вашого браузера, тому платні та логін-only сайти також працюють.",
"Added to your library. It will sync to your other devices.": "Додано до вашої бібліотеки. Синхронізується з іншими пристроями.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Парольну фразу синхронізації забуто. Усі зашифровані поля очищено.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Лише ручні синхронізації та очищення. Автоматичні синхронізації під час читання тут не записуються.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Видалити {{n}} книг із сервера WebDAV?\n\nЦе видалить лише віддалені файли; ваша локальна бібліотека не зміниться. Видалення неможливо скасувати. Дані на сервері зникнуть назавжди.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Вивантажує файли книг на ваші інші пристрої.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Неправильна парольна фраза синхронізації. Не вдалося розшифрувати синхронізовані облікові дані.",
"Email books straight to your library": "Надсилайте книги електронною поштою прямо в бібліотеку",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Пересилайте вкладення та статті на свою приватну адресу Readest. Доступно в планах Plus, Pro і Lifetime.",
@@ -1858,9 +1821,6 @@
"Also erase reading progress, notes, and bookmarks.": "Також видаляє проґрес читання, нотатки та закладки.",
"Background Image (Library)": "Фонове зображення (Бібліотека)",
"Background Image (Reader)": "Фонове зображення (Режим читання)",
"updated metadata for {{n}} book(s)": "оновлено метадані для {{n}} книг",
"{{n}} metadata": "{{n}} метадані",
"Metadata updated": "Метадані оновлено",
"Filter": "Фільтр",
"Sort by": "Сортувати за",
"Date modified": "Дата зміни",
@@ -1906,8 +1866,6 @@
"Decrease Contrast": "Зменшити контраст",
"Reset Contrast": "Скинути контраст",
"Increase Contrast": "Збільшити контраст",
"Google Drive session expired. Reconnect in Settings.": "Сеанс Google Drive завершився. Повторно під'єднайтеся в налаштуваннях.",
"Cloud sync session expired. Reconnect in Settings.": "Сеанс хмарної синхронізації завершився. Повторно під'єднайтеся в налаштуваннях.",
"Push": "Зсув",
"Slide": "Ковзання",
"Page Curl": "Загин сторінки",
@@ -1916,7 +1874,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Визначає розмір тексту результатів словника незалежно від області читання.",
"Authentication failed. Reconnect in Settings.": "Помилка автентифікації. Повторно під'єднайтеся в налаштуваннях.",
"Full Sync": "Повна синхронізація",
"Re-check every book instead of only changed ones.": "Перевіряти всі книги, а не лише змінені.",
"Waiting for sign-in…": "Очікування входу…",
"Reconnect": "Під'єднатися повторно",
"Connected as {{account}}": "Під'єднано як {{account}}",
@@ -1941,17 +1898,13 @@
"Reading aloud continues in the background": "Читання вголос триває у фоновому режимі",
"Stopped reading aloud": "Читання вголос зупинено",
"Read aloud stopped": "Озвучування зупинено",
"Synced via {{provider}} {{time}}": "Синхронізовано через {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Книги синхронізуються через {{provider}} - сховище Readest Cloud не використовується",
"Cloud provider switched": "Хмарного провайдера змінено",
"Synced via {{provider}}": "Синхронізовано через {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Вивантаження до Readest Cloud призупинено, поки вибрано синхронізацію {{provider}}",
"Managed by {{provider}} while it is your cloud sync provider": "Керується {{provider}}, поки це ваш провайдер хмарної синхронізації",
"Not signed in": "Не виконано вхід",
"Active — syncing your library on this device": "Активно — синхронізує вашу бібліотеку на цьому пристрої",
"Paused — plan required": "Призупинено — потрібен тарифний план",
"Active · Book file uploads off": "Активно · Вивантаження файлів книг вимкнено",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Вивантажує файли книг на ваші інші пристрої. Вивантаження до Readest Cloud призупинено, поки вибрано цього провайдера.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Поки вибрано WebDAV, книги, проґрес і виділення синхронізуються лише з вашим сервером.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Налаштування застосунку, статистика читання та словники й далі синхронізуються через ваш обліковий запис Readest, поки ви ввійшли.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Поки вибрано Google Drive, книги, проґрес і виділення синхронізуються лише з вашим Drive.",
@@ -1959,12 +1912,17 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Синхронізуйте свою бібліотеку, проґрес читання та виділення з Readest Cloud.",
"Account and Storage": "Обліковий запис і сховище",
"Manage your plan and stored files": "Керуйте своїм тарифом і збереженими файлами",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Виберіть, куди синхронізується ваша бібліотека — книги, проґрес, виділення — на цьому пристрої. Налаштування застосунку, статистика читання та словники завжди синхронізуються з вашим обліковим записом Readest, поки ви ввійшли.",
"Cloud sync provider": "Провайдер хмарної синхронізації",
"Use Readest Cloud": "Використовувати Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Інший пристрій усе ще синхронізує цю бібліотеку через Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} вивантаження не вдалося: недостатньо місця у сховищі",
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} вивантаження не вдалися: недостатньо місця у сховищі",
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} вивантажень не вдалися: недостатньо місця у сховищі",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} вивантаження не вдалося: недостатньо місця у сховищі"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} вивантаження не вдалося: недостатньо місця у сховищі",
"Library sync via {{provider}}": "Синхронізація бібліотеки через {{provider}}",
"Google Drive session expired": "Сеанс Google Drive завершився",
"Cloud sync session expired": "Сеанс хмарної синхронізації завершився",
"Uploads book files to your other devices": "Завантажує файли книжок на інші ваші пристрої",
"Re-check every book instead of only changed ones": "Повторно перевіряти кожну книжку, а не лише змінені",
"KOReader": "KOReader"
}
@@ -659,7 +659,6 @@
"Clear search history": "Qidiruv tarixini tozalash",
"Chapter": "Bob",
"Match Case": "Registrga mos kelishi",
"Match Whole Words": "Butun soʻzlarga mos kelishi",
"Match Diacritics": "Diakritik belgilarga mos kelishi",
"Search results for '{{term}}'": "'{{term}}' uchun qidiruv natijalari",
"Previous Result": "Oldingi natija",
@@ -733,8 +732,6 @@
"Translating...": "Tarjima qilinmoqda...",
"Please log in to use advanced TTS features": "Kengaytirilgan TTS xususiyatlaridan foydalanish uchun tizimga kiring",
"TTS not supported for this document": "Ushbu hujjat uchun TTS qoʻllab-quvvatlanmaydi",
"Read Aloud": "Ovoz chiqarib oʻqish",
"Ready to read aloud": "Ovoz chiqarib oʻqishga tayyor",
"Expires in {{count}} days_one": "{{count}} kunda muddati tugaydi",
"Expires in {{count}} days_other": "{{count}} kunda muddati tugaydi",
"Expires in {{count}} hours_one": "{{count}} soatda muddati tugaydi",
@@ -1531,14 +1528,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV autentifikatsiyasi muvaffaqiyatsiz. Sozlamalardan qayta ulanish.",
"Downloading": "Yuklab olinmoqda",
"Uploading": "Yuklanmoqda",
"downloaded {{n}} book(s)": "{{n}} ta kitob yuklab olindi",
"pushed {{n}} config(s)": "{{n}} ta konfiguratsiya yuborildi",
"uploaded {{n}} new file(s)": "{{n}} ta yangi fayl yuklandi",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sinxronlash {{failed}} ta xato bilan tugadi. {{ok}} ta muvaffaqiyatli.",
"Sync complete": "Sinxronlash tugadi",
"Everything is already up to date.": "Hammasi allaqachon yangilangan.",
"Browsing {{path}} on {{server}}": "{{server}} dagi {{path}} ko'rib chiqilmoqda",
"Connect to a WebDAV server to browse your remote files.": "Masofaviy fayllaringizni ko'rish uchun WebDAV serveriga ulanish.",
"WebDAV": "WebDAV",
"Upload Book Files": "Kitob fayllarini yuklash",
"Sync now": "Hozir sinxronlash",
@@ -1546,33 +1536,8 @@
"Show password": "Parolni ko'rsatish",
"Root Directory": "Asosiy katalog",
"Syncing…": "Sinxronlanmoqda…",
"pulled progress for {{n}} book(s)": "{{n}} ta kitob jarayoni olindi",
"Sync History": "Sinxronlash tarixi",
"Clear Sync History": "Sinxronlash tarixini tozalash",
"No manual syncs yet": "Hali qo'lda sinxronlashlar yo'q",
"Partial": "Qisman",
"Cleanup": "Tozalash",
"Cleanup failed": "Tozalash muvaffaqiyatsiz",
"Sync failed": "Sinxronlash muvaffaqiyatsiz",
"{{n}} deleted": "{{n}} ta o'chirildi",
"{{n}} failed": "{{n}} ta xato",
"Nothing deleted": "Hech narsa o'chirilmadi",
"{{n}} downloaded": "{{n}} ta yuklab olindi",
"{{n}} uploaded": "{{n}} ta yuklandi",
"{{n}} progress": "{{n}} ta jarayon",
"Up to date": "Yangilangan",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Yuklab olingan kitoblar",
"Files uploaded": "Yuklangan fayllar",
"Configs uploaded": "Yuklangan konfiguratsiyalar",
"Configs downloaded": "Yuklab olingan konfiguratsiyalar",
"Covers uploaded": "Yuklangan muqovalar",
"Books deleted": "O'chirilgan kitoblar",
"Files in sync": "Sinxronlangan fayllar",
"Failures": "Xatolar",
"Total books": "Jami kitoblar",
"Error:": "Xato:",
"Failed books": "Xatolik kitoblar",
"Deleted {{n}} book(s) from server.": "Serverdan {{n}} ta kitob o'chirildi.",
"Failed to load directory": "Katalogni yuklab bo'lmadi",
"File download is only supported on the desktop and mobile apps.": "Fayllarni yuklab olish faqat ish stoli va mobil ilovalarda qo'llab-quvvatlanadi.",
@@ -1600,10 +1565,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "O'qiyotgan maqolangizni kutubxonangizga yuborish uchun Readest brauzer kengaytmasini o'rnating. Kengaytma sahifani brauzeringizdan kesib oladi, shu sababli pulli va kirish talab qiladigan saytlar ham ishlaydi.",
"Added to your library. It will sync to your other devices.": "Kutubxonangizga qo'shildi. Boshqa qurilmalaringizga sinxronlanadi.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Sinxronlash parol iborasi unutildi. Barcha shifrlangan maydonlar tozalandi.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Faqat qo'lda sinxronlashlar va tozalashlar. O'qish paytidagi avtomatik sinxronlashlar bu yerda qayd etilmaydi.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV serveridan {{n}} ta kitob o'chirilsinmi?\n\nBu faqat masofaviy fayllarni o'chiradi; mahalliy kutubxonangiz ta'sirlanmaydi. O'chirishni bekor qilib bo'lmaydi. Serverdagi ma'lumotlar mangulikka yo'qoladi.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Kitob fayllarini boshqa qurilmalaringizga yuklaydi.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Noto'g'ri sinxronlash parol iborasi. Sinxronlangan hisob ma'lumotlarini parolini ochib bo'lmadi.",
"Email books straight to your library": "Kitoblarni elektron pochta orqali to'g'ridan-to'g'ri kutubxonangizga yuboring",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Ilovalar va maqolalarni shaxsiy Readest manzilingizga yuboring. Plus, Pro va Lifetime tariflarida mavjud.",
@@ -1792,9 +1755,6 @@
"Also erase reading progress, notes, and bookmarks.": "Shuningdek, oʻqish jarayoni, eslatmalar va xatchoʻplarni ham oʻchiradi.",
"Background Image (Library)": "Fon rasmi (Kutubxona)",
"Background Image (Reader)": "Fon rasmi (Oʻqish koʻrinishi)",
"updated metadata for {{n}} book(s)": "{{n}} ta kitob metamaʼlumotlari yangilandi",
"{{n}} metadata": "{{n}} metamaʼlumot",
"Metadata updated": "Metamaʼlumotlar yangilandi",
"Filter": "Filtr",
"Sort by": "Saralash tartibi",
"Date modified": "Oʻzgartirilgan sana",
@@ -1838,8 +1798,6 @@
"Decrease Contrast": "Kontrastni kamaytirish",
"Reset Contrast": "Kontrastni tiklash",
"Increase Contrast": "Kontrastni oshirish",
"Google Drive session expired. Reconnect in Settings.": "Google Drive seansi muddati tugadi. Sozlamalardan qayta ulaning.",
"Cloud sync session expired. Reconnect in Settings.": "Bulutli sinxronlash seansi muddati tugadi. Sozlamalardan qayta ulaning.",
"Push": "Itarish",
"Slide": "Sirpanish",
"Page Curl": "Varaqlash",
@@ -1848,7 +1806,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Lugʻat natijalari matn oʻlchamini oʻqish koʻrinishidan mustaqil belgilaydi.",
"Authentication failed. Reconnect in Settings.": "Autentifikatsiya muvaffaqiyatsiz. Sozlamalardan qayta ulaning.",
"Full Sync": "Toʻliq sinxronlash",
"Re-check every book instead of only changed ones.": "Faqat oʻzgargan kitoblar emas, barcha kitoblarni qayta tekshirish.",
"Waiting for sign-in…": "Kirish kutilmoqda…",
"Reconnect": "Qayta ulanish",
"Connected as {{account}}": "{{account}} sifatida ulangan",
@@ -1873,17 +1830,13 @@
"Reading aloud continues in the background": "Ovoz chiqarib oʻqish fonda davom etadi",
"Stopped reading aloud": "Ovoz chiqarib oʻqish toʻxtatildi",
"Read aloud stopped": "Ovoz chiqarib oʻqish toʻxtadi",
"Synced via {{provider}} {{time}}": "{{provider}} orqali {{time}} sinxronlandi",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Kitoblar {{provider}} orqali sinxronlanadi - Readest Cloud xotirasi ishlatilmaydi",
"Cloud provider switched": "Bulut provayderi almashtirildi",
"Synced via {{provider}}": "{{provider}} orqali sinxronlandi",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} sinxronlash tanlangan paytda Readest Cloudga yuklashlar toʻxtatib turiladi",
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} sizning bulutli sinxronlash provayderingiz boʻlib turgan paytda u tomonidan boshqariladi",
"Not signed in": "Tizimga kirilmagan",
"Active — syncing your library on this device": "Faol — ushbu qurilmada kutubxonangiz sinxronlanmoqda",
"Paused — plan required": "Toʻxtatilgan — tarif reja kerak",
"Active · Book file uploads off": "Faol · Kitob fayllarini yuklash oʻchirilgan",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Kitob fayllarini boshqa qurilmalaringizga yuklaydi. Ushbu provayder tanlangan paytda Readest Cloudga yuklashlar toʻxtatib turiladi.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "WebDAV tanlangan paytda kitoblar, jarayon va belgilashlar faqat sizning serveringiz bilan sinxronlanadi.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Ilova sozlamalari, oʻqish statistikasi va lugʻatlar tizimga kirgan paytingizda Readest hisobingiz orqali sinxronlanishda davom etadi.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Google Drive tanlangan paytda kitoblar, jarayon va belgilashlar faqat sizning Drive bilan sinxronlanadi.",
@@ -1891,10 +1844,15 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Kutubxonangiz, oʻqish jarayoni va belgilashlaringizni Readest Cloud bilan sinxronlang.",
"Account and Storage": "Hisob va xotira",
"Manage your plan and stored files": "Tarif reja va saqlangan fayllarni boshqaring",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Ushbu qurilmada kutubxonangiz — kitoblar, jarayon, belgilashlar — qayerga sinxronlanishini tanlang. Ilova sozlamalari, oʻqish statistikasi va lugʻatlar tizimga kirgan paytingizda doim Readest hisobingiz bilan sinxronlanadi.",
"Cloud sync provider": "Bulutli sinxronlash provayderi",
"Use Readest Cloud": "Readest Clouddan foydalanish",
"Another device is still syncing this library via Readest Cloud": "Boshqa qurilma hali ham bu kutubxonani Readest Cloud orqali sinxronlamoqda",
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} ta yuklash muvaffaqiyatsiz: yetarli xotira kvotasi yoʻq",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} ta yuklash muvaffaqiyatsiz: yetarli xotira kvotasi yoʻq"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} ta yuklash muvaffaqiyatsiz: yetarli xotira kvotasi yoʻq",
"Library sync via {{provider}}": "Kutubxona {{provider}} orqali sinxronlashtiriladi",
"Google Drive session expired": "Google Drive seansi muddati tugadi",
"Cloud sync session expired": "Bulutli sinxronlash seansi muddati tugadi",
"Uploads book files to your other devices": "Kitob fayllarini boshqa qurilmalaringizga yuklaydi",
"Re-check every book instead of only changed ones": "Faqat o'zgarganlar o'rniga har bir kitobni qayta tekshirish",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "Đăng nhập với tên {{userDisplayName}}",
"Match Case": "Phân biệt chữ hoa/thường",
"Match Diacritics": "Phân biệt dấu",
"Match Whole Words": "Khớp toàn bộ từ",
"Maximum Number of Columns": "Số cột tối đa",
"Minimum Font Size": "Cỡ chữ tối thiểu",
"Monospace Font": "Phông chữ đơn cách",
@@ -579,8 +578,6 @@
"Advanced Settings": "Cài đặt nâng cao",
"File count: {{size}}": "Số lượng tệp: {{size}}",
"Background Read Aloud": "Đọc To Nền",
"Ready to read aloud": "Sẵn sàng để đọc to",
"Read Aloud": "Đọc To",
"Screen Brightness": "Độ sáng màn hình",
"Background Image": "Ảnh nền",
"Import Image": "Nhập ảnh",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "Xác thực WebDAV thất bại. Kết nối lại trong Cài đặt.",
"Downloading": "Đang tải",
"Uploading": "Đang tải lên",
"downloaded {{n}} book(s)": "đã tải {{n}} sách",
"pushed {{n}} config(s)": "đã đẩy {{n}} cấu hình",
"uploaded {{n}} new file(s)": "đã tải lên {{n}} tệp mới",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Đồng bộ kết thúc với {{failed}} lỗi. {{ok}} thành công.",
"Sync complete": "Đồng bộ hoàn tất",
"Everything is already up to date.": "Mọi thứ đã được cập nhật.",
"Browsing {{path}} on {{server}}": "Đang duyệt {{path}} trên {{server}}",
"Connect to a WebDAV server to browse your remote files.": "Kết nối với máy chủ WebDAV để duyệt các tệp từ xa của bạn.",
"WebDAV": "WebDAV",
"Upload Book Files": "Tải lên tệp sách",
"Sync now": "Đồng bộ ngay",
@@ -1517,33 +1507,8 @@
"Show password": "Hiện mật khẩu",
"Root Directory": "Thư mục gốc",
"Syncing…": "Đang đồng bộ…",
"pulled progress for {{n}} book(s)": "đã tải tiến độ cho {{n}} sách",
"Sync History": "Lịch sử đồng bộ",
"Clear Sync History": "Xóa lịch sử đồng bộ",
"No manual syncs yet": "Chưa có lần đồng bộ thủ công nào",
"Partial": "Một phần",
"Cleanup": "Dọn dẹp",
"Cleanup failed": "Dọn dẹp thất bại",
"Sync failed": "Đồng bộ thất bại",
"{{n}} deleted": "{{n}} đã xóa",
"{{n}} failed": "{{n}} lỗi",
"Nothing deleted": "Không xóa gì",
"{{n}} downloaded": "{{n}} đã tải",
"{{n}} uploaded": "{{n}} đã tải lên",
"{{n}} progress": "{{n}} tiến độ",
"Up to date": "Đã cập nhật",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "Sách đã tải",
"Files uploaded": "Tệp đã tải lên",
"Configs uploaded": "Cấu hình đã tải lên",
"Configs downloaded": "Cấu hình đã tải",
"Covers uploaded": "Bìa đã tải lên",
"Books deleted": "Sách đã xóa",
"Files in sync": "Tệp đồng bộ",
"Failures": "Lỗi",
"Total books": "Tổng số sách",
"Error:": "Lỗi:",
"Failed books": "Sách lỗi",
"Deleted {{n}} book(s) from server.": "Đã xóa {{n}} sách khỏi máy chủ.",
"Failed to load directory": "Không thể tải thư mục",
"File download is only supported on the desktop and mobile apps.": "Tải xuống tệp chỉ được hỗ trợ trên các ứng dụng máy tính và di động.",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Cài tiện ích trình duyệt Readest để gửi bài viết bạn đang đọc vào thư viện. Tiện ích cắt trang từ trình duyệt nên các trang trả phí hoặc yêu cầu đăng nhập vẫn hoạt động.",
"Added to your library. It will sync to your other devices.": "Đã thêm vào thư viện của bạn. Sẽ đồng bộ sang các thiết bị khác.",
"Sync passphrase forgotten. All encrypted fields cleared.": "Đã quên cụm mật khẩu đồng bộ. Tất cả các trường được mã hóa đã bị xóa.",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Chỉ đồng bộ thủ công và dọn dẹp. Các lần đồng bộ tự động khi đọc không được ghi tại đây.",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Xóa {{n}} sách khỏi máy chủ WebDAV?\n\nThao tác này chỉ xóa các tệp từ xa; thư viện cục bộ của bạn không bị ảnh hưởng. Không thể hoàn tác. Dữ liệu trên máy chủ sẽ mất vĩnh viễn.",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "Tải lên tệp sách đến các thiết bị khác của bạn.",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Cụm mật khẩu đồng bộ không đúng. Không thể giải mã thông tin xác thực đã đồng bộ.",
"Email books straight to your library": "Gửi sách qua email thẳng đến thư viện của bạn",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Chuyển tiếp tệp đính kèm và bài viết đến địa chỉ Readest riêng của bạn. Có sẵn trong các gói Plus, Pro và Lifetime.",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "Đồng thời xóa tiến độ đọc, ghi chú và dấu trang.",
"Background Image (Library)": "Ảnh nền (Thư viện)",
"Background Image (Reader)": "Ảnh nền (Trình đọc)",
"updated metadata for {{n}} book(s)": "đã cập nhật siêu dữ liệu cho {{n}} sách",
"{{n}} metadata": "{{n}} siêu dữ liệu",
"Metadata updated": "Đã cập nhật siêu dữ liệu",
"Filter": "Lọc",
"Sort by": "Sắp xếp theo",
"Date modified": "Ngày sửa đổi",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "Giảm tương phản",
"Reset Contrast": "Đặt lại tương phản",
"Increase Contrast": "Tăng tương phản",
"Google Drive session expired. Reconnect in Settings.": "Phiên Google Drive đã hết hạn. Kết nối lại trong Cài đặt.",
"Cloud sync session expired. Reconnect in Settings.": "Phiên đồng bộ đám mây đã hết hạn. Kết nối lại trong Cài đặt.",
"Push": "Đẩy",
"Slide": "Trượt",
"Page Curl": "Lật giấy",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "Đặt cỡ chữ của kết quả từ điển, không phụ thuộc vào chế độ xem đọc.",
"Authentication failed. Reconnect in Settings.": "Xác thực thất bại. Kết nối lại trong Cài đặt.",
"Full Sync": "Đồng bộ đầy đủ",
"Re-check every book instead of only changed ones.": "Kiểm tra lại mọi cuốn sách thay vì chỉ những cuốn đã thay đổi.",
"Waiting for sign-in…": "Đang chờ đăng nhập…",
"Reconnect": "Kết nối lại",
"Connected as {{account}}": "Đã kết nối với tư cách {{account}}",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "Đọc to tiếp tục chạy trong nền",
"Stopped reading aloud": "Đã dừng đọc to",
"Read aloud stopped": "Đọc to đã dừng",
"Synced via {{provider}} {{time}}": "Đã đồng bộ qua {{provider}} {{time}}",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "Sách đồng bộ qua {{provider}} - không sử dụng bộ nhớ Readest Cloud",
"Cloud provider switched": "Đã chuyển nhà cung cấp đám mây",
"Synced via {{provider}}": "Đã đồng bộ qua {{provider}}",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Tải lên Readest Cloud tạm dừng khi đồng bộ {{provider}} đang được chọn",
"Managed by {{provider}} while it is your cloud sync provider": "Do {{provider}} quản lý khi nó là nhà cung cấp đồng bộ đám mây của bạn",
"Not signed in": "Chưa đăng nhập",
"Active — syncing your library on this device": "Đang hoạt động — đang đồng bộ thư viện của bạn trên thiết bị này",
"Paused — plan required": "Tạm dừng — cần gói đăng ký",
"Active · Book file uploads off": "Đang hoạt động · Tải lên tệp sách đang tắt",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "Tải lên tệp sách đến các thiết bị khác của bạn. Tải lên Readest Cloud tạm dừng khi nhà cung cấp này đang được chọn.",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "Khi WebDAV được chọn, sách, tiến trình và điểm nổi bật chỉ đồng bộ với máy chủ của bạn.",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Cài đặt ứng dụng, thống kê đọc và từ điển vẫn đồng bộ qua tài khoản Readest của bạn khi bạn đã đăng nhập.",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "Khi Google Drive được chọn, sách, tiến trình và điểm nổi bật chỉ đồng bộ với Drive của bạn.",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "Đồng bộ thư viện, tiến trình đọc và điểm nổi bật của bạn với Readest Cloud.",
"Account and Storage": "Tài khoản và lưu trữ",
"Manage your plan and stored files": "Quản lý gói đăng ký và tệp đã lưu của bạn",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "Chọn nơi thư viện của bạn — sách, tiến trình, điểm nổi bật — đồng bộ trên thiết bị này. Cài đặt ứng dụng, thống kê đọc và từ điển luôn đồng bộ với tài khoản Readest của bạn khi bạn đã đăng nhập.",
"Cloud sync provider": "Nhà cung cấp đồng bộ đám mây",
"Use Readest Cloud": "Dùng Readest Cloud",
"Another device is still syncing this library via Readest Cloud": "Một thiết bị khác vẫn đang đồng bộ thư viện này qua Readest Cloud",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} lượt tải lên thất bại: không đủ lượng lưu trữ"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} lượt tải lên thất bại: không đủ lượng lưu trữ",
"Library sync via {{provider}}": "Đồng bộ thư viện qua {{provider}}",
"Google Drive session expired": "Phiên Google Drive đã hết hạn",
"Cloud sync session expired": "Phiên đồng bộ đám mây đã hết hạn",
"Uploads book files to your other devices": "Tải tệp sách lên các thiết bị khác của bạn",
"Re-check every book instead of only changed ones": "Kiểm tra lại mọi cuốn sách thay vì chỉ những cuốn đã thay đổi",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "{{userDisplayName}} 已登录",
"Match Case": "匹配大小写",
"Match Diacritics": "匹配重音符号",
"Match Whole Words": "匹配整个单词",
"Maximum Number of Columns": "分栏数",
"Minimum Font Size": "最小字号",
"Monospace Font": "等宽字体",
@@ -580,8 +579,6 @@
"Advanced Settings": "高级设置",
"File count: {{size}}": "文件数量: {{size}}",
"Background Read Aloud": "后台语音朗读",
"Ready to read aloud": "语音朗读已就绪",
"Read Aloud": "语音朗读",
"Screen Brightness": "屏幕亮度",
"Background Image": "背景图片",
"Import Image": "导入图片",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 认证失败。请在设置中重新连接。",
"Downloading": "正在下载",
"Uploading": "正在上传",
"downloaded {{n}} book(s)": "已下载 {{n}} 本书",
"pushed {{n}} config(s)": "已推送 {{n}} 项配置",
"uploaded {{n}} new file(s)": "已上传 {{n}} 个新文件",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "同步完成,{{failed}} 项失败,{{ok}} 项成功。",
"Sync complete": "同步完成",
"Everything is already up to date.": "一切均已是最新。",
"Browsing {{path}} on {{server}}": "正在浏览 {{server}} 上的 {{path}}",
"Connect to a WebDAV server to browse your remote files.": "连接到 WebDAV 服务器以浏览您的远程文件。",
"WebDAV": "WebDAV",
"Upload Book Files": "上传书籍文件",
"Sync now": "立即同步",
@@ -1517,33 +1507,8 @@
"Show password": "显示密码",
"Root Directory": "根目录",
"Syncing…": "正在同步…",
"pulled progress for {{n}} book(s)": "已拉取 {{n}} 本书的进度",
"Sync History": "同步历史",
"Clear Sync History": "清除同步历史",
"No manual syncs yet": "暂无手动同步记录",
"Partial": "部分",
"Cleanup": "清理",
"Cleanup failed": "清理失败",
"Sync failed": "同步失败",
"{{n}} deleted": "已删除 {{n}}",
"{{n}} failed": "{{n}} 失败",
"Nothing deleted": "未删除任何项",
"{{n}} downloaded": "已下载 {{n}}",
"{{n}} uploaded": "已上传 {{n}}",
"{{n}} progress": "{{n}} 进度",
"Up to date": "已是最新",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "已下载书籍",
"Files uploaded": "已上传文件",
"Configs uploaded": "已上传配置",
"Configs downloaded": "已下载配置",
"Covers uploaded": "已上传封面",
"Books deleted": "已删除书籍",
"Files in sync": "已同步文件",
"Failures": "失败项",
"Total books": "书籍总数",
"Error:": "错误:",
"Failed books": "失败的书籍",
"Deleted {{n}} book(s) from server.": "已从服务器删除 {{n}} 本书。",
"Failed to load directory": "加载目录失败",
"File download is only supported on the desktop and mobile apps.": "文件下载仅在桌面端和移动端应用中支持。",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "安装 Readest 浏览器扩展,将正在阅读的文章发送到您的书库。扩展从浏览器抓取页面,因此付费墙和需要登录的网站也可用。",
"Added to your library. It will sync to your other devices.": "已添加到您的书库。将同步到您的其他设备。",
"Sync passphrase forgotten. All encrypted fields cleared.": "已忘记同步密码短语。所有加密字段已清空。",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "仅显示手动同步与清理。阅读时的自动同步不在此记录。",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "从 WebDAV 服务器删除 {{n}} 本书?\n\n这只会移除远程文件;您的本地书库不受影响。删除无法撤销。服务器上的数据将永久消失。",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "将书籍文件上传到您的其他设备。",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "同步密码短语错误。无法解密已同步的凭据。",
"Email books straight to your library": "通过电子邮件直接将书籍发送到您的书库",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "将附件和文章转发到您的专属 Readest 地址。Plus、Pro 和 Lifetime 套餐可用。",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "同时清除阅读进度、笔记和书签。",
"Background Image (Library)": "背景图片(书库)",
"Background Image (Reader)": "背景图片(阅读界面)",
"updated metadata for {{n}} book(s)": "已更新 {{n}} 本书的元数据",
"{{n}} metadata": "{{n}} 元数据",
"Metadata updated": "已更新元数据",
"Filter": "筛选",
"Sort by": "排序方式",
"Date modified": "修改日期",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "降低对比度",
"Reset Contrast": "重置对比度",
"Increase Contrast": "提高对比度",
"Google Drive session expired. Reconnect in Settings.": "Google Drive 会话已过期。请在设置中重新连接。",
"Cloud sync session expired. Reconnect in Settings.": "云同步会话已过期。请在设置中重新连接。",
"Push": "平移",
"Slide": "覆盖",
"Page Curl": "仿真",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "设置词典结果的文字大小,与阅读界面相互独立。",
"Authentication failed. Reconnect in Settings.": "认证失败。请在设置中重新连接。",
"Full Sync": "完全同步",
"Re-check every book instead of only changed ones.": "重新检查所有书籍,而不仅是有变动的书籍。",
"Waiting for sign-in…": "等待登录…",
"Reconnect": "重新连接",
"Connected as {{account}}": "已以 {{account}} 身份连接",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "语音朗读在后台继续",
"Stopped reading aloud": "已停止语音朗读",
"Read aloud stopped": "语音朗读已停止",
"Synced via {{provider}} {{time}}": "{{time}}通过 {{provider}} 同步",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "书籍通过 {{provider}} 同步 - 不使用 Readest 云存储",
"Cloud provider switched": "云服务提供方已切换",
"Synced via {{provider}}": "已通过 {{provider}} 同步",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "选择 {{provider}} 同步期间,上传到 Readest 云端已暂停",
"Managed by {{provider}} while it is your cloud sync provider": "当 {{provider}} 是您的云同步提供方时由其管理",
"Not signed in": "未登录",
"Active — syncing your library on this device": "已启用 — 正在此设备上同步您的书库",
"Paused — plan required": "已暂停 — 需要订阅方案",
"Active · Book file uploads off": "已启用 · 书籍文件上传已关闭",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "将书籍文件上传到您的其他设备。选择此提供方期间,上传到 Readest 云端将暂停。",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "选择 WebDAV 期间,书籍、进度和高亮仅与您的服务器同步。",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "登录期间,应用设置、阅读统计和词典仍会通过您的 Readest 账户同步。",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "选择 Google Drive 期间,书籍、进度和高亮仅与您的 Drive 同步。",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "将您的书库、阅读进度和高亮与 Readest 云端同步。",
"Account and Storage": "账户与存储",
"Manage your plan and stored files": "管理您的订阅方案和已存储的文件",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "选择此设备上书库(书籍、进度、高亮)的同步位置。登录期间,应用设置、阅读统计和词典始终与您的 Readest 账户同步。",
"Cloud sync provider": "云同步提供方",
"Use Readest Cloud": "使用 Readest 云端",
"Another device is still syncing this library via Readest Cloud": "另一台设备仍在通过 Readest 云端同步此书库",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 个上传失败:云存储空间不足"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 个上传失败:云存储空间不足",
"Library sync via {{provider}}": "通过 {{provider}} 同步书库",
"Google Drive session expired": "Google Drive 会话已过期",
"Cloud sync session expired": "云同步会话已过期",
"Uploads book files to your other devices": "将书籍文件上传到您的其他设备",
"Re-check every book instead of only changed ones": "重新检查每一本书,而不仅仅是已更改的书",
"KOReader": "KOReader"
}
@@ -54,7 +54,6 @@
"Logged in as {{userDisplayName}}": "{{userDisplayName}} 已登入",
"Match Case": "匹配大小寫",
"Match Diacritics": "匹配重音符號",
"Match Whole Words": "匹配整個單詞",
"Maximum Number of Columns": "分欄數",
"Minimum Font Size": "最小字號",
"Monospace Font": "等寬字體",
@@ -579,8 +578,6 @@
"Advanced Settings": "高級設置",
"File count: {{size}}": "文件數量: {{size}}",
"Background Read Aloud": "背景朗讀",
"Ready to read aloud": "朗讀準備就緒",
"Read Aloud": "朗讀",
"Screen Brightness": "螢幕亮度",
"Background Image": "背景圖片",
"Import Image": "匯入圖片",
@@ -1502,14 +1499,7 @@
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 驗證失敗。請在設定中重新連線。",
"Downloading": "正在下載",
"Uploading": "正在上傳",
"downloaded {{n}} book(s)": "已下載 {{n}} 本書",
"pushed {{n}} config(s)": "已推送 {{n}} 項設定",
"uploaded {{n}} new file(s)": "已上傳 {{n}} 個新檔案",
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "同步完成,{{failed}} 項失敗,{{ok}} 項成功。",
"Sync complete": "同步完成",
"Everything is already up to date.": "一切均已是最新。",
"Browsing {{path}} on {{server}}": "正在瀏覽 {{server}} 上的 {{path}}",
"Connect to a WebDAV server to browse your remote files.": "連線到 WebDAV 伺服器以瀏覽您的遠端檔案。",
"WebDAV": "WebDAV",
"Upload Book Files": "上傳書籍檔案",
"Sync now": "立即同步",
@@ -1517,33 +1507,8 @@
"Show password": "顯示密碼",
"Root Directory": "根目錄",
"Syncing…": "正在同步…",
"pulled progress for {{n}} book(s)": "已拉取 {{n}} 本書的進度",
"Sync History": "同步歷史",
"Clear Sync History": "清除同步歷史",
"No manual syncs yet": "尚無手動同步記錄",
"Partial": "部分",
"Cleanup": "清理",
"Cleanup failed": "清理失敗",
"Sync failed": "同步失敗",
"{{n}} deleted": "已刪除 {{n}}",
"{{n}} failed": "{{n}} 失敗",
"Nothing deleted": "未刪除任何項目",
"{{n}} downloaded": "已下載 {{n}}",
"{{n}} uploaded": "已上傳 {{n}}",
"{{n}} progress": "{{n}} 進度",
"Up to date": "已是最新",
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
"Books downloaded": "已下載書籍",
"Files uploaded": "已上傳檔案",
"Configs uploaded": "已上傳設定",
"Configs downloaded": "已下載設定",
"Covers uploaded": "已上傳封面",
"Books deleted": "已刪除書籍",
"Files in sync": "已同步檔案",
"Failures": "失敗項目",
"Total books": "書籍總數",
"Error:": "錯誤:",
"Failed books": "失敗的書籍",
"Deleted {{n}} book(s) from server.": "已從伺服器刪除 {{n}} 本書。",
"Failed to load directory": "載入目錄失敗",
"File download is only supported on the desktop and mobile apps.": "檔案下載僅在桌面端和行動端應用程式中支援。",
@@ -1570,10 +1535,8 @@
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "安裝 Readest 瀏覽器擴充功能,將正在閱讀的文章傳送到您的書庫。擴充功能會從您的瀏覽器擷取頁面,因此付費牆和需要登入的網站也能使用。",
"Added to your library. It will sync to your other devices.": "已加入您的書庫。將同步到您的其他裝置。",
"Sync passphrase forgotten. All encrypted fields cleared.": "已忘記同步密碼短語。所有加密欄位已清空。",
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "僅顯示手動同步與清理。閱讀時的自動同步不在此記錄。",
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "從 WebDAV 伺服器刪除 {{n}} 本書?\n\n這只會移除遠端檔案;您的本機書庫不受影響。刪除無法復原。伺服器上的資料將永久消失。",
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
"Uploads book files to your other devices.": "將書籍檔案上傳到您的其他裝置。",
"Wrong sync passphrase. Synced credentials could not be decrypted.": "同步密碼短語錯誤。無法解密已同步的憑證。",
"Email books straight to your library": "透過電子郵件直接將書籍傳送到您的書庫",
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "將附件和文章轉寄到您的專屬 Readest 地址。Plus、Pro 和 Lifetime 方案可用。",
@@ -1759,9 +1722,6 @@
"Also erase reading progress, notes, and bookmarks.": "同時清除閱讀進度、筆記和書籤。",
"Background Image (Library)": "背景圖片(書庫)",
"Background Image (Reader)": "背景圖片(閱讀介面)",
"updated metadata for {{n}} book(s)": "已更新 {{n}} 本書的中繼資料",
"{{n}} metadata": "{{n}} 中繼資料",
"Metadata updated": "已更新中繼資料",
"Filter": "篩選",
"Sort by": "排序方式",
"Date modified": "修改日期",
@@ -1804,8 +1764,6 @@
"Decrease Contrast": "降低對比度",
"Reset Contrast": "重設對比度",
"Increase Contrast": "提高對比度",
"Google Drive session expired. Reconnect in Settings.": "Google Drive 工作階段已過期。請在設定中重新連線。",
"Cloud sync session expired. Reconnect in Settings.": "雲同步工作階段已過期。請在設定中重新連線。",
"Push": "平移",
"Slide": "覆蓋",
"Page Curl": "擬真",
@@ -1814,7 +1772,6 @@
"Sets the text size of dictionary results, independent of the reading view.": "設定詞典結果的文字大小,與閱讀介面相互獨立。",
"Authentication failed. Reconnect in Settings.": "驗證失敗。請在設定中重新連線。",
"Full Sync": "完全同步",
"Re-check every book instead of only changed ones.": "重新檢查所有書籍,而不僅是有變動的書籍。",
"Waiting for sign-in…": "等待登入…",
"Reconnect": "重新連線",
"Connected as {{account}}": "已以 {{account}} 身分連線",
@@ -1839,17 +1796,13 @@
"Reading aloud continues in the background": "朗讀將在背景繼續",
"Stopped reading aloud": "已停止朗讀",
"Read aloud stopped": "朗讀已停止",
"Synced via {{provider}} {{time}}": "{{time}}透過 {{provider}} 同步",
"Books sync via {{provider}} - Readest Cloud storage isn't used": "書籍透過 {{provider}} 同步 - 不使用 Readest 雲端儲存",
"Cloud provider switched": "雲端服務提供方已切換",
"Synced via {{provider}}": "已透過 {{provider}} 同步",
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "選擇 {{provider}} 同步期間,上傳到 Readest 雲端已暫停",
"Managed by {{provider}} while it is your cloud sync provider": "當 {{provider}} 是您的雲端同步提供方時由其管理",
"Not signed in": "未登入",
"Active — syncing your library on this device": "已啟用 — 正在此裝置上同步您的書庫",
"Paused — plan required": "已暫停 — 需要訂閱方案",
"Active · Book file uploads off": "已啟用 · 書籍檔案上傳已關閉",
"Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.": "將書籍檔案上傳到您的其他裝置。選擇此提供方期間,上傳到 Readest 雲端將暫停。",
"While WebDAV is selected, books, progress, and annotations sync only to your server.": "選擇 WebDAV 期間,書籍、進度和高亮僅與您的伺服器同步。",
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "登入期間,應用程式設定、閱讀統計和詞典仍會透過您的 Readest 帳戶同步。",
"While Google Drive is selected, books, progress, and annotations sync only to your Drive.": "選擇 Google Drive 期間,書籍、進度和高亮僅與您的 Drive 同步。",
@@ -1857,9 +1810,14 @@
"Sync your library, reading progress, and highlights with Readest Cloud.": "將您的書庫、閱讀進度和高亮與 Readest 雲端同步。",
"Account and Storage": "帳戶與儲存",
"Manage your plan and stored files": "管理您的訂閱方案和已儲存的檔案",
"Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.": "選擇此裝置上書庫(書籍、進度、高亮)的同步位置。登入期間,應用程式設定、閱讀統計和詞典始終與您的 Readest 帳戶同步。",
"Cloud sync provider": "雲端同步提供方",
"Use Readest Cloud": "使用 Readest 雲端",
"Another device is still syncing this library via Readest Cloud": "另一台裝置仍在透過 Readest 雲端同步此書庫",
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 個上傳失敗:雲存儲空間不足"
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 個上傳失敗:雲存儲空間不足",
"Library sync via {{provider}}": "透過 {{provider}} 同步書庫",
"Google Drive session expired": "Google Drive 工作階段已過期",
"Cloud sync session expired": "雲端同步工作階段已過期",
"Uploads book files to your other devices": "將書籍檔案上傳到您的其他裝置",
"Re-check every book instead of only changed ones": "重新檢查每一本書,而非僅限已變更的",
"KOReader": "KOReader"
}
@@ -0,0 +1,28 @@
import { describe, expect, it } from 'vitest';
import { remoteProgressApplied } from '@/app/reader/hooks/useFileSync';
// Parity with the native cloud sync (useProgressSync): pulling a config whose
// merged reading position came from the remote must surface the same
// top-right "Reading Progress Synced" hint for WebDAV / Google Drive.
describe('remoteProgressApplied', () => {
const local = 'epubcfi(/6/4!/4/2/2:0)';
const remote = 'epubcfi(/6/8!/4/2/2:0)';
it('is true when the merged location differs from the local one', () => {
expect(remoteProgressApplied(local, remote)).toBe(true);
});
it('is true when this device had no position yet', () => {
expect(remoteProgressApplied(undefined, remote)).toBe(true);
expect(remoteProgressApplied(null, remote)).toBe(true);
});
it('is false when the merge kept the local position', () => {
expect(remoteProgressApplied(local, local)).toBe(false);
});
it('is false when the pull produced no location', () => {
expect(remoteProgressApplied(local, undefined)).toBe(false);
expect(remoteProgressApplied(local, null)).toBe(false);
});
});
@@ -22,7 +22,7 @@ describe('getReadestCloudRowStatus', () => {
test('active when signed in and selected', () => {
expect(
getReadestCloudRowStatus(_, { signedIn: true, planLoading: false, selected: true }),
).toBe('Active — syncing your library on this device');
).toBe('Active');
});
test('available when a third-party provider is selected instead', () => {
@@ -70,6 +70,6 @@ describe('getThirdPartyRowStatus', () => {
});
test('healthy active state', () => {
expect(getThirdPartyRowStatus(_, base)).toBe('Active — syncing your library on this device');
expect(getThirdPartyRowStatus(_, base)).toBe('Active');
});
});
@@ -209,8 +209,10 @@ describe('FileSyncEngine.syncLibrary — deletion propagation (#4860)', () => {
});
const store = fakeStore();
// Local library only has h1; it has never seen h2.
await new FileSyncEngine(provider, store).syncLibrary([makeBook('h1', { updatedAt: 100 })], {
// Local library only has h1; it has never seen h2. h1 is locally newer so
// the run is dirty and the index gets re-pushed — the union must carry
// h2's tombstone even though this device never materialised the book.
await new FileSyncEngine(provider, store).syncLibrary([makeBook('h1', { updatedAt: 200 })], {
strategy: 'silent',
syncBooks: false,
deviceId: 'd',
@@ -146,6 +146,65 @@ describe('FileSyncEngine.syncLibrary — remote discovery + streaming download',
});
});
// The explicit per-book Download action (Book Details / bookshelf cloud
// button) routed to a third-party provider: fetch the binary from the hash
// dir (filename resolved by listing — titles go stale), plus cover + config
// best-effort.
describe('FileSyncEngine.downloadBookFile', () => {
const hashDirListing = (withFile: boolean) => async (p: string) => {
if (!p.endsWith('/books/h1')) return [];
const entries = [
{ name: 'config.json', path: '/Readest/books/h1/config.json', isDirectory: false, size: 1 },
{ name: 'cover.png', path: '/Readest/books/h1/cover.png', isDirectory: false, size: 2 },
];
if (withFile)
entries.push({
name: 'B.epub',
path: '/Readest/books/h1/B.epub',
isDirectory: false,
size: 9,
});
return entries;
};
test('downloads the book file into the local store', async () => {
const saveBookFile = vi.fn(async () => {});
const provider = fakeProvider({
list: hashDirListing(true),
readBinary: async () => new ArrayBuffer(9),
});
const store = fakeStore({ saveBookFile });
const ok = await new FileSyncEngine(provider, store).downloadBookFile(makeBook('h1'));
expect(ok).toBe(true);
expect(saveBookFile).toHaveBeenCalledTimes(1);
});
test('returns false when the remote holds no book file', async () => {
const saveBookFile = vi.fn(async () => {});
const provider = fakeProvider({ list: hashDirListing(false) });
const store = fakeStore({ saveBookFile });
const ok = await new FileSyncEngine(provider, store).downloadBookFile(makeBook('h1'));
expect(ok).toBe(false);
expect(saveBookFile).not.toHaveBeenCalled();
});
test('prefers the streaming downloader when available', async () => {
const downloadStream = vi.fn(async () => true);
const prepareLocalBookPath = vi.fn(async () => '/local/h1/B.epub');
const provider = fakeProvider({ list: hashDirListing(true), downloadStream });
const store = fakeStore({ prepareLocalBookPath });
const ok = await new FileSyncEngine(provider, store).downloadBookFile(makeBook('h1'));
expect(ok).toBe(true);
expect(downloadStream).toHaveBeenCalledWith('/Readest/books/h1/B.epub', '/local/h1/B.epub');
});
});
describe('FileSyncEngine.syncLibrary — receive strategy is pull-only', () => {
test('never writes (no config push, no index re-push) under receive', async () => {
const captured: Captured = { writes: [] };
@@ -209,8 +268,10 @@ describe('FileSyncEngine.syncLibrary — incremental diff (default)', () => {
expect(configWrites(captured)).toHaveLength(0);
expect(res.configsUploaded).toBe(0);
expect(res.booksSynced).toBe(0);
// The index itself is still re-pushed.
expect(captured.writes.some((w) => w.path.endsWith('library.json'))).toBe(true);
// Nothing changed, so the byte-identical index is NOT re-pushed — a
// restamped copy would only churn the remote and defeat every other
// device's change detection.
expect(captured.writes.some((w) => w.path.endsWith('library.json'))).toBe(false);
});
test('pushes a book that is newer locally than the index', async () => {
@@ -356,6 +417,64 @@ describe('FileSyncEngine.syncLibrary — incremental diff (default)', () => {
expect(idx.uploadedHashes).toContain('h1');
});
// A device that holds no local copy of a book (e.g. web with a cloud-only
// library) can never upload it, so the remote probe buys nothing — and at
// library scale it is a full per-book request storm on every sync. The
// no-source verdict must be reached from local state alone, with zero
// remote traffic; the device that does hold the bytes uploads and records.
test('spends no remote request on a no-source book', async () => {
const captured: Captured = { writes: [] };
const head = vi.fn(async () => ({ size: 10 }));
const provider = fakeProvider({
readText: async (p) =>
p.endsWith('library.json')
? JSON.stringify(makeIndex([makeBook('h1', { updatedAt: 100 })]))
: null,
head,
captured,
});
const store = fakeStore({
loadConfig: async () => ({ updatedAt: 1, booknotes: [] }),
loadBookFile: async () => null, // no local copy on this device
});
const res = await new FileSyncEngine(provider, store).syncLibrary(
[makeBook('h1', { updatedAt: 100 })],
{ strategy: 'silent', syncBooks: true, deviceId: 'd' },
);
expect(head).not.toHaveBeenCalledWith(expect.stringContaining('/books/'));
expect(res.filesUploaded).toBe(0);
// Nothing recorded and nothing changed: the index is not re-pushed.
expect(captured.writes.some((w) => w.path.endsWith('library.json'))).toBe(false);
});
test('leaves a no-source book unrecorded when the remote lacks it too', async () => {
const captured: Captured = { writes: [] };
const provider = fakeProvider({
readText: async (p) =>
p.endsWith('library.json')
? JSON.stringify(makeIndex([makeBook('h1', { updatedAt: 100 })]))
: null,
head: async () => null, // not on the remote either
captured,
});
const store = fakeStore({
loadConfig: async () => ({ updatedAt: 1, booknotes: [] }),
loadBookFile: async () => null, // no local copy on this device
});
await new FileSyncEngine(provider, store).syncLibrary([makeBook('h1', { updatedAt: 100 })], {
strategy: 'silent',
syncBooks: true,
deviceId: 'd',
});
// A device that does have the file must still be able to upload and
// record it later: nothing was recorded (no index write at all).
expect(captured.writes.some((w) => w.path.endsWith('library.json'))).toBe(false);
});
// #4856 perf: once a file is recorded in the index, an incremental sync must
// NOT HEAD-probe it again — the steady state stays O(changed), not O(library).
test('does not probe an already-recorded file (stays O(changed))', async () => {
@@ -380,17 +499,14 @@ describe('FileSyncEngine.syncLibrary — incremental diff (default)', () => {
{ strategy: 'silent', syncBooks: true, deviceId: 'd' },
);
// No file work at all: no HEAD probe, no bytes read, no upload.
expect(head).not.toHaveBeenCalled();
// No file work at all: no HEAD probe on the book, no bytes read, no upload.
expect(head).not.toHaveBeenCalledWith(expect.stringContaining('/books/'));
expect(loadBookFile).not.toHaveBeenCalled();
expect(res.filesUploaded).toBe(0);
expect(res.filesAlreadyInSync).toBe(0);
expect(res.booksSynced).toBe(0);
// The recorded hash is preserved across the re-push.
const idx = JSON.parse(
captured.writes.find((w) => w.path.endsWith('library.json'))!.body,
) as RemoteLibraryIndex;
expect(idx.uploadedHashes).toContain('h1');
// Nothing changed, so the index (and its record) is left untouched.
expect(captured.writes.some((w) => w.path.endsWith('library.json'))).toBe(false);
});
test('fullSync re-probes a recorded file (drift escape hatch)', async () => {
@@ -490,3 +606,188 @@ describe('FileSyncEngine.syncLibrary — bounded concurrency', () => {
expect(maxInFlight).toBe(1);
});
});
// The idle-run request budget: a sync where nothing changed on either side
// must cost ONE metadata stat — no index download, no discovery listing, no
// index re-push. The remote etag (Drive md5 / WebDAV ETag) is the change
// signal: every peer mutation rewrites library.json, so an unchanged etag
// means no remote-side news. The cache is keyed on the (memoised) provider,
// so it survives across engine builds within a session.
describe('FileSyncEngine.syncLibrary — remote change detection', () => {
const opts = { strategy: 'silent', syncBooks: false, deviceId: 'd' } as const;
const indexWrites = (captured: Captured) =>
captured.writes.filter((w) => w.path.endsWith('library.json'));
const makeChangeProbeHarness = (etagOf: () => string) => {
const captured: Captured = { writes: [] };
const readText = vi.fn(async (p: string) =>
p.endsWith('library.json')
? JSON.stringify(makeIndex([makeBook('h1', { updatedAt: 100 })]))
: null,
);
const head = vi.fn(async (p: string) =>
p.endsWith('library.json') ? { etag: etagOf() } : null,
);
const list = vi.fn(async () => []);
const provider = fakeProvider({ readText, head, list, captured });
const store = fakeStore({ loadConfig: async () => ({ updatedAt: 1, booknotes: [] }) });
return { captured, readText, head, list, provider, store };
};
test('an unchanged remote index short-circuits: no pull, no discovery, no push', async () => {
const h = makeChangeProbeHarness(() => 'E1');
await new FileSyncEngine(h.provider, h.store).syncLibrary(
[makeBook('h1', { updatedAt: 100 })],
opts,
);
expect(h.readText).toHaveBeenCalledTimes(1); // first run pulls
expect(h.list).toHaveBeenCalled(); // and discovers
h.readText.mockClear();
h.list.mockClear();
// Fresh engine, same provider — mirrors one engine build per sync run.
await new FileSyncEngine(h.provider, h.store).syncLibrary(
[makeBook('h1', { updatedAt: 100 })],
opts,
);
expect(h.readText).not.toHaveBeenCalled();
expect(h.list).not.toHaveBeenCalled();
expect(indexWrites(h.captured)).toHaveLength(0); // clean on both runs
});
test('a local change under an unchanged remote index pushes without re-pulling', async () => {
const h = makeChangeProbeHarness(() => 'E1');
await new FileSyncEngine(h.provider, h.store).syncLibrary(
[makeBook('h1', { updatedAt: 100 })],
opts,
);
await new FileSyncEngine(h.provider, h.store).syncLibrary(
[makeBook('h1', { updatedAt: 200 })],
opts,
);
// The index itself was never re-pulled (the push loop's config pull-merge
// reads config.json, which also goes through readText).
const libraryReads = h.readText.mock.calls.filter((c) => String(c[0]).endsWith('library.json'));
expect(libraryReads).toHaveLength(1);
expect(configWrites(h.captured)).toHaveLength(1);
expect(indexWrites(h.captured)).toHaveLength(1);
});
test('a changed remote etag re-pulls the index', async () => {
let etag = 'E1';
const h = makeChangeProbeHarness(() => etag);
await new FileSyncEngine(h.provider, h.store).syncLibrary(
[makeBook('h1', { updatedAt: 100 })],
opts,
);
etag = 'E2';
await new FileSyncEngine(h.provider, h.store).syncLibrary(
[makeBook('h1', { updatedAt: 100 })],
opts,
);
expect(h.readText).toHaveBeenCalledTimes(2);
});
test('a local tombstone missing from the remote index still pushes the index', async () => {
const h = makeChangeProbeHarness(() => 'E1');
await new FileSyncEngine(h.provider, h.store).syncLibrary(
[makeBook('h1', { updatedAt: 100, deletedAt: 150 })],
opts,
);
// No per-book counters fire for a tombstone, but the index MUST publish it.
const idx = JSON.parse(indexWrites(h.captured)[0]!.body) as RemoteLibraryIndex;
expect(idx.books.find((b) => b.hash === 'h1')?.deletedAt).toBe(150);
});
});
// File-less hash dirs (config/cover only — legacy junk or peers that sync
// without "Upload Book Files") used to be re-listed by discovery on every
// run, forever. They are now recorded in the index once inspected and only
// re-checked when the index says their file arrived (uploadedHashes), or on
// a Full Sync.
describe('FileSyncEngine.syncLibrary — empty-dir record', () => {
const opts = { strategy: 'silent', syncBooks: false, deviceId: 'd' } as const;
const orphanListing = (withFile: boolean) => async (p: string) => {
if (p.endsWith('/books')) return [{ name: 'h9', path: '/Readest/books/h9', isDirectory: true }];
const entries = [
{ name: 'config.json', path: '/Readest/books/h9/config.json', isDirectory: false, size: 1 },
];
if (withFile)
entries.push({
name: 'B.epub',
path: '/Readest/books/h9/B.epub',
isDirectory: false,
size: 9,
});
return entries;
};
test('records an inspected file-less dir in the index', async () => {
const captured: Captured = { writes: [] };
const provider = fakeProvider({
readText: async (p) =>
p.endsWith('library.json')
? JSON.stringify(makeIndex([makeBook('h9', { updatedAt: 100 })]))
: null,
list: orphanListing(false),
captured,
});
const res = await new FileSyncEngine(provider, fakeStore()).syncLibrary([], opts);
expect(res.booksDownloaded).toBe(0);
const idx = JSON.parse(
captured.writes.find((w) => w.path.endsWith('library.json'))!.body,
) as RemoteLibraryIndex;
expect(idx.emptyDirs).toContain('h9');
});
test('skips a recorded file-less dir on the next discovery', async () => {
const captured: Captured = { writes: [] };
const list = vi.fn(orphanListing(false));
const provider = fakeProvider({
readText: async (p) =>
p.endsWith('library.json')
? JSON.stringify({
...makeIndex([makeBook('h9', { updatedAt: 100 })]),
emptyDirs: ['h9'],
})
: null,
list,
captured,
});
await new FileSyncEngine(provider, fakeStore()).syncLibrary([], opts);
expect(list).toHaveBeenCalledWith(expect.stringContaining('/books'));
expect(list).not.toHaveBeenCalledWith('/Readest/books/h9');
// Nothing changed — the record survives by NOT re-pushing the index.
expect(captured.writes.some((w) => w.path.endsWith('library.json'))).toBe(false);
});
test('re-inspects a recorded dir once the index says its file arrived', async () => {
const captured: Captured = { writes: [] };
const provider = fakeProvider({
readText: async (p) =>
p.endsWith('library.json')
? JSON.stringify({
...makeIndex([makeBook('h9', { updatedAt: 100 })], ['h9']),
emptyDirs: ['h9'],
})
: null,
list: orphanListing(true),
readBinary: async () => new ArrayBuffer(9),
captured,
});
const addBookToLibrary = vi.fn(async () => {});
const res = await new FileSyncEngine(provider, fakeStore({ addBookToLibrary })).syncLibrary(
[],
opts,
);
expect(res.booksDownloaded).toBe(1);
const idx = JSON.parse(
captured.writes.find((w) => w.path.endsWith('library.json'))!.body,
) as RemoteLibraryIndex;
expect(idx.emptyDirs ?? []).not.toContain('h9');
});
});
@@ -8,6 +8,7 @@ import { buildGoogleDriveProvider } from '@/services/sync/providers/gdrive/build
import {
createFileSyncProvider,
getEnabledFileSyncBackends,
resetFileSyncProviderCache,
} from '@/services/sync/file/providerRegistry';
import type { FileSyncProvider } from '@/services/sync/file/provider';
import type { WebDAVSettings } from '@/types/settings';
@@ -20,7 +21,10 @@ const webdav: WebDAVSettings = {
rootPath: '/',
};
afterEach(() => vi.clearAllMocks());
afterEach(() => {
vi.clearAllMocks();
resetFileSyncProviderCache();
});
describe('getEnabledFileSyncBackends', () => {
test('lists only switched-on backends in a stable order', () => {
@@ -55,4 +59,38 @@ describe('createFileSyncProvider', () => {
expect(await createFileSyncProvider('gdrive', {})).toBe(fake);
expect(buildGoogleDriveProvider).toHaveBeenCalledTimes(1);
});
// The provider is memoised per connection key so its path->id cache stays
// warm across surfaces (reader hook, library auto-sync, Sync now): a cold
// provider re-resolves /Readest, books/ and library.json by name query on
// every engine build, turning each book open/close/sync into a burst of
// redundant remote requests.
test('returns the same instance for an unchanged connection', async () => {
const first = await createFileSyncProvider('webdav', { webdav });
const second = await createFileSyncProvider('webdav', { webdav });
expect(second).toBe(first);
});
test('memoises the gdrive build (keychain probed once)', async () => {
const fake = { rootPath: '/' } as unknown as FileSyncProvider;
vi.mocked(buildGoogleDriveProvider).mockResolvedValue(fake);
await createFileSyncProvider('gdrive', {});
await createFileSyncProvider('gdrive', {});
expect(buildGoogleDriveProvider).toHaveBeenCalledTimes(1);
});
test('rebuilds when the connection settings change', async () => {
const first = await createFileSyncProvider('webdav', { webdav });
const second = await createFileSyncProvider('webdav', {
webdav: { ...webdav, password: 'changed' },
});
expect(second).not.toBe(first);
});
test('resetFileSyncProviderCache forces a rebuild', async () => {
const first = await createFileSyncProvider('webdav', { webdav });
resetFileSyncProviderCache();
const second = await createFileSyncProvider('webdav', { webdav });
expect(second).not.toBe(first);
});
});
@@ -5,6 +5,9 @@ import { useFileSyncStore } from '@/store/fileSyncStore';
import type { SystemSettings } from '@/types/settings';
const syncLibrary = vi.fn().mockResolvedValue({ booksSynced: 0 });
const pushBookFile = vi.fn().mockResolvedValue({ uploaded: true });
const pushBookCover = vi.fn().mockResolvedValue({ uploaded: true });
const downloadBookFile = vi.fn().mockResolvedValue(true);
vi.mock('@/services/sync/file/providerRegistry', async (importOriginal) => {
const actual = await importOriginal<typeof import('@/services/sync/file/providerRegistry')>();
@@ -21,10 +24,28 @@ vi.mock('@/services/sync/file/appLocalStore', () => ({
vi.mock('@/services/sync/file/engine', () => ({
FileSyncEngine: vi.fn(function (this: Record<string, unknown>) {
this['syncLibrary'] = syncLibrary;
this['pushBookFile'] = pushBookFile;
this['pushBookCover'] = pushBookCover;
this['downloadBookFile'] = downloadBookFile;
}),
}));
import { runActiveFileLibrarySync } from '@/services/sync/file/runLibrarySync';
import {
runActiveFileBookDownload,
runActiveFileBookUpload,
runActiveFileLibrarySync,
} from '@/services/sync/file/runLibrarySync';
import type { Book } from '@/types/book';
const makeBook = (hash: string): Book => ({
hash,
format: 'EPUB',
title: `Book ${hash}`,
sourceTitle: `Book ${hash}`,
author: 'A',
createdAt: 1,
updatedAt: 1,
});
const translationFn = (key: string, params?: Record<string, string | number>) => {
if (params) {
@@ -107,3 +128,68 @@ describe('runActiveFileLibrarySync', () => {
expect(syncLibrary).not.toHaveBeenCalled();
});
});
// The Book Details / bookshelf cloud buttons route here when a third-party
// provider is selected, instead of the (gated) Readest Cloud transfer queue.
describe('runActiveFileBookUpload', () => {
test('returns false without touching the engine when readest is the provider', async () => {
setProvider({});
expect(await runActiveFileBookUpload(envConfig, makeBook('h1'))).toBe(false);
expect(pushBookFile).not.toHaveBeenCalled();
});
test('pushes the file (plus cover) for the active provider', async () => {
setProvider({ webdav: { enabled: true } } as Partial<SystemSettings>);
expect(await runActiveFileBookUpload(envConfig, makeBook('h1'))).toBe(true);
expect(pushBookFile).toHaveBeenCalledTimes(1);
expect(pushBookCover).toHaveBeenCalledTimes(1);
});
test('treats an already-mirrored file as success', async () => {
setProvider({ webdav: { enabled: true } } as Partial<SystemSettings>);
pushBookFile.mockResolvedValueOnce({ uploaded: false, reason: 'remote-matches' });
expect(await runActiveFileBookUpload(envConfig, makeBook('h1'))).toBe(true);
});
test('fails when the book has no local source', async () => {
setProvider({ webdav: { enabled: true } } as Partial<SystemSettings>);
pushBookFile.mockResolvedValueOnce({ uploaded: false, reason: 'no-source' });
expect(await runActiveFileBookUpload(envConfig, makeBook('h1'))).toBe(false);
});
test('returns false instead of throwing when the engine fails', async () => {
setProvider({ webdav: { enabled: true } } as Partial<SystemSettings>);
pushBookFile.mockRejectedValueOnce(new Error('server unreachable'));
expect(await runActiveFileBookUpload(envConfig, makeBook('h1'))).toBe(false);
});
});
describe('runActiveFileBookDownload', () => {
test('returns false without touching the engine when readest is the provider', async () => {
setProvider({});
expect(await runActiveFileBookDownload(envConfig, makeBook('h1'))).toBe(false);
expect(downloadBookFile).not.toHaveBeenCalled();
});
test('downloads via the engine and stamps downloadedAt', async () => {
setProvider({ webdav: { enabled: true } } as Partial<SystemSettings>);
const book = makeBook('h1');
expect(await runActiveFileBookDownload(envConfig, book)).toBe(true);
expect(downloadBookFile).toHaveBeenCalledTimes(1);
expect(book.downloadedAt).toBeTruthy();
});
test('returns false and leaves the book unstamped when the remote has no file', async () => {
setProvider({ webdav: { enabled: true } } as Partial<SystemSettings>);
downloadBookFile.mockResolvedValueOnce(false);
const book = makeBook('h1');
expect(await runActiveFileBookDownload(envConfig, book)).toBe(false);
expect(book.downloadedAt).toBeUndefined();
});
test('returns false instead of throwing when the engine fails', async () => {
setProvider({ webdav: { enabled: true } } as Partial<SystemSettings>);
downloadBookFile.mockRejectedValueOnce(new Error('server unreachable'));
expect(await runActiveFileBookDownload(envConfig, makeBook('h1'))).toBe(false);
});
});
@@ -219,4 +219,48 @@ describe('GoogleDriveProvider — Drive transport', () => {
.mockResolvedValueOnce(text('SECOND')); // media GET on XID2
expect(await h.provider.readText('/Readest/x.json')).toBe('SECOND');
});
// Writes to a known path must not pay a lookup: the engine's steady state
// (config.json and library.json PUTs right after their pull) re-writes paths
// whose ids the read already cached, so the extra files.list per PUT was
// pure overhead at one query per book config and per index push.
test('writeText to a cached path PATCHes the known id without a lookup', async () => {
const h = makeDrive();
h.fetchMock
.mockResolvedValueOnce(json({ files: [folder('RID')] })) // findChild('Readest')
.mockResolvedValueOnce(json({ files: [{ id: 'XID' }] })) // findChild('x.json')
.mockResolvedValueOnce(text('FIRST')); // media download
await h.provider.readText('/Readest/x.json');
h.fetchMock.mockResolvedValueOnce(json({ id: 'XID' })); // PATCH media update
await h.provider.writeText('/Readest/x.json', 'BODY');
expect(h.fetchMock).toHaveBeenCalledTimes(4);
expect(h.url(3)).toContain('/upload/drive/v3/files/XID');
expect(h.method(3)).toBe('PATCH');
});
test('a stale cached id on write evicts and falls back to the full resolve', async () => {
const h = makeDrive();
h.fetchMock
.mockResolvedValueOnce(json({ files: [folder('RID')] })) // findChild('Readest')
.mockResolvedValueOnce(json({ files: [{ id: 'XID' }] })) // findChild('x.json')
.mockResolvedValueOnce(text('FIRST')); // media download
await h.provider.readText('/Readest/x.json');
// Cached XID was deleted remotely: the fast-path PATCH 404s, the provider
// evicts and re-resolves, finds no existing file, and create-then-names.
h.fetchMock
.mockResolvedValueOnce(json({}, 404)) // PATCH on stale XID
.mockResolvedValueOnce(json({ files: [folder('RID')] })) // re-resolve Readest
.mockResolvedValueOnce(json({ files: [] })) // findChild('x.json') — gone
.mockResolvedValueOnce(json({ id: 'NID' })) // POST upload
.mockResolvedValueOnce(json({ id: 'NID' })); // PATCH name + reparent
await h.provider.writeText('/Readest/x.json', 'BODY');
expect(h.fetchMock).toHaveBeenCalledTimes(8);
// The recreated file's id is cached: a follow-up read is one media GET.
h.fetchMock.mockResolvedValueOnce(text('AFTER'));
expect(await h.provider.readText('/Readest/x.json')).toBe('AFTER');
expect(h.url(8)).toContain('/NID?alt=media');
});
});
@@ -322,8 +322,7 @@ const SettingsMenu: React.FC<SettingsMenuProps> = ({ onPullLibrary, setIsDropdow
? providerLastError
? _('Sync failed')
: lastSyncTime
? _('Synced via {{provider}} {{time}}', {
provider: cloudProviderName,
? _('Synced {{time}}', {
time: dayjs(lastSyncTime).fromNow(),
})
: _('Never synced')
@@ -378,6 +377,13 @@ const SettingsMenu: React.FC<SettingsMenuProps> = ({ onPullLibrary, setIsDropdow
labelClass='ps-2 pe-1 !mx-0'
iconClassName={(user && isSyncing) || providerSyncing ? 'animate-reverse-spin' : ''}
onClick={handleSyncLibrary}
description={
cloudProvider !== 'readest'
? _('Library sync via {{provider}}', {
provider: cloudProviderName,
})
: undefined
}
/>
{cloudProvider === 'readest' ? (
<button
@@ -389,22 +395,7 @@ const SettingsMenu: React.FC<SettingsMenuProps> = ({ onPullLibrary, setIsDropdow
>
<Quota quotas={quotas} labelClassName='h-10 pl-3 pr-2' />
</button>
) : (
// Non-interactive caption in the quota slot — no hover/focus
// affordance (it is not a dead tappable row) — so the quota's
// disappearance reads as intentional, not broken.
<div
aria-hidden='true'
className='text-base-content/60 w-full px-3 py-2 text-[0.85em]'
style={{
paddingInlineStart: `${iconSize}px`,
}}
>
{_("Books sync via {{provider}} - Readest Cloud storage isn't used", {
provider: cloudProviderName,
})}
</div>
)}
) : null}
<MenuItem label={_('Account')} onClick={handleUserProfile} />
</ul>
</MenuItem>
+32
View File
@@ -26,6 +26,10 @@ import {
getCloudSyncProvider,
isReadestCloudStorageActive,
} from '@/services/sync/cloudSyncProvider';
import {
runActiveFileBookDownload,
runActiveFileBookUpload,
} from '@/services/sync/file/runLibrarySync';
import { getDirPath, getFilename, joinPaths } from '@/utils/path';
import { parseOpenWithFiles } from '@/helpers/openWith';
import { isTauriAppPlatform, isWebAppPlatform } from '@/services/environment';
@@ -946,6 +950,20 @@ const LibraryPageContent = ({ searchParams }: { searchParams: ReadonlyURLSearchP
const handleBookUpload = useCallback(
async (book: Book, _syncBooks = true) => {
// Route the explicit action to the selected cloud provider: while
// WebDAV / Google Drive is active the Readest Cloud transfer queue is
// gated and would only answer with the "paused" notice.
if (getCloudSyncProvider(useSettingsStore.getState().settings) !== 'readest') {
const ok = await runActiveFileBookUpload(envConfig, book);
eventDispatcher.dispatch('toast', {
type: ok ? 'info' : 'error',
timeout: 2000,
message: ok
? _('Book uploaded: {{title}}', { title: book.title })
: _('Failed to upload book: {{title}}', { title: book.title }),
});
return ok;
}
// Use transfer queue for uploads - priority 1 for manual uploads (higher priority)
const transferId = transferManager.queueUpload(book, 1);
if (transferId) {
@@ -980,6 +998,20 @@ const LibraryPageContent = ({ searchParams }: { searchParams: ReadonlyURLSearchP
const handleBookDownload = useCallback(
async (book: Book, downloadOptions: { redownload?: boolean; queued?: boolean } = {}) => {
const { redownload = false, queued = false } = downloadOptions;
// Same provider routing as handleBookUpload — this path is also how a
// not-yet-local book gets fetched when the user opens it.
if (getCloudSyncProvider(useSettingsStore.getState().settings) !== 'readest') {
const ok = await runActiveFileBookDownload(envConfig, book);
if (ok) await updateBook(envConfig, book);
eventDispatcher.dispatch('toast', {
type: ok ? 'info' : 'error',
timeout: 2000,
message: ok
? _('Book downloaded: {{title}}', { title: book.title })
: _('Failed to download book: {{title}}', { title: book.title }),
});
return ok;
}
if (redownload || !queued) {
try {
await appService?.downloadBook(book, false, redownload, (progress) => {
@@ -62,6 +62,17 @@ const PULL_COOLDOWN_MS = 60_000;
*/
const OPEN_PULL_SKIP_MS = 30_000;
/**
* Whether a pull actually landed a remote reading position: the merged
* location exists and differs from what this device already had. Drives the
* same top-right "Reading Progress Synced" hint the native cloud sync shows,
* so WebDAV / Google Drive give equal feedback.
*/
export const remoteProgressApplied = (
localLocation: string | null | undefined,
mergedLocation: string | null | undefined,
): boolean => !!mergedLocation && mergedLocation !== localLocation;
/** Settings key for a backend kind. */
const settingsKeyFor = (kind: FileSyncBackendKind): 'webdav' | 'googleDrive' =>
kind === 'gdrive' ? 'googleDrive' : 'webdav';
@@ -202,8 +213,8 @@ export const useFileSync = (bookKey: string) => {
timeout: 5000,
message:
activeKind === 'gdrive'
? _('Google Drive session expired. Reconnect in Settings.')
: _('Cloud sync session expired. Reconnect in Settings.'),
? _('Google Drive session expired')
: _('Cloud sync session expired'),
});
}, [bookKey, activeKind, _]);
@@ -359,6 +370,14 @@ export const useFileSync = (bookKey: string) => {
}
setConfig(bookKey, toApply);
// Parity with the native cloud sync: surface the same top-right hint
// when a remote reading position was fetched and applied.
if (wantProgress && remoteProgressApplied(config.location, toApply.location)) {
eventDispatcher.dispatch('hint', {
bookKey,
message: _('Reading Progress Synced'),
});
}
const latest = getConfig(bookKey);
if (latest) await saveConfig(envConfig, bookKey, latest, settings);
await updateLastSyncedAt(Date.now());
@@ -382,6 +401,7 @@ export const useFileSync = (bookKey: string) => {
providerSettings,
updateLastSyncedAt,
handleSyncError,
_,
]);
// Stash the latest callbacks in a ref so the event-bridge effect doesn't
@@ -42,8 +42,7 @@ import {
} from '@/services/sync/cloudSyncProvider';
import type { FileSyncBackendKind } from '@/services/sync/file/providerRegistry';
import SubPageHeader from './SubPageHeader';
import Quota from '@/components/Quota';
import { NavigationRow, SectionTitle, SettingLabel, Tips } from './primitives';
import { BoxedList, NavigationRow, SectionTitle, SettingLabel, Tips } from './primitives';
type SubPage =
| 'kosync'
@@ -87,7 +86,7 @@ const IntegrationsPanel: React.FC = () => {
// temporarily UNGATED while the feature stabilises — `isCloudSyncAllowed`
// returns true for every plan until `CLOUD_SYNC_REQUIRES_PREMIUM` is flipped
// back on. The `?? 'free'` keeps the (re-gated) loading state non-premium.
const { userProfilePlan, quotas } = useQuotaStats();
const { userProfilePlan } = useQuotaStats();
const isCloudSyncPremium = isCloudSyncAllowed(userProfilePlan ?? 'free');
const [subPage, setSubPage] = useState<SubPage>(null);
@@ -227,18 +226,13 @@ const IntegrationsPanel: React.FC = () => {
description={_('Sync your library, reading progress, and highlights with Readest Cloud.')}
onBack={() => setSubPage(null)}
/>
<div className='space-y-5'>
<div className='card eink-bordered border-base-200 bg-base-100 overflow-hidden border px-4 py-3'>
<Quota quotas={quotas} labelClassName='h-10' />
</div>
<div className='card eink-bordered border-base-200 bg-base-100 overflow-hidden border'>
<NavigationRow
title={_('Account and Storage')}
status={_('Manage your plan and stored files')}
onClick={() => navigateToProfile(router)}
/>
</div>
</div>
<BoxedList>
<NavigationRow
title={_('Account and Storage')}
status={_('Manage your plan and stored files')}
onClick={() => navigateToProfile(router)}
/>
</BoxedList>
</div>
);
if (subPage === 'readwise')
@@ -335,7 +329,7 @@ const IntegrationsPanel: React.FC = () => {
<div className='divide-base-200 divide-y'>
<IntegrationRow
icon={RiBookOpenLine}
title={_('KOReader Sync')}
title={_('KOReader')}
status={koSyncStatus}
onClick={() => setSubPage('kosync')}
/>
@@ -357,11 +351,6 @@ const IntegrationsPanel: React.FC = () => {
<div className='w-full' data-setting-id='settings.integrations.cloudSync'>
<SectionTitle className='mb-2'>{_('Cloud Sync')}</SectionTitle>
<p className='text-base-content/70 mb-2 px-1 text-sm leading-relaxed'>
{_(
'Choose where your library — books, progress, annotations — syncs on this device. App settings, reading statistics, and dictionaries always sync with your Readest account while signed in.',
)}
</p>
<div className='card eink-bordered border-base-200 bg-base-100 overflow-hidden border'>
<div
className='divide-base-200 divide-y'
@@ -380,16 +369,6 @@ const IntegrationsPanel: React.FC = () => {
/>
{isCloudSyncPremium ? (
<>
<CloudProviderRow
icon={RiCloudLine}
title={_('WebDAV')}
status={webdavStatus}
isActive={activeCloudKind === 'webdav'}
canActivate={webdavConfigured}
onActivate={() => activateCloudProvider('webdav')}
onOpen={() => setSubPage('webdav')}
activateLabel={_('Use WebDAV')}
/>
{(appService?.isDesktopApp ||
appService?.isAndroidApp ||
appService?.isIOSApp ||
@@ -406,6 +385,16 @@ const IntegrationsPanel: React.FC = () => {
activateLabel={_('Use Google Drive')}
/>
)}
<CloudProviderRow
icon={RiCloudLine}
title={_('WebDAV')}
status={webdavStatus}
isActive={activeCloudKind === 'webdav'}
canActivate={webdavConfigured}
onActivate={() => activateCloudProvider('webdav')}
onOpen={() => setSubPage('webdav')}
activateLabel={_('Use WebDAV')}
/>
</>
) : (
// Premium-gated: free users keep the Readest Cloud row above and
@@ -186,15 +186,13 @@ const FileSyncForm: React.FC<FileSyncFormProps> = ({
<BoxedList>
<SettingsSwitchRow
label={_('Upload Book Files')}
description={_(
'Uploads book files to your other devices. Readest Cloud uploads pause while this provider is selected.',
)}
description={_('Uploads book files to your other devices')}
checked={stored.syncBooks ?? false}
onChange={handleToggleSyncBooks}
/>
<SettingsSwitchRow
label={_('Full Sync')}
description={_('Re-check every book instead of only changed ones.')}
description={_('Re-check every book instead of only changed ones')}
checked={stored.fullSync ?? false}
onChange={handleToggleFullSync}
/>
@@ -18,7 +18,7 @@ export interface ReadestRowInputs {
export const getReadestCloudRowStatus = (_: TranslationFunc, s: ReadestRowInputs): string => {
if (!s.signedIn) return _('Not signed in');
if (s.planLoading) return '…';
if (s.selected) return _('Active — syncing your library on this device');
if (s.selected) return _('Active');
return _('Available');
};
@@ -44,5 +44,5 @@ export const getThirdPartyRowStatus = (_: TranslationFunc, s: ThirdPartyRowInput
// provider is opted out of book files) — the row must say so.
return _('Active · Book file uploads off');
}
return _('Active — syncing your library on this device');
return _('Active');
};
+203 -37
View File
@@ -176,6 +176,27 @@ const runPool = async <T>(
await Promise.all(runners);
};
/**
* The last successfully pulled library.json (+ its etag) per provider
* instance. Providers are memoised per connection (see providerRegistry), so
* this lives for the session and dies with a reconnect / settings change.
* Lets a run whose etag probe matches skip the full index download and,
* since every peer mutation rewrites library.json, skip the discovery scan
* too. Entries are cloned on read AND write so neither the caching run nor a
* reusing run can pollute the snapshot through in-place row mutations.
*/
const remoteIndexCache = new WeakMap<
FileSyncProvider,
{ etag: string; index: RemoteLibraryIndex }
>();
/** Order-insensitive string-array equality (duplicates collapse). */
const sameStringSet = (a: string[], b: string[]): boolean => {
if (a.length !== b.length) return false;
const bs = new Set(b);
return a.every((x) => bs.has(x));
};
/**
* Provider-agnostic file-sync orchestration: progress + booknote merge per
* book, library-wide push/pull with last-writer-wins metadata reconciliation,
@@ -236,18 +257,28 @@ export class FileSyncEngine {
* HEAD-probe + size compare skips re-uploading an already-mirrored book.
* Streaming (provider.uploadStream, Tauri only) is preferred constant JS
* heap regardless of book size; web falls back to buffered writeBinary.
*
* The local source is resolved BEFORE any remote probe: a book this device
* does not hold can never be uploaded, so probing the remote for it buys
* nothing and at library scale (a cloud-only web library) it turns every
* sync into a full per-book request storm. `no-source` costs zero requests.
*/
async pushBookFile(book: Book): Promise<PushBookFileResult> {
const dirPath = buildBookDirPath(this.provider.rootPath, book.hash);
const path = buildBookFilePath(this.provider.rootPath, book);
const dirs = [...ancestorsOf(`${dirPath}/.placeholder`), dirPath];
let remoteHead: FileHead | null = null;
try {
remoteHead = await this.provider.head(path);
} catch (e) {
if (!(e instanceof FileSyncError) || e.code !== 'NETWORK') throw e;
}
// A thrown non-NETWORK failure (e.g. AUTH_FAILED) propagates so the
// caller's terminal-failure latch can stop the run; a transport blip is
// treated as "remote unknown" and the upload proceeds.
const probeRemoteHead = async (): Promise<FileHead | null> => {
try {
return await this.provider.head(path);
} catch (e) {
if (!(e instanceof FileSyncError) || e.code !== 'NETWORK') throw e;
return null;
}
};
// Streaming path: resolve the on-disk path + size only, then stream the
// bytes straight from disk. The metadata fetch never reads the body, so
@@ -255,6 +286,7 @@ export class FileSyncEngine {
if (this.provider.uploadStream) {
const src = await this.store.resolveLocalBookPath(book);
if (src) {
const remoteHead = await probeRemoteHead();
if (remoteHead && remoteHead.size === src.size) {
return { uploaded: false, reason: 'remote-matches' };
}
@@ -275,6 +307,7 @@ export class FileSyncEngine {
const local = await this.store.loadBookFile(book);
if (!local) return { uploaded: false, reason: 'no-source' };
const remoteHead = await probeRemoteHead();
if (remoteHead && remoteHead.size === local.size) {
return { uploaded: false, reason: 'remote-matches' };
}
@@ -333,6 +366,53 @@ export class FileSyncEngine {
return this.provider.readBinary(buildBookCoverPath(this.provider.rootPath, bookHash));
}
/**
* Download one book's binary from its remote hash dir into the local store,
* plus cover + config best-effort the explicit per-book Download action
* (Book Details / bookshelf cloud button) for a third-party provider.
* The on-disk filename is resolved by listing the dir (titles go stale).
* Returns false when the remote holds no book file. syncLibrary's discovery
* loop covers the library-wide variant of this.
*/
async downloadBookFile(book: Book): Promise<boolean> {
const dirPath = buildBookDirPath(this.provider.rootPath, book.hash);
const entries = await this.provider.list(dirPath);
const fileEntry = entries.find(
(e) => !e.isDirectory && e.name !== SYNC_BOOK_CONFIG_FILE && e.name !== SYNC_BOOK_COVER_FILE,
);
if (!fileEntry) return false;
let written = false;
if (this.provider.downloadStream) {
const dst = await this.store.prepareLocalBookPath(book);
written = await this.provider.downloadStream(fileEntry.path, dst);
} else {
const bytes = await this.provider.readBinary(fileEntry.path);
if (bytes) {
await this.store.saveBookFile(book, bytes);
written = true;
}
}
if (!written) return false;
try {
const coverBytes = await this.pullBookCover(book.hash);
if (coverBytes) await this.store.saveBookCover(book, coverBytes);
} catch (e) {
console.warn('file sync: cover download failed', book.hash, e);
}
try {
const localConfig = (await this.store.loadConfig(book)) ?? { updatedAt: 0, booknotes: [] };
const pull = await this.pullBookConfig(book, localConfig);
if (pull.applied && pull.mergedConfig) {
await this.store.saveBookConfig(book, pull.mergedConfig);
}
} catch (e) {
console.warn('file sync: config download failed', book.hash, e);
}
return true;
}
/** GET + parse the shared library.json index, or null when absent/malformed. */
async pullLibraryIndex(): Promise<RemoteLibraryIndex | null> {
const path = buildLibraryPath(this.provider.rootPath);
@@ -382,17 +462,48 @@ export class FileSyncEngine {
const strategy = options.strategy || 'silent';
const canPull = strategy !== 'send';
const canPush = strategy !== 'receive';
const fullSync = options.fullSync ?? false;
const concurrency = Math.max(1, options.concurrency ?? 4);
let remoteIndex: RemoteLibraryIndex | null = null;
// True when the remote index provably matches what this provider saw on
// its previous successful run. Every peer mutation rewrites library.json,
// so an unchanged index means no remote-side news — the run can skip the
// index download AND the discovery scan.
let remoteIndexUnchanged = false;
if (canPull) {
// An UNREADABLE index (throw — expired session, network) is NOT the
// same as an ABSENT one (404 → null, first-sync semantics). Proceeding
// with a null index here would treat every local book as unpushed (an
// attempted mass re-upload against a dead session) and the final index
// re-push would drop the peers' tombstones it failed to read (#4860),
// resurrecting deleted books. Abort the run instead; callers surface
// one error.
remoteIndex = await this.pullLibraryIndex();
// Cheap change probe: one metadata stat. `etag` is Drive's md5 / the
// WebDAV ETag; a provider without one always re-pulls. An AUTH failure
// aborts exactly like the pull below; any other probe failure falls
// back to the full pull.
let remoteEtag: string | undefined;
if (!fullSync) {
try {
remoteEtag = (await this.provider.head(buildLibraryPath(this.provider.rootPath)))?.etag;
} catch (e) {
if (e instanceof FileSyncError && e.code === 'AUTH_FAILED') throw e;
}
}
const cached = remoteIndexCache.get(this.provider);
if (!fullSync && remoteEtag !== undefined && cached && cached.etag === remoteEtag) {
remoteIndex = structuredClone(cached.index);
remoteIndexUnchanged = true;
} else {
// An UNREADABLE index (throw — expired session, network) is NOT the
// same as an ABSENT one (404 → null, first-sync semantics). Proceeding
// with a null index here would treat every local book as unpushed (an
// attempted mass re-upload against a dead session) and the final index
// re-push would drop the peers' tombstones it failed to read (#4860),
// resurrecting deleted books. Abort the run instead; callers surface
// one error.
remoteIndex = await this.pullLibraryIndex();
if (remoteIndex && remoteEtag !== undefined) {
remoteIndexCache.set(this.provider, {
etag: remoteEtag,
index: structuredClone(remoteIndex),
});
}
}
}
// Terminal-failure latch: once any remote call fails with AUTH_FAILED the
@@ -412,9 +523,6 @@ export class FileSyncEngine {
allBooksMap.set(b.hash, b);
}
const fullSync = options.fullSync ?? false;
const concurrency = Math.max(1, options.concurrency ?? 4);
// Incremental cursor: a book needs a push only when its local copy is newer
// than (or absent from) the shared library.json index. `book.updatedAt`
// bumps on every progress / notes / metadata save, so the index is a
@@ -552,8 +660,19 @@ export class FileSyncEngine {
// Hash directories that still exist on the remote. Populated by the discovery
// scan below and reused by the deleted-book GC before the index re-push.
const remoteHashDirs = new Set<string>();
// Dirs discovery already inspected and found file-less (see wire.ts).
// Carried forward through the index so no client re-lists them every run.
const emptyDirs = new Set<string>(remoteIndex?.emptyDirs ?? []);
// Whether the books/ listing ran and succeeded this run — the empty-dir
// record may only be pruned against a listing that actually happened.
let booksDirListed = false;
if (canPull) {
// Discovery is skipped when the remote index provably didn't change: a
// peer adding a book (or a legacy client uploading one) has no way to
// become visible without library.json changing... except a no-index
// legacy upload, which is still picked up on the first run of a session
// (cold cache) and on Full Sync.
if (canPull && (!remoteIndexUnchanged || fullSync)) {
const candidateHashes = new Set<string>();
// 1) Seed with hashes from the remote index (when the file exists).
@@ -573,6 +692,7 @@ export class FileSyncEngine {
try {
const booksDirPath = `${buildBasePath(this.provider.rootPath)}/${SYNC_BOOKS_DIR}`;
const dirEntries = await this.provider.list(booksDirPath);
booksDirListed = true;
for (const entry of dirEntries) {
if (!entry.isDirectory) continue;
remoteHashDirs.add(entry.name);
@@ -590,6 +710,10 @@ export class FileSyncEngine {
// actual book file (the only entry that isn't config.json/cover.png).
for (const hash of candidateHashes) {
if (aborted()) break;
// Already inspected and file-less: don't re-list it — unless the
// index says the file has since arrived (uploadedHashes), or a Full
// Sync re-verifies everything.
if (!fullSync && emptyDirs.has(hash) && !uploadedHashes.has(hash)) continue;
try {
const hashDirPath = `${buildBasePath(this.provider.rootPath)}/${SYNC_BOOKS_DIR}/${hash}`;
const hashDirEntries = await this.provider.list(hashDirPath);
@@ -597,7 +721,11 @@ export class FileSyncEngine {
(e) =>
!e.isDirectory && e.name !== SYNC_BOOK_CONFIG_FILE && e.name !== SYNC_BOOK_COVER_FILE,
);
if (!fileEntry) continue;
if (!fileEntry) {
emptyDirs.add(hash);
continue;
}
emptyDirs.delete(hash);
const extMatch = fileEntry.name.match(/\.([^.]+)$/);
const ext = extMatch && extMatch[1] ? extMatch[1].toUpperCase() : 'EPUB';
@@ -812,8 +940,10 @@ export class FileSyncEngine {
result.filesAlreadyInSync += 1;
uploadedHashes.add(book.hash);
}
// 'no-source' → the file isn't on this device; leave it unrecorded
// so a device that does have it can upload and record it later.
// 'no-source' → the file isn't on this device; the verdict is
// reached from local state alone (no remote probe) and stays
// unrecorded so a device that does have the file can upload
// and record it later.
}
} catch (e) {
noteAbort(e);
@@ -865,22 +995,58 @@ export class FileSyncEngine {
}
});
try {
const newIndex: RemoteLibraryIndex = {
schemaVersion: 1,
books: Array.from(indexByHash.values()),
updatedAt: Date.now(),
// Carry the uploaded-file record forward so the next incremental sync
// stays O(changed). Keep only hashes that still map to a live indexed
// book so the set can't grow unbounded with tombstoned / evicted books.
uploadedHashes: Array.from(uploadedHashes).filter((hash) => {
const b = indexByHash.get(hash);
return !!b && !b.deletedAt;
}),
};
await this.pushLibraryIndex(newIndex);
} catch (e) {
console.warn('file sync: failed to push index', e);
// Prune the empty-dir record to dirs that still exist — but only against
// a listing that actually ran, so a discovery-skipped run can't wipe it.
if (booksDirListed) {
for (const hash of Array.from(emptyDirs)) {
if (!remoteHashDirs.has(hash)) emptyDirs.delete(hash);
}
}
// Carry the uploaded-file record forward so the next incremental sync
// stays O(changed). Keep only hashes that still map to a live indexed
// book so the set can't grow unbounded with tombstoned / evicted books.
const nextUploadedHashes = Array.from(uploadedHashes).filter((hash) => {
const b = indexByHash.get(hash);
return !!b && !b.deletedAt;
});
const nextEmptyDirs = Array.from(emptyDirs);
// Skip the re-push when the rebuilt index is semantically identical to
// the pulled one: a restamped byte-copy only churns the remote and
// invalidates every other device's etag-based change detection. The
// check is deliberately conservative — any per-book activity, failure,
// record change, or local row the remote lacks (or trails) pushes.
const remoteAllByHash = new Map((remoteIndex?.books ?? []).map((b) => [b.hash, b] as const));
const indexDirty =
remoteIndex === null ||
syncedHashes.size > 0 ||
result.failures > 0 ||
!sameStringSet(nextUploadedHashes, remoteIndex.uploadedHashes ?? []) ||
!sameStringSet(nextEmptyDirs, remoteIndex.emptyDirs ?? []) ||
books.some((b) => {
const r = remoteAllByHash.get(b.hash);
if (!r) return true;
if (!!r.deletedAt !== !!b.deletedAt) return true;
return (b.updatedAt ?? 0) > (r.updatedAt ?? 0);
});
if (indexDirty) {
try {
const newIndex: RemoteLibraryIndex = {
schemaVersion: 1,
books: Array.from(indexByHash.values()),
updatedAt: Date.now(),
uploadedHashes: nextUploadedHashes,
emptyDirs: nextEmptyDirs,
};
await this.pushLibraryIndex(newIndex);
// Our own push changed the remote etag; drop the cached snapshot so
// the next run re-pulls (and re-discovers) once, then goes quiet.
remoteIndexCache.delete(this.provider);
} catch (e) {
console.warn('file sync: failed to push index', e);
}
}
}
@@ -33,6 +33,35 @@ export const getEnabledFileSyncBackends = (
return enabled;
};
/**
* One provider is memoised per connection key and shared by every surface
* (the reader's per-book sync, the library auto-sync, Sync now / pull to
* refresh). What makes reuse worth it is the provider's path->id cache
* (Drive): a cold provider re-resolves /Readest, books/ and library.json by
* name query on every engine build, so one engine per book open/close/sync
* turned each user action into a burst of redundant remote requests. The key
* mirrors the connection-relevant settings, so a config edit rebuilds; stale
* cached ids self-heal through the provider's 404 eviction. Drive connect /
* disconnect must call {@link resetFileSyncProviderCache} its token source
* changes identity without any key input changing.
*/
let cachedProvider: { key: string; provider: FileSyncProvider } | null = null;
const providerCacheKey = (
kind: FileSyncBackendKind,
settings: FileSyncBackendsSettings,
): string => {
if (kind === 'webdav') {
const w = settings.webdav;
return `webdav:${w?.enabled}:${w?.serverUrl}:${w?.username}:${w?.password}:${w?.rootPath}`;
}
return 'gdrive';
};
export const resetFileSyncProviderCache = (): void => {
cachedProvider = null;
};
/**
* Build the provider for one backend, or `null` when it cannot run here (WebDAV
* without config, Drive without a baked client id / secure storage). Async
@@ -42,8 +71,14 @@ export const createFileSyncProvider = async (
kind: FileSyncBackendKind,
settings: FileSyncBackendsSettings,
): Promise<FileSyncProvider | null> => {
if (kind === 'webdav') {
return settings.webdav ? createWebDAVProvider(settings.webdav) : null;
}
return buildGoogleDriveProvider();
const key = providerCacheKey(kind, settings);
if (cachedProvider?.key === key) return cachedProvider.provider;
const provider =
kind === 'webdav'
? settings.webdav
? createWebDAVProvider(settings.webdav)
: null
: await buildGoogleDriveProvider();
if (provider) cachedProvider = { key, provider };
return provider;
};
@@ -1,4 +1,5 @@
import { v4 as uuidv4 } from 'uuid';
import type { Book } from '@/types/book';
import type { EnvConfigType } from '@/services/environment';
import type { TranslationFunc } from '@/hooks/useTranslation';
import { useSettingsStore } from '@/store/settingsStore';
@@ -85,3 +86,71 @@ export const runActiveFileLibrarySync = async (
useFileSyncStore.getState().endSync(kind);
}
};
/**
* Build the ACTIVE third-party provider's engine, or null when Readest Cloud
* is selected / the provider cannot be constructed. Shared by the per-book
* upload / download actions below.
*/
const buildActiveEngine = async (envConfig: EnvConfigType): Promise<FileSyncEngine | null> => {
const settings = useSettingsStore.getState().settings;
const kind = getCloudSyncProvider(settings);
if (kind === 'readest') return null;
const appService = await envConfig.getAppService();
const fileProvider = await createFileSyncProvider(kind, settings);
if (!fileProvider) return null;
const store = createAppLocalStore({ appService, settings, envConfig });
return new FileSyncEngine(fileProvider, store);
};
/**
* Explicit per-book Upload routed to the ACTIVE third-party provider the
* Book Details / bookshelf cloud buttons call this instead of the (gated)
* Readest Cloud transfer queue while WebDAV / Google Drive is selected.
* Pushes the binary (HEAD short-circuited; an already-mirrored file counts
* as success) plus the cover, best-effort. Toasts are the caller's job.
*/
export const runActiveFileBookUpload = async (
envConfig: EnvConfigType,
book: Book,
): Promise<boolean> => {
try {
const engine = await buildActiveEngine(envConfig);
if (!engine) return false;
const result = await engine.pushBookFile(book);
if (!result.uploaded && result.reason !== 'remote-matches') return false;
try {
await engine.pushBookCover(book);
} catch (e) {
console.warn('[cloudSync] book cover upload failed', book.hash, e);
}
return true;
} catch (e) {
console.warn('[cloudSync] book upload failed', book.hash, e);
return false;
}
};
/**
* Explicit per-book Download routed to the ACTIVE third-party provider (also
* reached when opening a book whose file is not local). Stamps the book's
* downloadedAt/coverDownloadedAt like the native download path; persisting
* the book row (updateBook) and toasts are the caller's job.
*/
export const runActiveFileBookDownload = async (
envConfig: EnvConfigType,
book: Book,
): Promise<boolean> => {
try {
const engine = await buildActiveEngine(envConfig);
if (!engine) return false;
const ok = await engine.downloadBookFile(book);
if (!ok) return false;
book.downloadedAt = Date.now();
if (!book.coverDownloadedAt) book.coverDownloadedAt = Date.now();
return true;
} catch (e) {
console.warn('[cloudSync] book download failed', book.hash, e);
return false;
}
};
@@ -108,6 +108,15 @@ export interface RemoteLibraryIndex {
* re-verifies each file once (a bounded, self-healing HEAD) and re-records it.
*/
uploadedHashes?: string[];
/**
* Hash dirs inspected by discovery and found to hold no book file (config /
* cover only legacy leftovers, or peers syncing without "Upload Book
* Files"). Discovery skips them instead of re-listing every one on every
* run. A dir is re-checked when {@link uploadedHashes} says its file has
* arrived, on Full Sync, and whenever the record is dropped by a legacy
* client (same optional + additive self-healing contract as uploadedHashes).
*/
emptyDirs?: string[];
}
export const parseRemoteLibraryIndex = (raw: string | null): RemoteLibraryIndex | null => {
@@ -254,6 +254,42 @@ const parseRetryAfterMs = (header: string | null): number | undefined => {
const defaultSleep: SleepFn = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
/**
* Dev-only request diagnostics: one `[gdrive] op …` line per provider call
* (with the sync-layer's logical path) and one `[gdrive] #n …` line per HTTP
* attempt (with the decoded Drive request purpose), so a sync run's request
* budget can be attributed line-by-line from the console.
*/
const LOG_DRIVE_REQUESTS = process.env['NODE_ENV'] === 'development';
let driveRequestSeq = 0;
const logDriveOp = (op: string, detail: string): void => {
if (LOG_DRIVE_REQUESTS) console.log(`[gdrive] op ${op} ${detail}`);
};
/** Decode a Drive REST URL into a short human-readable purpose. */
const describeDriveRequest = (url: string, method: string): string => {
try {
const u = new URL(url);
const q = u.searchParams.get('q');
if (q !== null) {
const name = /name = '([^']*)'/.exec(q)?.[1];
const parent = /'([^']*)' in parents/.exec(q)?.[1];
return name ? `lookup '${name}' in ${parent}` : `list children of ${parent}`;
}
const id = /\/files\/([^/?]+)/.exec(u.pathname)?.[1];
if (u.searchParams.get('alt') === 'media') return `download ${id}`;
if (u.pathname.includes('/upload/')) return id ? `upload(overwrite) ${id}` : 'upload(create)';
if (u.searchParams.has('addParents')) return `name+reparent ${id}`;
if (method === HTTP_DELETE) return `delete ${id}`;
if (id) return `stat ${id}`;
if (method === HTTP_POST) return 'create folder';
return u.pathname;
} catch {
return url;
}
};
class DriveProviderImpl {
readonly rootPath = '/';
@@ -282,16 +318,19 @@ class DriveProviderImpl {
) {}
async readText(path: string): Promise<string | null> {
logDriveOp('readText', path);
const res = await this.getMedia(path);
return res ? res.text() : null;
}
async readBinary(path: string): Promise<ArrayBuffer | null> {
logDriveOp('readBinary', path);
const res = await this.getMedia(path);
return res ? res.arrayBuffer() : null;
}
async head(path: string): Promise<FileHead | null> {
logDriveOp('head', path);
const file = await this.statFresh(path, (id) => metadataUrl(id), 'stat');
if (file === null) return null;
return {
@@ -301,6 +340,7 @@ class DriveProviderImpl {
}
async list(path: string): Promise<FileEntry[]> {
logDriveOp('list', path);
const folderId = await this.resolveFolderSegments(splitSegments(path), false);
// Absent folder -> empty listing (Drive has no path, so a missing parent is
// simply "no children"). Matches what the engine's discovery expects.
@@ -338,10 +378,28 @@ class DriveProviderImpl {
body: ArrayBuffer,
contentType: string = DEFAULT_BINARY_CONTENT_TYPE,
): Promise<void> {
logDriveOp('write', path);
const segments = splitSegments(path);
const name = segments.pop();
if (name === undefined)
throw new DriveHttpError(0, undefined, `Drive upload failed: empty path`);
// Fast path: a write to a path whose id is already cached PATCHes it in
// place with no lookup. The engine's steady state re-writes paths whose
// ids the preceding pull cached (config.json, library.json), so the
// per-PUT files.list was pure overhead. A stale id (deleted remotely)
// 404s: evict and fall through to the full resolve.
const cachedId = this.idCache.get(path);
if (cachedId !== undefined) {
try {
await this.uploadMedia(mediaUpdateUrl(cachedId), HTTP_PATCH, body, contentType, path);
return;
} catch (e) {
if (!(e instanceof DriveHttpError) || e.status !== HTTP_NOT_FOUND) throw e;
this.evict(path);
}
}
// Auto-create the containing chain as a backup; the engine usually calls
// ensureDir first, but a write must still materialise its parents.
const folderId = await this.resolveFolderSegments(segments, true);
@@ -369,6 +427,7 @@ class DriveProviderImpl {
}
async ensureDir(paths: string[]): Promise<void> {
logDriveOp('ensureDir', paths[paths.length - 1] ?? '');
// Create each directory's full chain (idempotent via cache + findChild). The
// engine passes ancestors top-down, so deeper paths reuse the cached parents.
for (const path of paths) {
@@ -377,6 +436,7 @@ class DriveProviderImpl {
}
async deleteDir(path: string): Promise<void> {
logDriveOp('deleteDir', path);
const folderId = await this.resolveFolderSegments(splitSegments(path), false);
// Already absent — nothing to delete (idempotent).
if (folderId === null) return;
@@ -594,6 +654,7 @@ class DriveProviderImpl {
* provider contract: the engine re-ensures dirs and retries once, then throws).
*/
async uploadStream(remotePath: string, localPath: string): Promise<boolean> {
logDriveOp('uploadStream', remotePath);
try {
const segments = splitSegments(remotePath);
const name = segments.pop();
@@ -670,6 +731,7 @@ class DriveProviderImpl {
* Returns `false` when the file is absent or the transport swallows a failure.
*/
async downloadStream(remotePath: string, localPath: string): Promise<boolean> {
logDriveOp('downloadStream', remotePath);
try {
const fileId = await this.resolveFile(remotePath);
if (fileId === null) return false;
@@ -689,6 +751,10 @@ class DriveProviderImpl {
/** Issue an authenticated Drive request, retried on transient failures. */
private async authedFetch(url: string, method: string, init?: RequestInit): Promise<Response> {
return this.withBackoff(async () => {
if (LOG_DRIVE_REQUESTS) {
driveRequestSeq += 1;
console.log(`[gdrive] #${driveRequestSeq} ${method} ${describeDriveRequest(url, method)}`);
}
const token = await this.auth.getAccessToken();
const headers: Record<string, string> = {
Authorization: `Bearer ${token}`,
@@ -12,6 +12,7 @@ import { createDriveTokenPersistence } from './driveTokenStore';
import { runDesktopDeepLinkOAuth } from './auth/oauthDesktop';
import { runAndroidOAuth } from './auth/oauthAndroid';
import { runIosOAuth } from './auth/oauthIos';
import { resetFileSyncProviderCache } from '@/services/sync/file/providerRegistry';
import { beginWebDriveRedirect, webDriveRedirectUri } from './auth/webRedirectFlow';
import { clearWebDriveToken } from './auth/webTokenStore';
import type { OAuthClientConfig } from './auth/oauthFlow';
@@ -48,6 +49,10 @@ const resolveOAuthRunner = (): ((
/** Run the platform Drive sign-in and return the connected account label. */
export const runGoogleDriveConnect = async (): Promise<ConnectGoogleDriveResult> => {
// The memoised provider holds the previous connection's auth (and its
// path->id cache, which is account-scoped under drive.file); a (re)connect
// must not keep serving it.
resetFileSyncProviderCache();
// Web: full-page redirect to Google (the popup/GIS path is broken by the
// app's COOP). This navigates away and never resolves — the token returns to
// the /gdrive-callback route, which finalizes the connection and routes back.
@@ -83,6 +88,7 @@ export const runGoogleDriveConnect = async (): Promise<ConnectGoogleDriveResult>
/** Forget the stored Drive token (the settings flag is cleared by the caller). */
export const runGoogleDriveDisconnect = async (): Promise<void> => {
resetFileSyncProviderCache();
if (isWebAppPlatform()) {
clearWebDriveToken();
return;