forked from akai/readest
Compare commits
121 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 56d6aceb0d | |||
| 598eb77237 | |||
| d326e1c73d | |||
| 1705006b6b | |||
| 952e436514 | |||
| 772bb73b46 | |||
| 5774e00c09 | |||
| f6f446e8a0 | |||
| 1eae2af23e | |||
| 295a588988 | |||
| 4110911011 | |||
| e0b3a6fb0c | |||
| c30a59a9ed | |||
| ae42dcb53a | |||
| 302363a9fd | |||
| cc8f917cdd | |||
| 51a553dd89 | |||
| 6e7c9d1395 | |||
| 2d5590ec1f | |||
| dc58d985e7 | |||
| 712d564e9d | |||
| 6bfeb295d2 | |||
| aea3fda086 | |||
| 35227ecd61 | |||
| cb30716830 | |||
| 4625e47a6d | |||
| 77a85cee09 | |||
| 53936ad17c | |||
| de6529523f | |||
| ca674bb5e7 | |||
| 981579c255 | |||
| cbdc3b8f52 | |||
| 3b348c8f35 | |||
| dd0ff6ae9d | |||
| 30dee7b909 | |||
| a272ba892a | |||
| e7f370453e | |||
| 5dc2528455 | |||
| c27245e980 | |||
| 9b0072173c | |||
| 06aec0b597 | |||
| 15c0a7a2f2 | |||
| d66fedcab7 | |||
| 43f72720f2 | |||
| 6d29814551 | |||
| ed8956e9ed | |||
| cead0f42e0 | |||
| c59097b0ac | |||
| 7bb1133706 | |||
| 8e7b2192d5 | |||
| e7564ffc27 | |||
| e0fa6230ab | |||
| f5657fb3a0 | |||
| 19f2414f42 | |||
| 19f3e65b62 | |||
| d1e7b4902c | |||
| 176e5df771 | |||
| 579e950756 | |||
| eadb355396 | |||
| 8ba052dc81 | |||
| 293d5b5f5d | |||
| fb37406b31 | |||
| 486659a1ca | |||
| 5a0a70a30a | |||
| a9684ab357 | |||
| a43845b4c5 | |||
| 1d8ed3fc92 | |||
| d609de58f0 | |||
| f9a7117253 | |||
| 234ecc3113 | |||
| dab92c8a46 | |||
| ad55375f89 | |||
| 34f19fd148 | |||
| 920627ae59 | |||
| 4b0720a3e3 | |||
| 3b03b2c8d5 | |||
| 6fbf9ef68b | |||
| ca8f0fe9f6 | |||
| 6d5e59c79a | |||
| 6fcda66b60 | |||
| 94ede10f6e | |||
| 4f55920b71 | |||
| 63b0b87028 | |||
| 17f2a17adc | |||
| e18bfd6810 | |||
| 6d798542f6 | |||
| ebbbf104b2 | |||
| fa61f40262 | |||
| b251e537d3 | |||
| aa60123d38 | |||
| 1527dd9b3a | |||
| 38d7ba80fe | |||
| 8a8fcb2611 | |||
| d488f65447 | |||
| 528a13e36a | |||
| 71371130e0 | |||
| be8b946683 | |||
| 82ece3332a | |||
| 957b7d5f3e | |||
| 5190bbcafc | |||
| 3f531d9046 | |||
| a2244e28b8 | |||
| 3bbc2071c8 | |||
| 9c273d79fc | |||
| 09b19bd3c5 | |||
| c58153e942 | |||
| ff94dc76c6 | |||
| 293cc545db | |||
| e1dad98e56 | |||
| e8f6db96e4 | |||
| b223ccaee9 | |||
| 5c97b2e9d8 | |||
| 31e44d2e4d | |||
| 976bbcc152 | |||
| 802212c423 | |||
| e858f9b23f | |||
| 3e292af990 | |||
| b0cc5461af | |||
| 7d852518a3 | |||
| 73d30c103f | |||
| 8cdf378b47 |
@@ -19,7 +19,7 @@ jobs:
|
||||
with:
|
||||
submodules: 'true'
|
||||
- name: setup sccache
|
||||
uses: mozilla-actions/sccache-action@v0.0.9
|
||||
uses: mozilla-actions/sccache-action@v0.0.10
|
||||
- name: Install minimal stable with clippy and rustfmt
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
submodules: 'true'
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v5
|
||||
uses: pnpm/action-setup@v6
|
||||
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v6
|
||||
@@ -72,18 +72,13 @@ jobs:
|
||||
run: |
|
||||
pnpm install && pnpm setup-vendors
|
||||
|
||||
- name: install LuaJIT (for koplugin lint)
|
||||
run: sudo apt-get update && sudo apt-get install -y luajit
|
||||
|
||||
- name: run format check
|
||||
run: |
|
||||
pnpm format:check || (pnpm format && git diff && exit 1)
|
||||
|
||||
- name: install playwright browsers
|
||||
working-directory: apps/readest-app
|
||||
run: npx playwright install --with-deps chromium
|
||||
|
||||
- name: run web tests
|
||||
working-directory: apps/readest-app
|
||||
run: pnpm test:pr:web
|
||||
|
||||
- name: run lint
|
||||
working-directory: apps/readest-app
|
||||
run: |
|
||||
@@ -94,6 +89,61 @@ jobs:
|
||||
run: |
|
||||
pnpm build-web && pnpm check:all
|
||||
|
||||
test_web_app:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: 'true'
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v6
|
||||
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
|
||||
- name: cache Next.js build
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: apps/readest-app/.next/cache
|
||||
key: nextjs-test-${{ github.sha }}-${{ hashFiles('pnpm-lock.yaml') }}
|
||||
restore-keys: |
|
||||
nextjs-test-${{ github.sha }}-
|
||||
nextjs-test-
|
||||
|
||||
- name: install Dependencies
|
||||
working-directory: apps/readest-app
|
||||
run: |
|
||||
pnpm install && pnpm setup-vendors
|
||||
|
||||
- name: install LuaJIT + busted (for koplugin tests)
|
||||
run: |
|
||||
sudo apt-get update
|
||||
# luajit — pnpm test:lua
|
||||
# luarocks/libsqlite3-dev — required to build lsqlite3complete
|
||||
sudo apt-get install -y luajit luarocks libsqlite3-dev
|
||||
# Install busted + the SQLite binding the LibraryStore specs use,
|
||||
# both pinned to Lua 5.1 (LuaJIT-compatible). System-wide install
|
||||
# so `luarocks --lua-version=5.1 path` (sourced by
|
||||
# scripts/test-koplugin.mjs) picks them up.
|
||||
sudo luarocks --lua-version=5.1 install busted
|
||||
sudo luarocks --lua-version=5.1 install lsqlite3complete
|
||||
|
||||
- name: install playwright browsers
|
||||
working-directory: apps/readest-app
|
||||
run: npx playwright install --with-deps chromium
|
||||
|
||||
- name: run web tests
|
||||
working-directory: apps/readest-app
|
||||
run: pnpm test:pr:web
|
||||
|
||||
- name: run koplugin tests
|
||||
working-directory: apps/readest-app
|
||||
run: pnpm test:lua
|
||||
|
||||
build_tauri_app:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
@@ -105,7 +155,7 @@ jobs:
|
||||
submodules: 'true'
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v5
|
||||
uses: pnpm/action-setup@v6
|
||||
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v6
|
||||
@@ -128,7 +178,7 @@ jobs:
|
||||
pnpm install && pnpm setup-vendors
|
||||
|
||||
- name: setup sccache
|
||||
uses: mozilla-actions/sccache-action@v0.0.9
|
||||
uses: mozilla-actions/sccache-action@v0.0.10
|
||||
|
||||
- name: install Rust toolchain
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
run: echo "PACKAGE_VERSION=$(node -p "require('./apps/readest-app/package.json').version")" >> $GITHUB_ENV
|
||||
- name: get release
|
||||
id: get-release
|
||||
uses: actions/github-script@v8
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const { data } = await github.rest.repos.getLatestRelease({
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
core.setOutput('release_tag', data.tag_name);
|
||||
- name: get release notes
|
||||
id: get-release-notes
|
||||
uses: actions/github-script@v8
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
steps:
|
||||
- name: update release
|
||||
id: update-release
|
||||
uses: actions/github-script@v8
|
||||
uses: actions/github-script@v9
|
||||
env:
|
||||
release_id: ${{ needs.get-release.outputs.release_id }}
|
||||
release_tag: ${{ needs.get-release.outputs.release_tag }}
|
||||
@@ -98,8 +98,19 @@ jobs:
|
||||
meta_file="apps/readest.koplugin/_meta.lua"
|
||||
perl -i -pe "s/^}/ version = \"${version}\",\n}/" "${meta_file}"
|
||||
|
||||
# Exclude dev-only artifacts from the published plugin zip:
|
||||
# scripts/ — i18n + build helpers
|
||||
# docs/ — design notes
|
||||
# spec/ — busted test suite
|
||||
# .busted — busted runner config
|
||||
# Mirror these in apps/readest.koplugin/scripts/build-koplugin.mjs
|
||||
# for local builds.
|
||||
cd apps
|
||||
zip -r ../${plugin_zip} readest.koplugin
|
||||
zip -r ../${plugin_zip} readest.koplugin \
|
||||
-x 'readest.koplugin/scripts/*' \
|
||||
'readest.koplugin/docs/*' \
|
||||
'readest.koplugin/spec/*' \
|
||||
'readest.koplugin/.busted'
|
||||
cd ..
|
||||
|
||||
echo "Uploading ${plugin_zip} to GitHub release"
|
||||
@@ -149,7 +160,7 @@ jobs:
|
||||
run: git submodule update --init --recursive
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v5
|
||||
uses: pnpm/action-setup@v6
|
||||
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v6
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: 'true'
|
||||
- uses: amondnet/vercel-action@v25
|
||||
- uses: amondnet/vercel-action@v42
|
||||
with:
|
||||
vercel-token: ${{ secrets.VERCEL_TOKEN }}
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -19,3 +19,6 @@
|
||||
[submodule "packages/qcms"]
|
||||
path = packages/qcms
|
||||
url = https://github.com/mozilla/pdf.js.qcms.git
|
||||
[submodule "packages/js-mdict"]
|
||||
path = packages/js-mdict
|
||||
url = https://github.com/readest/js-mdict.git
|
||||
|
||||
Generated
+310
-136
@@ -17,6 +17,7 @@ dependencies = [
|
||||
"discord-rich-presence",
|
||||
"futures",
|
||||
"futures-util",
|
||||
"libc",
|
||||
"log",
|
||||
"objc",
|
||||
"objc-foundation",
|
||||
@@ -24,10 +25,9 @@ dependencies = [
|
||||
"objc2-authentication-services",
|
||||
"objc2-foundation",
|
||||
"objc_id",
|
||||
"rand 0.8.5",
|
||||
"rand 0.8.6",
|
||||
"read-progress-stream",
|
||||
"reqwest 0.12.28",
|
||||
"rsproperties",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tauri",
|
||||
@@ -240,7 +240,7 @@ dependencies = [
|
||||
"libloading 0.8.9",
|
||||
"linkme",
|
||||
"once_cell",
|
||||
"rand 0.8.5",
|
||||
"rand 0.8.6",
|
||||
"rustc_version_runtime",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -252,6 +252,17 @@ version = "1.0.102"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
|
||||
[[package]]
|
||||
name = "apple-native-keyring-store"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7be2f067ccd8d4b4d4a66ddafe0f32a5dff31732f32dbff85fefc40929b1f72"
|
||||
dependencies = [
|
||||
"keyring-core",
|
||||
"log",
|
||||
"security-framework",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arbitrary"
|
||||
version = "1.4.2"
|
||||
@@ -640,6 +651,15 @@ dependencies = [
|
||||
"generic-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "block-padding"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"
|
||||
dependencies = [
|
||||
"generic-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "block2"
|
||||
version = "0.6.2"
|
||||
@@ -741,15 +761,6 @@ dependencies = [
|
||||
"alloc-stdlib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "built"
|
||||
version = "0.7.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.20.2"
|
||||
@@ -898,6 +909,15 @@ dependencies = [
|
||||
"toml 0.9.12+spec-1.1.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cbc"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"
|
||||
dependencies = [
|
||||
"cipher",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.58"
|
||||
@@ -1500,6 +1520,52 @@ version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376"
|
||||
|
||||
[[package]]
|
||||
name = "datasketches"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c286de4e81ea2590afc24d754e0f83810c566f50a1388fa75ebd57928c0d9745"
|
||||
|
||||
[[package]]
|
||||
name = "dbus"
|
||||
version = "0.9.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b942602992bb7acfd1f51c49811c58a610ef9181b6e66f3e519d79b540a3bf73"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"libdbus-sys",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dbus-secret-service"
|
||||
version = "4.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "708b509edf7889e53d7efb0ffadd994cc6c2345ccb62f55cfd6b0682165e4fa6"
|
||||
dependencies = [
|
||||
"aes",
|
||||
"block-padding",
|
||||
"cbc",
|
||||
"dbus",
|
||||
"fastrand",
|
||||
"hkdf",
|
||||
"num",
|
||||
"once_cell",
|
||||
"openssl",
|
||||
"sha2",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dbus-secret-service-keyring-store"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21d8f54da401bb5eb2a4d873ac4b359f4a599df2ca8634bb5b8c045e5ee78757"
|
||||
dependencies = [
|
||||
"dbus-secret-service",
|
||||
"keyring-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "default-net"
|
||||
version = "0.22.0"
|
||||
@@ -1611,6 +1677,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
||||
dependencies = [
|
||||
"block-buffer",
|
||||
"crypto-common",
|
||||
"subtle",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1958,7 +2025,6 @@ checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4"
|
||||
dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"libm",
|
||||
"rand 0.9.2",
|
||||
"siphasher 1.0.2",
|
||||
]
|
||||
|
||||
@@ -2753,8 +2819,6 @@ version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.1.5",
|
||||
]
|
||||
|
||||
@@ -2763,6 +2827,11 @@ name = "hashbrown"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
@@ -2788,6 +2857,24 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
||||
|
||||
[[package]]
|
||||
name = "hkdf"
|
||||
version = "0.12.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
|
||||
dependencies = [
|
||||
"hmac",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hmac"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
|
||||
dependencies = [
|
||||
"digest",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "home"
|
||||
version = "0.5.12"
|
||||
@@ -2956,15 +3043,6 @@ dependencies = [
|
||||
"windows-registry 0.6.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyperloglogplus"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "621debdf94dcac33e50475fdd76d34d5ea9c0362a834b9db08c3024696c1fbe3"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.65"
|
||||
@@ -2977,7 +3055,7 @@ dependencies = [
|
||||
"js-sys",
|
||||
"log",
|
||||
"wasm-bindgen",
|
||||
"windows-core 0.62.2",
|
||||
"windows-core 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3184,6 +3262,7 @@ version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
|
||||
dependencies = [
|
||||
"block-padding",
|
||||
"generic-array",
|
||||
]
|
||||
|
||||
@@ -3196,6 +3275,15 @@ dependencies = [
|
||||
"memoffset",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "inventory"
|
||||
version = "0.3.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "io-uring"
|
||||
version = "0.7.11"
|
||||
@@ -3405,6 +3493,15 @@ dependencies = [
|
||||
"unicode-segmentation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "keyring-core"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb1e621458ca9c51aa110bd0339d4751a056b9576bf1253aee1aa560dda0fc9d"
|
||||
dependencies = [
|
||||
"log",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kqueue"
|
||||
version = "1.1.1"
|
||||
@@ -3491,6 +3588,16 @@ version = "0.2.183"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
|
||||
|
||||
[[package]]
|
||||
name = "libdbus-sys"
|
||||
version = "0.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"pkg-config",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
version = "0.7.4"
|
||||
@@ -3636,11 +3743,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.12.5"
|
||||
version = "0.16.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
|
||||
checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39"
|
||||
dependencies = [
|
||||
"hashbrown 0.15.5",
|
||||
"hashbrown 0.16.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3651,9 +3758,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
|
||||
|
||||
[[package]]
|
||||
name = "lz4_flex"
|
||||
version = "0.11.6"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a"
|
||||
checksum = "db9a0d582c2874f68138a16ce1867e0ffde6c0bb0a0df85e1f36d04146db488a"
|
||||
|
||||
[[package]]
|
||||
name = "mac"
|
||||
@@ -4104,6 +4211,20 @@ dependencies = [
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
"num-rational",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
@@ -4114,6 +4235,15 @@ dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-conv"
|
||||
version = "0.2.1"
|
||||
@@ -4129,6 +4259,28 @@ dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.19"
|
||||
@@ -4136,7 +4288,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"libm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4507,9 +4658,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "openssl"
|
||||
version = "0.10.76"
|
||||
version = "0.10.78"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf"
|
||||
checksum = "f38c4372413cdaaf3cc79dd92d29d7d9f5ab09b51b10dded508fb90bb70b9222"
|
||||
dependencies = [
|
||||
"bitflags 2.11.0",
|
||||
"cfg-if",
|
||||
@@ -4548,9 +4699,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "openssl-sys"
|
||||
version = "0.9.112"
|
||||
version = "0.9.114"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb"
|
||||
checksum = "13ce1245cd07fcc4cfdb438f7507b0c7e4f3849a69fd84d52374c66d83741bb6"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
@@ -4565,6 +4716,15 @@ version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
||||
|
||||
[[package]]
|
||||
name = "ordered-float"
|
||||
version = "5.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ordered-multimap"
|
||||
version = "0.7.3"
|
||||
@@ -4858,7 +5018,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
|
||||
dependencies = [
|
||||
"phf_shared 0.10.0",
|
||||
"rand 0.8.5",
|
||||
"rand 0.8.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4868,7 +5028,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
|
||||
dependencies = [
|
||||
"phf_shared 0.11.3",
|
||||
"rand 0.8.5",
|
||||
"rand 0.8.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -5081,12 +5241,6 @@ version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
|
||||
|
||||
[[package]]
|
||||
name = "pretty-hex"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a65843dfefbafd3c879c683306959a6de478443ffe9c9adf02f5976432402d7"
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
@@ -5197,7 +5351,7 @@ dependencies = [
|
||||
"bit-vec",
|
||||
"bitflags 2.11.0",
|
||||
"num-traits",
|
||||
"rand 0.9.2",
|
||||
"rand 0.9.3",
|
||||
"rand_chacha 0.9.0",
|
||||
"rand_xorshift",
|
||||
"regex-syntax",
|
||||
@@ -5294,7 +5448,7 @@ checksum = "95c589f335db0f6aaa168a7cd27b1fc6920f5e1470c804f814d9cd6e62a0f70b"
|
||||
dependencies = [
|
||||
"env_logger",
|
||||
"log",
|
||||
"rand 0.10.0",
|
||||
"rand 0.10.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -5337,7 +5491,7 @@ dependencies = [
|
||||
"bytes",
|
||||
"getrandom 0.3.4",
|
||||
"lru-slab",
|
||||
"rand 0.9.2",
|
||||
"rand 0.9.3",
|
||||
"ring",
|
||||
"rustc-hash 2.1.2",
|
||||
"rustls",
|
||||
@@ -5406,9 +5560,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.8.5"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rand_chacha 0.3.1",
|
||||
@@ -5417,9 +5571,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.9.2"
|
||||
version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
|
||||
checksum = "7ec095654a25171c2124e9e3393a930bddbffdc939556c914957a4c3e0a87166"
|
||||
dependencies = [
|
||||
"rand_chacha 0.9.0",
|
||||
"rand_core 0.9.5",
|
||||
@@ -5427,9 +5581,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"rand_core 0.10.0",
|
||||
@@ -5498,16 +5652,6 @@ version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba"
|
||||
|
||||
[[package]]
|
||||
name = "rand_distr"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
"rand 0.8.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_hc"
|
||||
version = "0.2.0"
|
||||
@@ -5842,20 +5986,6 @@ dependencies = [
|
||||
"byteorder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rsproperties"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b98d55abde44982a00d67a84809166ea8f5c143abc86818f555485f19766cfe4"
|
||||
dependencies = [
|
||||
"log",
|
||||
"pretty-hex",
|
||||
"rustix 1.1.4",
|
||||
"thiserror 2.0.18",
|
||||
"zerocopy",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rust-ini"
|
||||
version = "0.21.3"
|
||||
@@ -5886,7 +6016,7 @@ dependencies = [
|
||||
"borsh",
|
||||
"bytes",
|
||||
"num-traits",
|
||||
"rand 0.8.5",
|
||||
"rand 0.8.6",
|
||||
"rkyv",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -6015,9 +6145,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
|
||||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
version = "0.103.10"
|
||||
version = "0.103.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef"
|
||||
checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06"
|
||||
dependencies = [
|
||||
"ring",
|
||||
"rustls-pki-types",
|
||||
@@ -6502,7 +6632,7 @@ dependencies = [
|
||||
"generator",
|
||||
"hex",
|
||||
"owo-colors",
|
||||
"rand 0.8.5",
|
||||
"rand 0.8.6",
|
||||
"rand_core 0.6.4",
|
||||
"rand_pcg 0.3.1",
|
||||
"scoped-tls",
|
||||
@@ -6576,9 +6706,9 @@ checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
|
||||
|
||||
[[package]]
|
||||
name = "sketches-ddsketch"
|
||||
version = "0.3.1"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c6f73aeb92d671e0cc4dca167e59b2deb6387c375391bc99ee743f326994a2b"
|
||||
checksum = "05e40b6cf54d988dc1a2223531b969c9a9e30906ad90ef64890c27b4bfbb46ea"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
@@ -6916,9 +7046,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tantivy"
|
||||
version = "0.25.0"
|
||||
version = "0.26.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "502915c7381c5cb2d2781503962610cb880ad8f1a0ca95df1bae645d5ebf2545"
|
||||
checksum = "edde6a10743fff00a4e1a8c9ef020bf5f3cbad301b7d2d39f2b07f123c4eac07"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"arc-swap",
|
||||
@@ -6929,12 +7059,12 @@ dependencies = [
|
||||
"census",
|
||||
"crc32fast",
|
||||
"crossbeam-channel",
|
||||
"datasketches",
|
||||
"downcast-rs",
|
||||
"fastdivide",
|
||||
"fnv",
|
||||
"fs4",
|
||||
"htmlescape",
|
||||
"hyperloglogplus",
|
||||
"itertools 0.14.0",
|
||||
"levenshtein_automata",
|
||||
"log",
|
||||
@@ -6962,24 +7092,25 @@ dependencies = [
|
||||
"tempfile",
|
||||
"thiserror 2.0.18",
|
||||
"time",
|
||||
"typetag",
|
||||
"uuid 1.23.0",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tantivy-bitpacker"
|
||||
version = "0.9.0"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3b04eed5108d8283607da6710fe17a7663523440eaf7ea5a1a440d19a1448b6"
|
||||
checksum = "4fed3d674429bcd2de5d0a6d1aa5495fed8afd9c5ecce993019caf7615f53fa4"
|
||||
dependencies = [
|
||||
"bitpacking",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tantivy-columnar"
|
||||
version = "0.6.0"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b628488ae936c83e92b5c4056833054ca56f76c0e616aee8339e24ac89119cd"
|
||||
checksum = "c57166f5bcfd478f370ab8445afb4678dce44801fa5ce5c451aaf8595583c5dc"
|
||||
dependencies = [
|
||||
"downcast-rs",
|
||||
"fastdivide",
|
||||
@@ -6993,9 +7124,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tantivy-common"
|
||||
version = "0.10.0"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f880aa7cab0c063a47b62596d10991cdd0b6e0e0575d9c5eeb298b307a25de55"
|
||||
checksum = "bbf10915aa75da3c3b0d58b58853d2e889efbaf32d4982a4c3715dde6bba23e5"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"byteorder",
|
||||
@@ -7017,20 +7148,22 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tantivy-query-grammar"
|
||||
version = "0.25.0"
|
||||
version = "0.26.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "768fccdc84d60d86235d42d7e4c33acf43c418258ff5952abf07bd7837fcd26b"
|
||||
checksum = "dfadb8526b6da90704feb293b0701a6aae62ea14983143344be2dc5ce30f1d82"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"nom",
|
||||
"ordered-float",
|
||||
"serde",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tantivy-sstable"
|
||||
version = "0.6.0"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8292095d1a8a2c2b36380ec455f910ab52dde516af36321af332c93f20ab7d5"
|
||||
checksum = "8a2cfc3ac5164cbadc28965ffb145a8f47582a60ae5897859ad8d4316596c606"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"itertools 0.14.0",
|
||||
@@ -7042,20 +7175,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tantivy-stacker"
|
||||
version = "0.6.0"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23d38a379411169f0b3002c9cba61cdfe315f757e9d4f239c00c282497a0749d"
|
||||
checksum = "6cbb051742da9d53ca9e8fff43a9b10e319338b24e2c0e15d0372df19ffeb951"
|
||||
dependencies = [
|
||||
"murmurhash32",
|
||||
"rand_distr",
|
||||
"tantivy-common",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tantivy-tokenizer-api"
|
||||
version = "0.6.0"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23024f6aeb25ceb1a0e27740c84bdb0fae52626737b7e9a9de6ad5aa25c7b038"
|
||||
checksum = "eac258c2c6390673f2685813afeeafcb8c4e0ee7de8dd3fc46838dcc37263f98"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
@@ -7459,12 +7591,16 @@ dependencies = [
|
||||
name = "tauri-plugin-native-bridge"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"apple-native-keyring-store",
|
||||
"dbus-secret-service-keyring-store",
|
||||
"font-enumeration",
|
||||
"keyring-core",
|
||||
"schemars 0.8.22",
|
||||
"serde",
|
||||
"tauri",
|
||||
"tauri-plugin",
|
||||
"thiserror 2.0.18",
|
||||
"windows-native-keyring-store",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -7719,7 +7855,7 @@ dependencies = [
|
||||
"futures-util",
|
||||
"http",
|
||||
"log",
|
||||
"rand 0.9.2",
|
||||
"rand 0.9.3",
|
||||
"rustls",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -8389,7 +8525,7 @@ dependencies = [
|
||||
"http",
|
||||
"httparse",
|
||||
"log",
|
||||
"rand 0.9.2",
|
||||
"rand 0.9.3",
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
"sha1",
|
||||
@@ -8399,22 +8535,23 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eba6fdaa82f9c1a2c29f833863039f3b5999141c48ce012c7a5f958c6b0e5331"
|
||||
checksum = "717aeedc30aaadbb60200f3d1ae012f77ac31adf9c21befcbb97705a880101de"
|
||||
dependencies = [
|
||||
"thiserror 2.0.18",
|
||||
"tracing",
|
||||
"tracing-subscriber",
|
||||
"turso_core",
|
||||
"turso_sdk_kit",
|
||||
"turso_sync_sdk_kit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "turso_core"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8c4943fe5c20ef583e282be3036c78066bbe1e21a92400e3987a60cbec5ba4eb"
|
||||
checksum = "69d7452e70e648f602977b0d7eed879f0fd081c7d8656c1575e715b25dacdcb1"
|
||||
dependencies = [
|
||||
"aegis",
|
||||
"aes",
|
||||
@@ -8424,7 +8561,6 @@ dependencies = [
|
||||
"bigdecimal",
|
||||
"bitflags 2.11.0",
|
||||
"branches",
|
||||
"built",
|
||||
"bumpalo",
|
||||
"bytemuck",
|
||||
"cfg_aliases",
|
||||
@@ -8449,7 +8585,7 @@ dependencies = [
|
||||
"parking_lot",
|
||||
"pastey",
|
||||
"polling",
|
||||
"rand 0.9.2",
|
||||
"rand 0.9.3",
|
||||
"rapidhash",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
@@ -8479,9 +8615,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso_ext"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ff53b440c4ce577e6818bbeed5c80d6e5269325c9c80ab27611d63aec6f8fe88"
|
||||
checksum = "93ae4c4d4f34cdf6bb1abcbedda965d6ea41fcc6f3f768b8ad9c48a5075c92ad"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"getrandom 0.3.4",
|
||||
@@ -8490,9 +8626,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso_macros"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b378c705d73d5b7a93e204f382c109fcc8bae51d973c7a230f7448301347a3d"
|
||||
checksum = "72790684c2bd254199a0c28161066fcef737bdb28b0f15bc709f34d8872ec7af"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -8501,9 +8637,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso_parser"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "75ad6300cd2e8db5abf720e9a848e774119cfd92591574a5adef7d0cf6c85b7d"
|
||||
checksum = "04b2bcf69b09f606ee4afbfa0da93f18b283591179c43dd3bab38c3697ccfc5c"
|
||||
dependencies = [
|
||||
"bitflags 2.11.0",
|
||||
"memchr",
|
||||
@@ -8516,9 +8652,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso_sdk_kit"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02c0c1805df4b910842a64a4781eea9ae32dff8cc4a76062fde4d1480500ad02"
|
||||
checksum = "754696f9f85d719ea1c7435adfdfb3df9a7e0fe0cd0a57b722f83eb5bf5bb1c1"
|
||||
dependencies = [
|
||||
"bindgen",
|
||||
"env_logger",
|
||||
@@ -8532,9 +8668,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso_sdk_kit_macros"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2c039361501250406c6e2e298edd71378651166cbd2c35bbeb7086404258298"
|
||||
checksum = "4a4502f655978c709cd134d8a6bdc943896a130218c4e06c58874fcdd3951b4c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -8543,9 +8679,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso_sync_engine"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "15b0ee5a4535e53c7a0adb9b64d27199cdf045cdbe6bef886bc5e7d4aa23a54a"
|
||||
checksum = "81cd73365473ec01444cb03b5411dbbae13349a4482ddcffae930f401f0609a9"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"bytes",
|
||||
@@ -8565,9 +8701,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "turso_sync_sdk_kit"
|
||||
version = "0.6.0-pre.14"
|
||||
version = "0.6.0-pre.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c9e0415133b7ab1690dc4117f881eef57044472ba14206ef3958fed6d2369e6"
|
||||
checksum = "82ecb9797149d0ced70c488834f6c962e15ebae9567cdf24c816e5c04e4d7f66"
|
||||
dependencies = [
|
||||
"bindgen",
|
||||
"env_logger",
|
||||
@@ -8588,7 +8724,7 @@ version = "2.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c"
|
||||
dependencies = [
|
||||
"rand 0.9.2",
|
||||
"rand 0.9.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -8603,6 +8739,30 @@ version = "1.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
|
||||
|
||||
[[package]]
|
||||
name = "typetag"
|
||||
version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be2212c8a9b9bcfca32024de14998494cf9a5dfa59ea1b829de98bac374b86bf"
|
||||
dependencies = [
|
||||
"erased-serde",
|
||||
"inventory",
|
||||
"once_cell",
|
||||
"serde",
|
||||
"typetag-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typetag-impl"
|
||||
version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "27a7a9b72ba121f6f1f6c3632b85604cac41aedb5ddc70accbebb6cac83de846"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ucd-trie"
|
||||
version = "0.1.7"
|
||||
@@ -9312,19 +9472,6 @@ dependencies = [
|
||||
"windows-strings 0.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.62.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
|
||||
dependencies = [
|
||||
"windows-implement 0.60.2",
|
||||
"windows-interface 0.59.3",
|
||||
"windows-link 0.2.1",
|
||||
"windows-result 0.4.1",
|
||||
"windows-strings 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-future"
|
||||
version = "0.2.1"
|
||||
@@ -9414,6 +9561,19 @@ version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
|
||||
|
||||
[[package]]
|
||||
name = "windows-native-keyring-store"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5fd986f648459dd29aa252ed3a5ad11a60c0b1251bf81625fb03a86c69d274e"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"keyring-core",
|
||||
"regex",
|
||||
"windows-sys 0.61.2",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-numerics"
|
||||
version = "0.2.0"
|
||||
@@ -10197,6 +10357,20 @@ name = "zeroize"
|
||||
version = "1.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
|
||||
dependencies = [
|
||||
"zeroize_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zeroize_derive"
|
||||
version = "1.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerotrie"
|
||||
|
||||
@@ -19,9 +19,12 @@
|
||||
## Feature Notes
|
||||
- [D-pad Navigation](dpad-navigation.md) — Android TV remote / keyboard arrow navigation design, key files, and pitfalls
|
||||
- [Cloudflare Workers WebSocket](cloudflare-workers-websocket.md) — use fetch() Upgrade pattern (not `ws` npm); CF delivers binary frames as Blob (must serialize async decodes)
|
||||
- [Share-a-Book Feature (in progress)](share-feature.md) — locked decisions for the /s/{token} share-link feature; plan at ~/.claude/plans/ok-we-will-learn-cosmic-acorn.md
|
||||
- [readest.koplugin i18n](koplugin-i18n.md) — gettext loader at `apps/readest.koplugin/i18n.lua`, `.po` catalog at `locales/<i18next-code>/translation.po`, extract/apply scripts in `scripts/`
|
||||
|
||||
## Patterns
|
||||
- [Virtuoso + OverlayScrollbars](virtuoso_overlayscrollbars.md) — useOverlayScrollbars hook integration for overlay scrollbars on mobile webviews
|
||||
- [Design system → DESIGN.md](feedback_design_system_doc.md) — codify recurring UI/UX rules in `apps/readest-app/DESIGN.md`; never `pl/pr/ml/mr/text-left/text-right` (RTL); §5 boxed list anatomy has uniform `min-h-14` rows and chromeless controls
|
||||
|
||||
## Architecture Notes
|
||||
- foliate-js is a git submodule at `packages/foliate-js/`
|
||||
@@ -39,3 +42,6 @@
|
||||
- [Upgrade gstack locally](feedback_gstack_upgrade.md) — always upgrade from the project's .claude/skills/gstack, not global
|
||||
- [No lookbehind regex](feedback_no_lookbehind_regex.md) — never use `(?<=)` or `(?<!)` in JS/TS; build check rejects them
|
||||
- [Use worktree](feedback_use_worktree.md) — never `git worktree add` directly; always `pnpm worktree:new` before PR review, issue fix, or feature work
|
||||
- [en/translation.json holds ONLY plural variants + proper nouns](feedback_en_plurals_manual.md) — non-plural strings stay out (defaultValue: key is the en source); plural strings (`_('...', { count })`) need hand-added `_one`/`_other` entries or the singular renders as "1 days"
|
||||
- [Never push on every change](feedback_dont_push_every_change.md) — hold pushes during active bug iteration; commit locally only until user confirms or work hits a clean done-state
|
||||
- [No test seams in production code](feedback_no_test_seams_in_prod.md) — production must never import or call `__reset*ForTests`; cross-module test resets belong in the test file's beforeEach/afterEach
|
||||
|
||||
@@ -98,7 +98,14 @@
|
||||
|
||||
**Fix Strategy:** Use physical `view.renderer.page`/`view.renderer.pages` instead of estimated section metadata. Check boundary conditions (0-indexed vs 1-indexed, inclusive vs exclusive).
|
||||
|
||||
### 11. Multiview Paginator Side Effects
|
||||
### 11. Debounced State Stale on User-Initiated Layout Change
|
||||
**Pattern:** A scroll/resize handler is debounced for performance, but during the debounce window any code path that re-runs layout based on saved state (e.g. `#anchor`, `#primaryIndex`) sees stale values.
|
||||
**Example:**
|
||||
- Scrolled-mode toggle reverted to previous chapter (#3987): the paginator's scroll handler is debounced 250 ms, so toggling `flow=scrolled → flow=paginated` within that window made `render() → scrollToAnchor(#anchor)` restore the anchor from before the user scrolled into the next section. Both `#anchor` and `#primaryIndex` were stale together, sending the position back.
|
||||
|
||||
**Fix Strategy:** When an external trigger forces a re-render (here, `setAttribute('flow', ...)`), flush the debounced state synchronously *before* changing the layout. In paginator.js this means overriding `setAttribute` and calling `#detectPrimaryView()` + `#getVisibleRange()` while `this.scrolled` is still true.
|
||||
|
||||
### 12. Multiview Paginator Side Effects
|
||||
**Pattern:** The multiview paginator (e925e9d+) loads adjacent sections in background. Events from these loads can interfere with user interactions on the primary section.
|
||||
**Examples:**
|
||||
- `load` event from adjacent section triggers `docLoadHandler` which re-adds ALL annotations, overwriting drag edits
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
name: Design rules live in DESIGN.md
|
||||
description: Readest has a design system doc — codify recurring UI/UX rules there, don't just apply them ad-hoc. Memory points at the canonical location and the patterns it covers.
|
||||
type: feedback
|
||||
originSessionId: 85757e57-a029-40f8-b098-88039c43514b
|
||||
---
|
||||
The project's design system is documented at `apps/readest-app/DESIGN.md`.
|
||||
**When the user articulates a UI/UX rule** ("X should always Y", "we follow Z
|
||||
convention"), add it to DESIGN.md so it persists for the team and for future
|
||||
sessions — don't just apply it inline and move on.
|
||||
|
||||
**Why:** Readest's UI is Adwaita-aligned, e-ink-first, cross-platform-aware.
|
||||
A doc'd system avoids drift across panels and gives reviewers a reference
|
||||
point. The user explicitly asked to "remember the UI/UX rules somewhere"
|
||||
when refining the OPDS Integration sub-page.
|
||||
|
||||
**How to apply:** When the user surfaces a new rule:
|
||||
1. Add it to the appropriate `DESIGN.md` section (numbered principles in §2,
|
||||
anatomy details in §5, anti-patterns in §10).
|
||||
2. Cross-reference from related sections so it's discoverable from multiple
|
||||
entry points.
|
||||
3. Save the actual code change reference if it captures a canonical example.
|
||||
|
||||
**Rules already codified there (don't re-invent — reference instead):**
|
||||
- §2.1–2.7: surface continuity, color discipline, two-step depth, localized
|
||||
hover, motion=color, eink-first, focus visibility.
|
||||
- §2.8: RTL — always use logical properties (`ps`/`pe`/`ms`/`me`/`text-start`
|
||||
/`text-end`/`border-s`/`border-e`/`start-*`/`end-*`). Never `pl`/`pr`/`ml`
|
||||
/`mr`/`text-left`/`text-right`/`left-*`/`right-*`. The user is strict on
|
||||
this — Readest ships RTL languages.
|
||||
- §2.9: every panel/sub-page must open with title + one-line description.
|
||||
- §3: surface tier hierarchy (window/view/card → base-200/100-tinted/100).
|
||||
- §4: action vocabulary (Accent CTA, Suggested, Flat, Pill, Destructive,
|
||||
ListExtension).
|
||||
- §5: boxed list anatomy + uniform row height (`min-h-14 items-center`,
|
||||
never `py-3`) + chromeless controls inside the box + end-aligned values
|
||||
with custom `<MdArrowDropDown>` icon (don't trust daisyui's bg-image
|
||||
chevron for trailing-edge alignment).
|
||||
- §8: e-ink overlay rules.
|
||||
- §10: anti-pattern catalog with real before/after examples.
|
||||
|
||||
**Common file paths to remember:**
|
||||
- `apps/readest-app/DESIGN.md` — source of truth.
|
||||
- `apps/readest-app/src/components/settings/SubPageHeader.tsx` — title +
|
||||
description sub-page primitive that embodies §2.9.
|
||||
- `apps/readest-app/src/components/settings/integrations/` — the canonical
|
||||
reference implementation of the boxed-list-with-rows pattern.
|
||||
- `apps/readest-app/src/styles/globals.css` — eink overlay rules at
|
||||
`[data-eink='true']`.
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
name: Don't push on every change
|
||||
description: Commit when work is done; don't auto-push every iteration during active debugging
|
||||
type: feedback
|
||||
originSessionId: 49a72b36-8f45-4a57-87e1-e10563bac47a
|
||||
---
|
||||
Don't `git push` after each commit while a bug is being actively iterated on. Commit locally as needed but hold the push.
|
||||
|
||||
**Why:** When a fix doesn't actually solve the user-reported bug, every push is wasted CI cycles + remote churn the user has to look past on the PR. The user is testing live and will tell us when something's actually verified.
|
||||
|
||||
**How to apply:** During debugging or fix iterations on a single user-reported bug, commit locally only. Push when (a) the user confirms the fix works, (b) the user explicitly asks to push, or (c) we hit a clean done-state on a multi-step task. New commits + lint/test green is not enough.
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
name: en/translation.json holds ONLY plural variants and proper-noun overrides
|
||||
description: For non-plural strings, do NOT add to en/translation.json — the source-code key IS the en value via `defaultValue: key`. ONLY plural strings need explicit `_one`/`_other` entries in en, because i18next needs the forms to pick from.
|
||||
type: feedback
|
||||
originSessionId: e4ddc690-b1a9-4557-855f-d4e67055824f
|
||||
---
|
||||
|
||||
**Rule:** `public/locales/en/translation.json` is hand-curated and contains essentially two kinds of entries:
|
||||
|
||||
1. **Plural variants** (`<base>_one`, `<base>_other`, and locale-specific `_few`/`_many`/etc. as needed by CLDR). i18next MUST find these to know which form to render — without them, `count: 1` falls back to the bare key like `{{count}} days` and renders "1 days" instead of "1 day".
|
||||
2. **Proper-noun overrides** (e.g., font names like `LXGW WenKai GB Screen`) where the en value differs from the key.
|
||||
|
||||
Everything else — ordinary translatable strings like `Sign in to share books` — does NOT belong in en/translation.json. The translation hook calls `t(key, { defaultValue: key, ...options })`, so for any string not in en/translation.json, i18next renders the key itself. That's why a 51-key en file works for a codebase with thousands of `_()` callsites.
|
||||
|
||||
**Why en is hand-curated:** the project's `i18next-scanner.config.cjs` lists every locale EXCEPT `en` in its `lngs` array. The scanner generates `__STRING_NOT_TRANSLATED__` placeholders only for the listed locales; `en` is never touched.
|
||||
|
||||
**Workflow when adding `_(...)` calls:**
|
||||
|
||||
- **Non-plural string** (e.g. `_('Sign in to share books')`): add the `_(...)` call, run `pnpm run i18n:extract`, translate the new placeholders in non-en locales. **Do NOT touch `en/translation.json`** — the key itself is the en value.
|
||||
- **Plural string** (e.g. `_('{{count}} days', { count: n })`): same as above, PLUS hand-add `<base>_one` and `<base>_other` to `en/translation.json` (and `_few`/`_many`/etc. only if the source language ever needs them, which English doesn't). Convention from existing entries (e.g., `Are you sure to delete {{count}} selected book(s)?_one` → `Are you sure to delete {{count}} selected book?`): keep `{{count}}` interpolated even in `_one`, and swap any `(s)` placeholder to the proper singular/plural noun.
|
||||
|
||||
**Audit script:** walk `src/`, regex-match `_('...', { ..., count: ... })`, for each base key verify both `<base>_one` and `<base>_other` exist in `en/translation.json`. (See conversation history for an implementation.)
|
||||
|
||||
**Where this bit us:**
|
||||
|
||||
- Initial bug: `_('{{count}} days', { count: n })` rendered "1 days" because en had no `_one` form.
|
||||
- Audit found 16 missing en plural keys from earlier PRs (OPDS / TTS / dictionary import) silently rendering wrong.
|
||||
- Then overcorrected and added non-plural keys like `Sign in to share books` to en/translation.json — wrong, breaks the project's convention. en stays clean for non-plural strings.
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
name: No test seams in production code
|
||||
description: Never import or call `__reset*ForTests` (or any test-only helper) from production modules — keep test orchestration on the test side
|
||||
type: feedback
|
||||
originSessionId: 49a72b36-8f45-4a57-87e1-e10563bac47a
|
||||
---
|
||||
Production code must never import or call functions named `__reset*ForTests`
|
||||
(or any other test-only seam). If a `__resetXForTests` function in module A
|
||||
needs to also clear state owned by module B, the test file is responsible
|
||||
for calling both resets — not module A's reset chaining into module B's.
|
||||
|
||||
**Why:** Importing a test-only helper into a production module pulls the
|
||||
test seam into the prod import graph, blurs the test/prod boundary, and
|
||||
risks the helper being shipped or mistakenly called at runtime. Caught
|
||||
once in `src/services/sync/replicaSync.ts` where
|
||||
`__resetReplicaSyncForTests` had been changed to call
|
||||
`__resetSettledEventsForTests` from `@/utils/event` for "convenience."
|
||||
|
||||
**How to apply:**
|
||||
- A `__resetXForTests` function should clear ONLY its own module's state.
|
||||
- If a test needs a coordinated reset across modules, do it in the test
|
||||
file's `beforeEach` / `afterEach` — call each module's seam directly.
|
||||
- Never `import { __reset...ForTests }` inside `src/` outside of
|
||||
`src/__tests__/`. A grep `grep -rn "__reset.*ForTests" src/ --include="*.ts" --include="*.tsx" | grep -v __tests__ | grep -v "^.*export const __reset"` should return zero hits.
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
name: readest.koplugin i18n system
|
||||
description: Custom gettext loader, .po catalog layout, and extract/apply scripts for the KOReader plugin at apps/readest.koplugin/
|
||||
type: reference
|
||||
originSessionId: 08cfd0cd-b710-4674-9c90-d2ae4827d071
|
||||
---
|
||||
The KOReader plugin (`apps/readest.koplugin/`) has its own gettext-based i18n system, parallel to but separate from the readest-app i18next setup.
|
||||
|
||||
## Loader
|
||||
|
||||
- File: `apps/readest.koplugin/i18n.lua` — isolated module, returns a callable table via `setmetatable({}, {__call = ...})`, so `_("msg")` syntax works as a drop-in replacement for `require("gettext")`. Provides `ngettext`/`pgettext`/`npgettext` too. Falls back to KOReader's native `gettext` for missing strings.
|
||||
- All Lua sources do `local _ = require("i18n")` (not `require("gettext")`).
|
||||
- **Never rename `i18n.lua` to `gettext.lua`** — it would shadow KOReader's module via `require("gettext")` and break the fallback chain (recursive require / never loaded).
|
||||
|
||||
## Catalog layout
|
||||
|
||||
- `apps/readest.koplugin/locales/<lang>/translation.po` — mirrors `apps/readest-app/public/locales/<lang>/translation.json` exactly, using **i18next-style codes** (`zh-CN`, not `zh_CN`).
|
||||
- The loader converts KOReader's locale (e.g. `zh_CN.utf8` → `zh-CN`) before lookup.
|
||||
- Fallback chain: full code → base lang (`pt_BR` → `pt`) → `zh-CN` for any unspecified zh variant.
|
||||
- Language list is the single source of truth at `apps/readest-app/i18next-scanner.config.cjs` (`options.lngs`) — currently 31 languages.
|
||||
|
||||
## Scripts (in `apps/readest.koplugin/scripts/`)
|
||||
|
||||
- **`extract-i18n.js`** — primary tool. Run with `node scripts/extract-i18n.js`. Scans `*.lua` for `_("...")`, `_('...')`, and `_([[...]])` (with proper Lua-escape handling), reads each `.po`, **preserves existing translations**, adds new msgids with empty `msgstr`, drops obsolete msgids. Idempotent.
|
||||
- **`apply-translations.js`** — bulk applier. Reads `/tmp/koplugin-translations/<lang>.json` files (key = msgid, value = translation) and fills empty `msgstr ""` lines only — **never overwrites** existing translations.
|
||||
|
||||
## Workflow for adding/changing strings
|
||||
|
||||
1. Edit Lua source(s). Use `_("Foo")` or `T(_("Foo %1"), arg)` (`T` from `require("ffi/util").template`) — **never** `_("Foo ") .. arg`, because RTL/verb-final languages can't reorder the placeholder.
|
||||
2. `node scripts/extract-i18n.js` — adds new empty msgids, drops obsolete.
|
||||
3. To translate: drop `<lang>.json` files into `/tmp/koplugin-translations/`, then `node scripts/apply-translations.js`.
|
||||
4. Verify with `luac -p apps/readest.koplugin/*.lua` and re-run `extract-i18n.js` (should report no changes — idempotency check).
|
||||
|
||||
## Translation conventions
|
||||
|
||||
- Brand names "Readest" and "KOReader" stay untranslated.
|
||||
- Technical terms ("PDF", "API", "URL", "Supabase", "Hash") generally kept as-is, sometimes transliterated in non-Latin scripts.
|
||||
- Dialog title = title case (`Sync Info`); menu item label = sentence case (`Sync info`).
|
||||
- Lower-confidence translations (bo, si, ta, bn, sl, fa) deserve native-speaker review.
|
||||
|
||||
## Storage conventions for plugin state
|
||||
|
||||
- Global plugin state: `G_reader_settings:saveSetting("readest_sync", settings)` — login tokens, auto-sync flag, etc.
|
||||
- Per-book state: `ui.doc_settings:readSetting("readest_sync")` table — keys like `meta_hash_v1`, `last_synced_at_config`, `last_synced_at_notes` (seconds since epoch).
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
name: Share-a-Book Feature (in progress)
|
||||
description: Active implementation of /s/{token} share links + cherry-picks (CFI auto-include, 1-tap library import, branded OG images). All locked decisions and the plan file path.
|
||||
type: project
|
||||
originSessionId: e4ddc690-b1a9-4557-855f-d4e67055824f
|
||||
---
|
||||
Active feature on branch `dev` as of 2026-05-02. Plan file: `/Users/chrox/.claude/plans/ok-we-will-learn-cosmic-acorn.md` (always read for source of truth before continuing).
|
||||
|
||||
**Why:** complement just-shipped annotation deep-links (PRs #4018, #4019) with whole-book sharing. Cloud-sync infra exists; this layers public time-limited links on top.
|
||||
|
||||
**How to apply:** these decisions are locked across CEO + eng + design reviews. Do NOT re-litigate when implementing.
|
||||
|
||||
## Locked decisions (authoritative)
|
||||
|
||||
- **Universal 7-day cap** on share expiry, no tier differentiation, no "Never". All users pick `[1, 3, 7]` days. DMCA-risk reduction.
|
||||
- **App Router** for all share routes (mirrors `/o` precedent + recent Stripe / AI / IAP / OPDS). Pages API `storage/*` neighbors stay where they are.
|
||||
- **Single non-dynamic landing page** at `src/app/s/page.tsx` + rewrite `'/s/:token' → '/s?token=:token'` in `next.config.mjs`. Mirrors `/o`'s pattern exactly. Avoids `[token]` dynamic-segment trap under `output: 'export'`.
|
||||
- **R2 server-side byte-copy** for `/import` (recipient-side library import). NOT a reference. Preserves invariant that every `files` row's `file_key` starts with that row's `user_id` — keeps stats / purge / delete / download routes working unchanged.
|
||||
- **`token_hash` (sha256) in DB**, never the raw token. Raw token shown to user once at create.
|
||||
- **Live `(user_id, book_hash)` resolution** at every access (no FK to `files`). Re-uploads of the same hash follow the share automatically.
|
||||
- **GET `/download` is a 302 redirect with NO DB writes**. Count via separate `POST /download/confirm` so unfurlers / prefetchers can't inflate counts.
|
||||
- **Atomic SQL `download_count = download_count + 1`**, not read-modify-write.
|
||||
- **Per-user 50-share cap**, enforced at create-time.
|
||||
- **Auth detection on /s landing**: server-render via Supabase auth cookie in `app/s/layout.tsx`. No layout shift. Falls back to anonymous flow + post-hydration upgrade if SSR fails.
|
||||
- **Cover-less `og.png` fallback**: text-only display-type card. NO placeholder rectangle, NO procedural pattern.
|
||||
- **Universal Links / App Links**: handle `https://web.readest.com/s/...` in v1 via `useOpenShareLink`. Tauri's `applinks` config already covers the host.
|
||||
|
||||
## Cherry-picks accepted (CEO review SELECTIVE EXPANSION)
|
||||
|
||||
1. **Position-aware share** — every share initiated from the reader auto-includes `cfi`; recipient lands at sharer's paragraph. Toggle in dialog (default on, only visible when reader-context).
|
||||
3. **1-tap "Add to my library"** — logged-in recipient on `/s` gets primary action that calls `/import` (R2 byte-copy) and navigates to `/reader?ids=...&cfi=...`.
|
||||
4. **Branded OG image** — `/api/share/[token]/og.png` server-renders via `@vercel/og`. Spec includes anti-slop checklist.
|
||||
|
||||
Deferred to TODOS.md: QR code on landing, notify-on-download toggle.
|
||||
|
||||
## Open implementation questions (resolve mid-build)
|
||||
|
||||
1. Upload-confirmation: HEAD R2 in `/create`, or add `uploaded_at` column to `files`? — recommend HEAD.
|
||||
2. Migration directory: project has no `apps/readest-app/supabase/migrations/`. Confirm where SQL actually lands before writing the file.
|
||||
3. `@vercel/og` runtime compat with CloudFlare Workers (OpenNextJS). Verify before relying on it; fallback to Satori + sharp if incompatible.
|
||||
4. App Router route handlers under `src/app/api/share/...` should be silently dropped by `output: 'export'` in Next 16.2.3. Confirm during first Tauri build.
|
||||
|
||||
## Critical files for implementation
|
||||
|
||||
See "Critical Files (modify or create)" table in the plan. Key starting points:
|
||||
- `src/libs/storage-server.ts` — extract `getDownloadSignedUrl` from `pages/api/storage/download.ts`
|
||||
- `src/libs/share-server.ts` (new) — `generateShareToken()`, `hashShareToken(raw)`
|
||||
- `src/libs/share.ts` (new) — typed client used by dialog, manage section, deeplink hook, landing page
|
||||
- `src/utils/share.ts` (new) — `buildShareUrl(token)`, `parseShareDeepLink(url)`
|
||||
- Dialog reference: `src/components/Dialog.tsx`, `BookDetailModal.tsx`
|
||||
- Landing reference: `src/app/o/page.tsx` (lift `Card`, `BrandHeader`, `PageFooter` to `src/components/landing/`)
|
||||
- Deeplink hook reference: `src/hooks/useOpenAnnotationLink.ts`, `useOpenWithBooks.ts`
|
||||
- App-level upload entry: `appService.uploadBook(book)` at `src/services/appService.ts:269` (NOT `cloudService.uploadBook` — lower-level fn)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,8 @@
|
||||
|
||||
Before marking work complete, all applicable checks must pass:
|
||||
|
||||
1. `pnpm test` — unit tests
|
||||
2. `pnpm lint` — ESLint
|
||||
3. `pnpm fmt:check` — Rust format check (only when `src-tauri/` files changed)
|
||||
4. `pnpm clippy:check` — Rust lint (only when `src-tauri/` files changed)
|
||||
1. `pnpm test` — unit tests (vitest)
|
||||
2. `pnpm lint` — Biome + tsgo (also runs `pnpm lint:lua` if luajit is installed)
|
||||
3. `pnpm test:lua` — busted unit tests for `apps/readest.koplugin/spec/` (only when koplugin Lua files changed; soft-skips when busted/luajit not installed)
|
||||
4. `pnpm fmt:check` — Rust format check (only when `src-tauri/` files changed)
|
||||
5. `pnpm clippy:check` — Rust lint (only when `src-tauri/` files changed)
|
||||
|
||||
Submodule apps/readest-app/.claude/skills/gstack updated: c6e6a21d1a...19e699ab9b
@@ -0,0 +1,111 @@
|
||||
---
|
||||
name: i18n-koplugin
|
||||
description: >
|
||||
Extract i18n strings from readest.koplugin Lua sources and translate empty
|
||||
msgstrs in apps/readest.koplugin/locales. Use when the user invokes
|
||||
/i18n-koplugin or asks to extract/translate koplugin i18n strings.
|
||||
Runs scripts/extract-i18n.js to sync .po catalogs from `_("...")` calls,
|
||||
then fills any empty `msgstr ""` entries across all locale files.
|
||||
user_invocable: true
|
||||
---
|
||||
|
||||
Extract/translate i18n strings for `readest.koplugin`. The catalogs are gettext `.po` files (not JSON like the main app). Run from the repo root or any worktree — the script resolves paths relative to the plugin dir.
|
||||
|
||||
## Step 1: Determine the working directory
|
||||
|
||||
If currently in a PR worktree (e.g., `/Users/chrox/dev/readest-pr-*`), use that. Otherwise use the main repo. The plugin dir is `<repo-root>/apps/readest.koplugin`.
|
||||
|
||||
## Step 2: Extract msgids from Lua sources
|
||||
|
||||
```bash
|
||||
cd <repo-root>/apps/readest.koplugin
|
||||
node scripts/extract-i18n.js
|
||||
```
|
||||
|
||||
This scans every `*.lua` file under `apps/readest.koplugin/` (except `spec/` and dotdirs) for `_("...")` and `_([[...]])` calls, then for each language listed in `apps/readest-app/i18next-scanner.config.cjs`:
|
||||
|
||||
- appends new msgids with empty `msgstr ""`
|
||||
- preserves existing translations
|
||||
- drops obsolete msgids
|
||||
- rewrites the `.po` header (Plural-Forms etc.)
|
||||
|
||||
The output prints `<lang> <kept>/<total> (-<dropped> obsolete)` per locale.
|
||||
|
||||
## Step 3: Find untranslated entries
|
||||
|
||||
An untranslated entry is a non-empty `msgid` followed by an empty `msgstr ""` (the file's header pair `msgid ""` / `msgstr ""` is NOT a translation — skip it).
|
||||
|
||||
```bash
|
||||
cd <repo-root>/apps/readest.koplugin/locales
|
||||
# List locales that still have untranslated strings, with counts
|
||||
for f in */translation.po; do
|
||||
# Count empty msgstrs that follow a non-empty msgid
|
||||
n=$(awk '
|
||||
/^msgid "/ { msgid=$0; next }
|
||||
/^msgstr ""$/ { if (msgid != "msgid \"\"") c++; next }
|
||||
' "$f")
|
||||
[ "$n" -gt 0 ] && echo "$f: $n untranslated"
|
||||
done
|
||||
```
|
||||
|
||||
If no results, report that all strings are translated and stop.
|
||||
|
||||
To list the actual untranslated msgids in one locale:
|
||||
|
||||
```bash
|
||||
awk '
|
||||
/^msgid "/ { msgid=$0; next }
|
||||
/^msgstr ""$/ { if (msgid != "msgid \"\"") print msgid; next }
|
||||
' <repo-root>/apps/readest.koplugin/locales/<lang>/translation.po
|
||||
```
|
||||
|
||||
## Step 4: Translate empty msgstrs
|
||||
|
||||
For each empty `msgstr ""` found:
|
||||
|
||||
1. Read the preceding `msgid "..."` — that's the English source string.
|
||||
2. Identify the target locale from the file path (e.g., `locales/ja/translation.po` → Japanese; see table below).
|
||||
3. Provide an accurate translation. Use the locale reference table for the language; match the tone/terminology already used in the same file (check existing translated entries for context).
|
||||
4. Preserve `printf`-style placeholders verbatim: `%s`, `%d`, `%1$s`, `%(name)s`, etc.
|
||||
5. Preserve newlines as `\n`, tabs as `\t`, and escape `"` as `\"` and backslashes as `\\` inside the msgstr.
|
||||
|
||||
Edit the `.po` files directly with the Edit tool — do NOT use sed for this, because msgids may contain characters that confuse shell quoting. Each replacement should target the unique `msgid "<English>"\nmsgstr ""` block:
|
||||
|
||||
Old:
|
||||
```
|
||||
msgid "<English string>"
|
||||
msgstr ""
|
||||
```
|
||||
|
||||
New:
|
||||
```
|
||||
msgid "<English string>"
|
||||
msgstr "<translation>"
|
||||
```
|
||||
|
||||
Batch all locales for the same key together when possible — keeps the translation set consistent.
|
||||
|
||||
### Locale reference
|
||||
|
||||
The supported language set is **not hardcoded in this skill**. The ground truth is `apps/readest-app/i18n-langs.json` — both `i18next-scanner.config.cjs` (via `require`) and `src/i18n/i18n.ts` (via JSON import) source from it, and `extract-i18n.js` reads `lngs` from the scanner config at runtime. To list the current set:
|
||||
|
||||
```bash
|
||||
cat <repo-root>/apps/readest-app/i18n-langs.json
|
||||
```
|
||||
|
||||
Map each code to a language name when translating. If a code in `i18n-langs.json` is missing from the `LANG_META` table inside `extract-i18n.js`, the script prints `<code> skipped (no metadata in extract-i18n.js)` — in that case, add the metadata entry there first, then re-run extraction.
|
||||
|
||||
## Step 5: Verify
|
||||
|
||||
Re-run the count loop from Step 3 and confirm zero untranslated strings remain. Report:
|
||||
|
||||
- number of msgids extracted
|
||||
- per-locale count of strings translated
|
||||
- any locales that were already complete
|
||||
|
||||
Optionally, run the koplugin Lua tests if `busted`/`luajit` are installed:
|
||||
|
||||
```bash
|
||||
cd <repo-root>/apps/readest-app
|
||||
pnpm test:lua
|
||||
```
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
name: i18n
|
||||
description: >
|
||||
Extract i18n strings, translate missing translations, or add a new language to readest-app.
|
||||
Use when the user invokes /i18n or asks to extract/translate i18n strings or add a new locale.
|
||||
Runs i18next-scanner to extract keys, then translates any __STRING_NOT_TRANSLATED__
|
||||
placeholders across all locale files.
|
||||
user_invocable: true
|
||||
---
|
||||
|
||||
Extract/translate i18n strings or add a new language for readest-app. Run from the app directory (either the main repo or a worktree).
|
||||
|
||||
## Step 0: Determine the mode
|
||||
|
||||
- If the user asks to **add a new language/locale**, go to **Adding a New Language** below.
|
||||
- Otherwise, go to **Extracting & Translating Strings** below.
|
||||
|
||||
## Step 1: Determine the working directory
|
||||
|
||||
If currently in a PR worktree (e.g., `/Users/chrox/dev/readest-pr-*`), use that. Otherwise use the main repo. The app directory is `<repo-root>/apps/readest-app`.
|
||||
|
||||
---
|
||||
|
||||
## Adding a New Language
|
||||
|
||||
When the user asks to add a new language (e.g., "add Hungarian", "add hu locale"):
|
||||
|
||||
### Step A1: Register the locale in two places
|
||||
|
||||
1. **`i18n-langs.json`** — Append the locale code to the array. Both `i18next-scanner.config.cjs` and `src/i18n/i18n.ts` import from this file, so they pick up the new entry automatically.
|
||||
2. **`src/services/constants.ts`** — Add an entry to `TRANSLATED_LANGS` with the locale code and native language name (e.g., `hu: 'Magyar'`). If the locale already exists in `TRANSLATOR_LANGS`, remove the duplicate there since it will be inherited via the spread.
|
||||
|
||||
### Step A2: Generate the translation file
|
||||
|
||||
```bash
|
||||
cd <app-dir>
|
||||
pnpm run i18n:extract
|
||||
```
|
||||
|
||||
This creates `public/locales/<code>/translation.json` with all keys set to `__STRING_NOT_TRANSLATED__`.
|
||||
|
||||
### Step A3: Translate all strings
|
||||
|
||||
Follow **Step 4** below to translate every `__STRING_NOT_TRANSLATED__` entry in the new locale file.
|
||||
|
||||
### Step A4: Verify
|
||||
|
||||
Follow **Step 5** below to confirm zero remaining untranslated strings for the new locale.
|
||||
|
||||
---
|
||||
|
||||
## Extracting & Translating Strings
|
||||
|
||||
### Step 2: Extract i18n strings
|
||||
|
||||
```bash
|
||||
cd <app-dir>
|
||||
pnpm run i18n:extract
|
||||
```
|
||||
|
||||
This runs `i18next-scanner` which scans source files for translation keys and adds any new keys to all locale files with `__STRING_NOT_TRANSLATED__` as the placeholder value.
|
||||
|
||||
### Step 3: Find untranslated strings
|
||||
|
||||
```bash
|
||||
grep -r "__STRING_NOT_TRANSLATED__" <app-dir>/public/locales/
|
||||
```
|
||||
|
||||
If no results, report that all strings are already translated and stop.
|
||||
|
||||
### Step 4: Translate missing strings
|
||||
|
||||
For each `__STRING_NOT_TRANSLATED__` found:
|
||||
|
||||
1. Identify the English key (e.g., `"Hide Scrollbar"`)
|
||||
2. Identify the target locale from the file path (e.g., `locales/ja/translation.json` -> Japanese)
|
||||
3. Provide an accurate translation for each locale
|
||||
|
||||
Use `sed -i ''` on macOS to replace in-place. Handle all locales in one batch:
|
||||
|
||||
```bash
|
||||
cd <app-dir>/public/locales
|
||||
sed -i '' 's/"<Key>": "__STRING_NOT_TRANSLATED__"/"<Key>": "<translation>"/' <locale>/translation.json
|
||||
```
|
||||
|
||||
### Locale reference
|
||||
|
||||
The canonical, complete list of supported locales lives in `i18n-langs.json` (codes only) and `TRANSLATED_LANGS` in `src/services/constants.ts` (codes → native display names). Read those for the source of truth — translate every locale that appears in `i18n-langs.json`. Don't carry forward older "out-of-scope" exclusions like `pt-BR` or `uz`; if it's in `i18n-langs.json` it ships, and it needs translation.
|
||||
|
||||
### Step 5: Verify
|
||||
|
||||
```bash
|
||||
grep -r "__STRING_NOT_TRANSLATED__" <app-dir>/public/locales/
|
||||
```
|
||||
|
||||
Confirm zero remaining untranslated strings. Report the number of keys translated and locales updated.
|
||||
@@ -67,6 +67,7 @@ src-tauri/gen
|
||||
|
||||
/dist/
|
||||
|
||||
.context/
|
||||
.claude/settings.local.json
|
||||
.claude/skills
|
||||
|
||||
|
||||
@@ -77,6 +77,21 @@ See [docs/i18n.md](docs/i18n.md) for the key-as-content translation approach, `s
|
||||
|
||||
See [docs/safe-area-insets.md](docs/safe-area-insets.md) for rules on handling top/bottom insets for UI elements near screen edges.
|
||||
|
||||
### Design System
|
||||
|
||||
UI/UX rules — surface tiers, action vocabulary, settings primitives (`BoxedList`, `SettingsRow`, `SettingsSwitchRow`, `SettingsSelect`, `NavigationRow`, `Tips`, etc.), boxed-list anatomy, RTL conventions, e-ink overlay, and anti-patterns — live in [DESIGN.md](DESIGN.md). Codify recurring decisions there so they persist for the team and future contributors. Reach for the primitives in `src/components/settings/primitives/` instead of inlining chassis classes.
|
||||
|
||||
### E-ink mode
|
||||
|
||||
Every new UI widget must look right under `[data-eink='true']`. E-ink screens have no shadows, no gradients, slow refresh, and need crisp 1px borders for delineation. The conventions live in `src/styles/globals.css` — reuse the existing classes instead of inventing new ones:
|
||||
|
||||
- **Surfaces / inputs** — add `eink-bordered`. In eink mode it swaps to `bg-base-100` + 1px `base-content` border. Use it on inputs, custom button backgrounds, ghost-styled cancel buttons, and any container that needs a visible boundary.
|
||||
- **Primary action buttons** — add `btn-primary` (alongside whatever Tailwind classes you use for color themes). The `[data-eink] .btn-primary` rule inverts to `base-content` bg + `base-100` text so the primary CTA stays distinct from secondary actions.
|
||||
- **`.modal-box`** picks up no-shadow + 1px border automatically; dialogs that use it don't need additions.
|
||||
- **Don't rely on color/shadow alone for hierarchy.** Two same-tone buttons differ only by hover on color themes, and hover doesn't exist on e-ink touchscreens. Pair a borderless ghost (cancel) with a solid CTA (submit) so eink can invert one without flattening the difference.
|
||||
|
||||
When in doubt, toggle E-ink in Settings → Misc and check. The rules in `globals.css` cover most cases automatically, but composite components (custom buttons, layered cards) often need `eink-bordered` on the right element to stay legible.
|
||||
|
||||
Available gstack skills:
|
||||
|
||||
- `/plan-ceo-review` — CEO/founder-mode plan review
|
||||
|
||||
@@ -0,0 +1,972 @@
|
||||
## Readest Design Language
|
||||
|
||||
Readest's UI is **Adwaita-aligned**, **e-ink-first**, **cross-platform-aware**. This doc is the
|
||||
reference for that language: principles, vocabulary, anti-patterns. New work should read it
|
||||
before reaching for daisyui defaults; existing work is gradually migrating toward it.
|
||||
|
||||
### Status
|
||||
|
||||
This doc is the **first articulation** of the system, not a retrospective. Many existing
|
||||
components don't fully match it yet (especially older buttons and ad-hoc panels). The goal
|
||||
is that **new code uses these conventions** and **migrations land opportunistically** as
|
||||
features get touched.
|
||||
|
||||
---
|
||||
|
||||
### 1. Identity & lineage
|
||||
|
||||
Readest's visual language descends from **Adwaita / libadwaita** — GNOME's design system —
|
||||
adapted for a cross-platform Tauri + Next.js app that also runs on iOS, Android, web, and
|
||||
e-ink readers.
|
||||
|
||||
What we take from Adwaita:
|
||||
|
||||
- **Content first, chrome recedes.** The reading surface is the product. Settings, toolbars,
|
||||
popups never compete with the page.
|
||||
- **Boldly minimal.** Restraint over density. Whitespace is structural.
|
||||
- **Surface hierarchy** — window → view → card — three explicit elevation tiers, no shadow
|
||||
gymnastics.
|
||||
- **Color discipline.** Brand color is rare and earned. Neutral palette carries the weight.
|
||||
- **Boxed lists are the chassis.** AdwActionRow's prefix · title · suffix anatomy is the
|
||||
canonical settings/list row everywhere.
|
||||
- **Pills, ghosts, flats.** Three-tier button palette: pill/circular ghost in headers, flat
|
||||
secondary over view-bg, accent CTA only when truly primary.
|
||||
- **Banner vs Toast.** AdwBanner = inline, top-of-window, persistent. AdwToast = transient,
|
||||
bottom slide-in.
|
||||
- **Switches over checkboxes** for boolean settings.
|
||||
- **Subtle motion.** Short, ease-out, never bouncy.
|
||||
|
||||
What's Readest-specific:
|
||||
|
||||
- **E-ink as a first-class mode.** Every surface flips to flat 1px contrast borders under
|
||||
`[data-eink='true']`. Adwaita is desktop-GNOME-only; we ship to e-ink readers and the
|
||||
visual language has to survive there.
|
||||
- **Cross-platform reality.** Readest runs on macOS, Windows, Linux, iOS, Android, web. The
|
||||
identity stays Adwaita; platform grace notes (radii, target sizes) follow host
|
||||
conventions where they matter.
|
||||
|
||||
---
|
||||
|
||||
### 2. Principles
|
||||
|
||||
The seven rules. When in doubt, work backward from these.
|
||||
|
||||
#### 2.1 Surfaces continue surfaces
|
||||
|
||||
A control that extends a list/card should match its parent's border + fill. The
|
||||
"+ Import Dictionary" button at `src/components/settings/CustomDictionaries.tsx` reads as
|
||||
detached card siblings of the dictionary list above it because they share
|
||||
`border-base-200 bg-base-100 rounded-lg`.
|
||||
|
||||
> **Bad**: a list of dictionaries in a `bg-base-100` card, followed by a `btn-outline btn-primary`
|
||||
> add button. The button shouts; the list whispers; the eye bounces.
|
||||
>
|
||||
> **Good**: list and add-button share the same surface vocabulary. The eye flows.
|
||||
|
||||
#### 2.2 Color is earned
|
||||
|
||||
Brand `primary` is reserved for **the** primary action of a surface. Most actions don't have
|
||||
a primary action — they have a list of equally-weighted choices, or a single accent.
|
||||
|
||||
- Settings dialog has no primary. Every panel is a list of toggles. **Zero brand color.**
|
||||
- "Import a Book" in onboarding is a primary CTA. **One brand color.**
|
||||
- "Add Web Search" extends a list — it's not the surface's primary action. **Neutral.**
|
||||
|
||||
#### 2.3 Two-step depth
|
||||
|
||||
State changes cycle through **`base-100 → base-200 → base-300`** instead of recoloring.
|
||||
Hover lifts, active deepens, disabled fades opacity. This is theme-safe (works across all
|
||||
11 color themes), e-ink-friendly (depth is preserved as borders, not shades), and
|
||||
calmer than recoloring.
|
||||
|
||||
#### 2.4 Localize the hover signal
|
||||
|
||||
When a button hovers, **one focal element changes**, not the whole button. The icon chip
|
||||
inverts; the label stays steady. The badge intensifies; the row stays neutral. This reads
|
||||
as deliberate, not decorative.
|
||||
|
||||
#### 2.5 Motion is color, not transform
|
||||
|
||||
Default to `transition-colors duration-150`. No `scale`, no `translate`, no `rotate` unless
|
||||
the motion **is** the message (a chevron rotating to indicate expansion is fine; a button
|
||||
that scales on hover is not). Transforms break under `[data-eink='true']` and feel
|
||||
gimmicky under Adwaita's calm rhythm.
|
||||
|
||||
#### 2.6 Eink-first by default
|
||||
|
||||
Every custom-styled bordered surface gets the `eink-bordered` class. Every primary action
|
||||
gets `btn-primary` (which has dedicated eink rules). Don't rely on color or shadow alone
|
||||
for hierarchy — eink screens have neither.
|
||||
|
||||
If you can't toggle Settings → Misc → Eink and still tell which button is the CTA, the
|
||||
hierarchy is broken.
|
||||
|
||||
#### 2.7 Focus is visible but quiet
|
||||
|
||||
Keyboard focus needs a visible ring. `focus-visible:ring-2 focus-visible:ring-base-content/15`
|
||||
is the canonical treatment for custom buttons. Loud `ring-primary` reserved for inputs
|
||||
where the focus state IS the affordance.
|
||||
|
||||
#### 2.8 RTL: always use logical properties (REQUIRED)
|
||||
|
||||
Readest ships with RTL languages enabled. **Never use direction-bound Tailwind
|
||||
utilities** when a logical equivalent exists — the visual edges flip in RTL,
|
||||
the logical ones don't.
|
||||
|
||||
| Don't use | Use instead |
|
||||
| ---------------------------------- | ---------------------------------- |
|
||||
| `pl-*` / `pr-*` | `ps-*` (start) / `pe-*` (end) |
|
||||
| `ml-*` / `mr-*` | `ms-*` / `me-*` |
|
||||
| `text-left` / `text-right` | `text-start` / `text-end` |
|
||||
| `border-l` / `border-r` | `border-s` / `border-e` |
|
||||
| `rounded-l-*` / `rounded-r-*` | `rounded-s-*` / `rounded-e-*` |
|
||||
| `left-*` / `right-*` (positioning) | `start-*` / `end-*` |
|
||||
| `justify-start` / `justify-end` | (these ARE direction-aware) — keep |
|
||||
|
||||
The `flex-row` direction is automatically reversed in RTL by the browser, so
|
||||
you usually don't need to do anything for `flex` / `gap`. Only **explicit
|
||||
edges** (padding, margin, borders, radius, absolute positioning) need
|
||||
logical properties.
|
||||
|
||||
**Quick scan when reviewing a diff:** grep for `\b(pl|pr|ml|mr|left-|right-|text-left|text-right|border-l|border-r|rounded-l|rounded-r)-` in changed files. Any hit that isn't a deliberate LTR-only
|
||||
case (rare — usually only icon glyphs that have a fixed orientation) should
|
||||
be flipped to the logical equivalent.
|
||||
|
||||
#### 2.9 Every panel and sub-page starts with title + description (REQUIRED)
|
||||
|
||||
Every settings panel and every sub-page must open with:
|
||||
|
||||
1. **A title** — the panel name. Style: `text-lg font-semibold tracking-tight`. In a
|
||||
top-level panel this is an `<h2>`; in a sub-page this is the `parentLabel /
|
||||
currentLabel` breadcrumb in `SubPageHeader` (which uses the same typography so the
|
||||
word stays anchored visually as the user navigates in/out).
|
||||
2. **A one-line description** — a short sentence under the title explaining what this
|
||||
surface does or how it fits in the user's workflow. Style: `text-sm
|
||||
text-base-content/70 leading-relaxed`. Skip it only when the surface is so trivial
|
||||
the breadcrumb already says everything (rare — when in doubt, write one).
|
||||
|
||||
Why: orientation, visual rhythm, and Adwaita parity (`AdwPreferencesPage` always has
|
||||
both). The same vertical opening across every surface makes the system feel cohesive
|
||||
and gives users a predictable place to learn what a screen does.
|
||||
|
||||
**Canonical components.** The `<SubPageHeader>` primitive in
|
||||
`src/components/settings/SubPageHeader.tsx` accepts a `description?: React.ReactNode`
|
||||
prop that renders the description in the canonical style — sub-pages should pass it
|
||||
there rather than rolling their own `<p>` below the header. Top-level panels currently
|
||||
inline the title + description; if a third or fourth panel needs the same pattern,
|
||||
extract a `<PanelHeader>` primitive following the same shape.
|
||||
|
||||
**Examples.**
|
||||
|
||||
```tsx
|
||||
// Sub-page (Integrations → OPDS Catalogs)
|
||||
<SubPageHeader
|
||||
parentLabel={_('Integrations')}
|
||||
currentLabel={_('OPDS Catalogs')}
|
||||
description={_('Browse and download books from online catalogs')}
|
||||
onBack={() => setSubPage(null)}
|
||||
/>
|
||||
|
||||
// Top-level panel (Integrations panel root)
|
||||
<div className='w-full'>
|
||||
<h2 className='mb-1.5 text-lg font-semibold tracking-tight'>{_('Integrations')}</h2>
|
||||
<p className='text-base-content/70 text-sm leading-relaxed'>
|
||||
{_('Connect Readest to external services for sync, highlights, and catalogs.')}
|
||||
</p>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Surface hierarchy
|
||||
|
||||
Three named tiers, mapped onto daisyui tokens. Use these terms in conversation and code
|
||||
comments even though the classes are still daisyui-native.
|
||||
|
||||
| Tier | Token | Role | Example |
|
||||
| ---------- | ------------------------------------ | ----------------------------------------------------------------------------- | ----------------------------------------------- |
|
||||
| **Window** | `bg-base-200` | The outermost backdrop. Modal scrims, dialog content area, scroll containers. | `<Dialog>` body |
|
||||
| **View** | `bg-base-100/60` or `bg-base-200/40` | Mid-tier surface inside a window. Tip boxes, secondary panels. | The "提示 / Tips" callout in CustomDictionaries |
|
||||
| **Card** | `bg-base-100` | Top-tier content surface. Boxed lists, popovers, modal-box. | The dictionaries list card |
|
||||
|
||||
Border treatment:
|
||||
|
||||
- **Window** has no border (it IS the boundary).
|
||||
- **View** uses no border or `border-base-200/60` for very soft delineation.
|
||||
- **Card** uses `border border-base-200`. In e-ink, `eink-bordered` flips it to 1px
|
||||
`border-base-content`.
|
||||
|
||||
Corner radius:
|
||||
|
||||
- **Card / View**: `rounded-lg` (8px) — Readest's house radius. Adwaita uses 9px; 8px is
|
||||
close enough and matches Tailwind's scale.
|
||||
- **Modal / Sheet**: `modal-box` default (~1rem / 16px) — bigger surfaces get bigger radii.
|
||||
- **Pills / Chips**: `rounded-full`.
|
||||
- **Inputs / small buttons**: `rounded-md` (6px) or `rounded-lg` (8px).
|
||||
|
||||
#### Surface continuity rule
|
||||
|
||||
When a control extends a card (an "add row" affordance, a footer button bar attached to a
|
||||
list), it inherits the card's surface treatment: same `bg-base-100`, same
|
||||
`border-base-200`, same `rounded-lg`. It is the card grown by one row.
|
||||
|
||||
---
|
||||
|
||||
### 4. Action vocabulary
|
||||
|
||||
Six archetypes. Pick by **role**, not by **appearance**.
|
||||
|
||||
#### 4.1 Accent CTA
|
||||
|
||||
The primary, accent-colored button. **One per surface, max.** Submit on a form, "Open
|
||||
Book", "Sign In".
|
||||
|
||||
```tsx
|
||||
className = 'btn btn-primary';
|
||||
```
|
||||
|
||||
Eink: `btn-primary` has dedicated rules (inverts to base-content bg + base-100 text) so it
|
||||
stays distinct from secondary actions on monochrome screens.
|
||||
|
||||
#### 4.2 Suggested
|
||||
|
||||
A non-accent-but-emphasized action. Used when there are multiple equally-weighted actions
|
||||
and one is the recommended path. Adwaita's "suggested-action" CSS class.
|
||||
|
||||
```tsx
|
||||
className = 'btn btn-neutral';
|
||||
```
|
||||
|
||||
Rare. Most surfaces don't need this tier.
|
||||
|
||||
#### 4.3 Flat
|
||||
|
||||
The default secondary button. Sits on a view or card surface, no border, hover lifts to
|
||||
`base-200`. The bulk of buttons should be flat.
|
||||
|
||||
```tsx
|
||||
className="btn btn-ghost"
|
||||
// or for a custom surface treatment:
|
||||
className={clsx(
|
||||
'rounded-lg px-4 py-2 text-sm font-medium',
|
||||
'hover:bg-base-200 transition-colors duration-150',
|
||||
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-base-content/15',
|
||||
)}
|
||||
```
|
||||
|
||||
#### 4.4 Pill / Circular ghost
|
||||
|
||||
Compact icon-only buttons in header bars and toolbars. Always `rounded-full`,
|
||||
`btn-circle` or hand-rolled circular ghost.
|
||||
|
||||
```tsx
|
||||
className = 'btn btn-ghost btn-circle h-8 min-h-8 w-8 p-0';
|
||||
```
|
||||
|
||||
The window controls in `SettingsDialog.tsx` (search, menu, close) use this archetype.
|
||||
|
||||
#### 4.5 Destructive
|
||||
|
||||
Delete, remove, irreversible. Adwaita uses `destructive-action`. Readest uses red
|
||||
sparingly — usually only the icon, not the whole button.
|
||||
|
||||
```tsx
|
||||
// Icon-only delete X in delete mode:
|
||||
className = 'btn btn-ghost btn-sm shrink-0 px-1';
|
||||
// with <IoMdCloseCircleOutline className="text-error h-4 w-4" />
|
||||
```
|
||||
|
||||
For destructive **dialogs** (confirmation modals), the confirm button can be `btn-error`,
|
||||
but only in the modal — never on the main surface.
|
||||
|
||||
#### 4.6 ListExtension
|
||||
|
||||
A Readest-named archetype for "add another row to the list above" affordances. The two
|
||||
buttons at the bottom of `CustomDictionaries.tsx` are the canonical example.
|
||||
|
||||
Anatomy:
|
||||
|
||||
- Surface matches the parent card (`border border-base-200 bg-base-100 rounded-lg`)
|
||||
- Height ~h-11
|
||||
- Centered: small icon chip + label
|
||||
- Icon chip: `bg-base-200 text-base-content/60 rounded-full h-5 w-5`
|
||||
- Hover: border deepens to `base-300`, bg lightens to `bg-base-200/60`, icon chip inverts
|
||||
to `bg-base-content text-base-100`
|
||||
- `eink-bordered` on the button itself
|
||||
|
||||
```tsx
|
||||
<button
|
||||
type='button'
|
||||
onClick={handleAdd}
|
||||
className={clsx(
|
||||
'eink-bordered group flex h-11 items-center justify-center gap-2.5',
|
||||
'border-base-200 bg-base-100 rounded-lg border px-4',
|
||||
'text-base-content text-sm font-medium',
|
||||
'transition-colors duration-150',
|
||||
'hover:border-base-300 hover:bg-base-200/60',
|
||||
'active:bg-base-200/80',
|
||||
'focus-visible:ring-base-content/15 focus-visible:outline-none focus-visible:ring-2',
|
||||
)}
|
||||
>
|
||||
<span
|
||||
className={clsx(
|
||||
'flex h-5 w-5 items-center justify-center rounded-full',
|
||||
'bg-base-200 text-base-content/60',
|
||||
'transition-colors duration-150',
|
||||
'group-hover:bg-base-content group-hover:text-base-100',
|
||||
)}
|
||||
>
|
||||
<MdAdd className='h-3.5 w-3.5' />
|
||||
</span>
|
||||
<span className='line-clamp-1'>{label}</span>
|
||||
</button>
|
||||
```
|
||||
|
||||
Use this for: "Import Dictionary", "Add Web Search", "Add Custom Theme", any "+ add new
|
||||
to this list" pattern. **Do not** use `btn-outline btn-primary` for these.
|
||||
|
||||
---
|
||||
|
||||
### 5. Boxed list anatomy
|
||||
|
||||
The settings UI is built on boxed lists. One pattern, used everywhere.
|
||||
|
||||
#### Container
|
||||
|
||||
Use the `<BoxedList>` primitive at `src/components/settings/primitives/BoxedList.tsx`
|
||||
rather than inlining the chassis classes:
|
||||
|
||||
```tsx
|
||||
<BoxedList title={_('Reading Sync')} data-setting-id='settings.section.id'>
|
||||
{/* rows */}
|
||||
</BoxedList>
|
||||
```
|
||||
|
||||
The primitive renders:
|
||||
|
||||
```tsx
|
||||
<div className='card eink-bordered border-base-200 bg-base-100 border'>
|
||||
<div className='divide-base-200 divide-y'>{children}</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
- `card` for the radius
|
||||
- `border border-base-200` for the boundary (eink upgrades this automatically)
|
||||
- `eink-bordered` for the e-ink-mode contrast border
|
||||
- `divide-base-200 divide-y` for inter-row separators
|
||||
|
||||
> **No `overflow-hidden` on the card.** Children may host popovers (color
|
||||
> pickers, dropdowns, tooltips) that need to escape the card bounds. The
|
||||
> `divide-y` rules sit between rows and don't touch the card's rounded
|
||||
> corners, so omitting overflow-clip is visually safe AND keeps embedded
|
||||
> popovers from getting clipped.
|
||||
|
||||
#### Row anatomy
|
||||
|
||||
Three slots, in order, always:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ [prefix] Title text [suffix slots] │
|
||||
│ [ ] Subtitle text (optional) [ ][ ]│
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| Slot | Contents |
|
||||
| ------------ | ------------------------------------------------------------------------------------------------- |
|
||||
| **Prefix** | Drag handle, leading icon, avatar, status dot, or empty. |
|
||||
| **Title** | Primary label. `font-medium`. Truncates with `truncate`. |
|
||||
| **Subtitle** | Optional secondary line. `text-sm text-base-content/70`. Used for warnings, descriptions, status. |
|
||||
| **Suffix** | Badge, switch, button, chevron, value, or any combination. End-aligned. |
|
||||
|
||||
Canonical example: `SortableRow` in `src/components/settings/CustomDictionaries.tsx`. The
|
||||
drag handle is the prefix, the dict name is the title, the warning reason is the
|
||||
subtitle, and the badge + toggle + edit/delete buttons stack as suffixes.
|
||||
|
||||
#### Row variants
|
||||
|
||||
- **ActionRow** — title + suffix is a single button or chevron. Tap anywhere navigates.
|
||||
- **SwitchRow** — title + suffix is a toggle. Tap anywhere toggles.
|
||||
- **ComboRow** — title + suffix is a dropdown/select.
|
||||
- **ExpanderRow** — chevron suffix; tap expands to reveal nested rows.
|
||||
|
||||
These names come from libadwaita and apply 1:1 to Readest's lists. Use the names in code
|
||||
comments and PR descriptions.
|
||||
|
||||
#### Spacing
|
||||
|
||||
- Row vertical padding: `py-2` (8px) for compact lists, `py-3` (12px) for breathing room.
|
||||
- Row horizontal padding: `px-3` (12px) or `px-4` (16px). Stay consistent within a list.
|
||||
- Slot gap: `gap-2` (8px) between prefix/title/suffix elements.
|
||||
|
||||
#### Disabled rows
|
||||
|
||||
Disabled rows fade the title to `text-base-content/60` and disable the suffix control. The
|
||||
row itself stays at full opacity — only the **content** dims, not the row.
|
||||
|
||||
#### Toggle size
|
||||
|
||||
| Daisyui class | Use case |
|
||||
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
||||
| `toggle` (default, h-5 / ~20px) | **Settings panel boxed-list rows** — `<SettingsSwitchRow>` uses this. Visible weight matches the 56px `min-h-14` row. |
|
||||
| `toggle-sm` (h-4 / ~16px) | Inline secondary switches in tighter contexts — e.g. dictionary list rows in `CustomDictionaries`. |
|
||||
| `toggle-xs` (h-3 / ~12px) | Compact metadata toggles inside cards — e.g. OPDS catalog "Auto-download". |
|
||||
|
||||
The `<SettingsSwitchRow>` primitive bakes in the default `toggle`. **Don't override
|
||||
to `toggle-sm` inside boxed-list rows** — it looks orphaned in the row's vertical
|
||||
breathing room. Use the smaller sizes only when the row itself is shorter than 56px.
|
||||
|
||||
#### Typography inherits from `.settings-content`
|
||||
|
||||
The Settings dialog (and any settings-style sheet/popup) wraps its content
|
||||
in `.settings-content`, which is defined in `src/styles/globals.css` as:
|
||||
|
||||
```css
|
||||
.dropdown-content,
|
||||
.settings-content {
|
||||
font-size: 14px; /* desktop */
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.dropdown-content,
|
||||
.settings-content {
|
||||
font-size: 16px; /* mobile bump — high-DPI phones need bigger body text */
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Don't hardcode `text-sm` on row labels, NavigationRow titles, or panel
|
||||
descriptions** — that locks the text to 14px on every viewport and kills
|
||||
the mobile bump. Instead:
|
||||
|
||||
- **Primary labels** (SettingsRow label, NavigationRow title, SubPageHeader
|
||||
description, ad-hoc row labels in panels and integration forms): no
|
||||
font-size class — inherits 14/16 from the wrapper. Use `<SettingLabel>`
|
||||
rather than inlining a `<span>`; it adds `font-medium` for cased scripts
|
||||
and drops the weight for caseless scripts (CJK / Arabic / Hebrew / Indic
|
||||
/ Thai / Tibetan), since those bold poorly at body size and `font-medium`
|
||||
on Han / Hangul / Devanagari renders as uneven stroke-thickening across
|
||||
system fonts.
|
||||
- **Secondary text** (SettingsRow description, NavigationRow status, Tips
|
||||
body, BoxedList description): use `text-[0.85em]` so it stays
|
||||
proportional (≈12px desktop, ≈13.6px mobile).
|
||||
- **Form controls** (`<input>`, `<select>`): browsers don't inherit
|
||||
font-size onto form elements, so add the `settings-content` class
|
||||
_directly on the element_ to re-apply the 14/16 cascade. The legacy
|
||||
NumberInput already does this — match its pattern.
|
||||
- **Section headers** (`BoxedList` uppercase title): use `text-[0.85em]
|
||||
font-semibold uppercase tracking-wider`. The em-relative size keeps it
|
||||
proportional with the `.settings-content` cascade. **Caseless-script
|
||||
exception:** when `isCaselessUILang()` is true, bump to `text-[1em]`.
|
||||
The `uppercase` rule is a no-op in scripts without case (CJK, Arabic,
|
||||
Hebrew, Devanagari/Bengali/Tamil/Sinhala, Thai, Tibetan), so the size
|
||||
has to carry the emphasis those scripts can't pick up from casing. The
|
||||
helper lives in `src/utils/misc.ts`; the underlying `isCaselessLang`
|
||||
predicate lists every covered language code in `src/utils/lang.ts`.
|
||||
|
||||
Why this matters: Tailwind's `text-xs` / `text-sm` are rem-based — they
|
||||
ignore the parent's `font-size` because rem is rooted at the document.
|
||||
The `.settings-content` cascade is in `px`, so any child that picks a
|
||||
Tailwind size literally tunes itself to the desktop default and never
|
||||
grows on mobile. iOS and Android have small physical screens but high
|
||||
DPI, so the mobile bump is what makes the text legible at typical reading
|
||||
distance.
|
||||
|
||||
#### Uniform row height
|
||||
|
||||
Settings rows in a boxed list MUST all be the same visual height. Use
|
||||
`min-h-14 items-center` (56px) on each row container — toggle, select, and
|
||||
input rows then center their controls vertically inside identical boxes.
|
||||
**Don't use `py-3`** — content-driven padding produces uneven heights
|
||||
because toggles, selects (`h-9`), and inputs (`h-9`) have different
|
||||
intrinsic sizes.
|
||||
|
||||
```tsx
|
||||
// ✓ Right — no text-sm; label inherits .settings-content (14/16)
|
||||
<label className='flex min-h-14 items-center justify-between px-4'>
|
||||
<span className='font-medium'>{_('Sync Enabled')}</span>
|
||||
<input type='checkbox' className='toggle' ... />
|
||||
</label>
|
||||
|
||||
// ✗ Wrong — toggle row will be 48px, select rows 60px
|
||||
<label className='flex items-center justify-between px-4 py-3'>...</label>
|
||||
|
||||
// ✗ Wrong — text-sm hardcodes 14px even on mobile (kills the bump)
|
||||
<span className='text-sm font-medium'>{_('Sync Enabled')}</span>
|
||||
```
|
||||
|
||||
#### Controls inside a boxed list have no chrome
|
||||
|
||||
When a control sits inside a bordered card, it shouldn't carry its own
|
||||
border or fill. The card supplies the visual boundary; the control just
|
||||
sits on the row.
|
||||
|
||||
- **Selects:** drop `select-bordered` and `eink-bordered`. Add
|
||||
`!bg-transparent !bg-none !appearance-none` to suppress daisyui's
|
||||
background chevron and native arrow. Render a real `<MdArrowDropDown>`
|
||||
icon at the cell's trailing edge for the affordance — see "End-aligned
|
||||
values" below.
|
||||
- **Inputs:** drop `input-bordered` and `eink-bordered`. Add `!bg-transparent`
|
||||
with `hover:!bg-base-200/60 focus:!bg-base-200/60` so the field still
|
||||
signals interactability. Use `text-end` and `!pe-0` so the value sits
|
||||
flush against the row's trailing edge.
|
||||
- **Toggles:** untouched — they're already chromeless.
|
||||
|
||||
This is the iOS Settings / Adwaita PreferencesGroup convention: list
|
||||
chrome belongs to the container, not its children.
|
||||
|
||||
#### End-aligned values + chevron alignment
|
||||
|
||||
The selected value of a select/input MUST end-align (`text-end`). The
|
||||
**visible right edge** of every row's value (toggle, chevron icon, input
|
||||
text) MUST land at the same X — the row's trailing padding.
|
||||
|
||||
The trap: daisyui's select renders its chevron via background-image at
|
||||
`calc(100% - 1rem) center`, which floats the glyph 16px _inside_ the
|
||||
select's right edge. So if the toggle in row 1 ends at the row's `pe-4`
|
||||
edge, the chevron in row 2 ends 16px before that — visibly misaligned.
|
||||
|
||||
**Fix:** suppress daisyui's bg-image chevron and render an explicit icon at
|
||||
the cell's trailing edge. The select's own daisyui focus chrome (outline +
|
||||
box-shadow + ring) is suppressed; **no focus ring** on controls inside the
|
||||
boxed list — focus state is signaled by a subtle wrapper bg-shift instead
|
||||
(hover and focus-within both lift to `bg-base-200/60`). Rings would compete
|
||||
with the card's own border and double-stack with adjacent rows.
|
||||
|
||||
```tsx
|
||||
<div className='hover:bg-base-200/60 focus-within:bg-base-200/60 flex max-w-[60%] items-center rounded-md'>
|
||||
<select className='select h-9 min-w-0 cursor-pointer !appearance-none truncate !border-0 !bg-transparent !bg-none !pe-1 !ps-2 text-end text-sm focus:!border-0 focus:!shadow-none focus:!outline-none focus:!ring-0'>
|
||||
{/* options */}
|
||||
</select>
|
||||
<MdArrowDropDown
|
||||
aria-hidden='true'
|
||||
className='text-base-content/55 pointer-events-none h-5 w-5 flex-shrink-0'
|
||||
/>
|
||||
</div>
|
||||
```
|
||||
|
||||
> **Why so many `!` overrides?** daisyui's `.select` and `.input` apply
|
||||
> `border-width: 1px` + `border-color` (transparent at rest, `var(--bc)` on
|
||||
> focus), plus `outline`, `box-shadow`, and `ring` chrome on focus. To make
|
||||
> the control truly chromeless inside a boxed list, you need to kill all
|
||||
> four properties. Missing any of them — especially `border-0` — leaves a
|
||||
> visible focus border leaking through.
|
||||
|
||||
The `<MdArrowDropDown>` icon's trailing edge now lives at the same X as the
|
||||
toggle's trailing edge in adjacent rows, because both are flush with the
|
||||
row's `pe-4` padding.
|
||||
|
||||
For inputs, no wrapper is needed — the input is one element, so put the
|
||||
hover/focus bg directly on it. Suppress daisyui's own focus chrome the
|
||||
same way:
|
||||
|
||||
```tsx
|
||||
<input className='input hover:!bg-base-200/60 focus:!bg-base-200/60 h-9 max-w-[60%] rounded-md !border-0 !bg-transparent !pe-0 !ps-2 text-end text-sm focus:!border-0 focus:!shadow-none focus:!outline-none focus:!ring-0' />
|
||||
```
|
||||
|
||||
> **Why no ring here when §2.7 says "focus needs a visible ring"?** §2.7 is
|
||||
> for standalone custom buttons (Submit, Cancel, ListExtension, etc.). In a
|
||||
> boxed list, the row already provides strong visual containment via the
|
||||
> card border + dividers, and stacking a per-control ring inside that
|
||||
> creates double chrome. The bg-shift IS the focus indicator — keyboard
|
||||
> users still get clear feedback; the surface stays calm.
|
||||
|
||||
---
|
||||
|
||||
### 6. Header bars, dialogs, popups, sheets
|
||||
|
||||
#### Header bar
|
||||
|
||||
The dialog/page header. Adwaita's AdwHeaderBar.
|
||||
|
||||
- **48–56px tall** (`h-12` to `h-14`).
|
||||
- **Center-aligned title** in `font-semibold text-base`.
|
||||
- **Leading slot**: back chevron (mobile) or empty (desktop).
|
||||
- **Trailing slot**: window controls — search (pill ghost), menu (pill ghost),
|
||||
close (pill ghost circle with `bg-base-300/65`).
|
||||
- No bottom border; rely on tab/divider that follows.
|
||||
|
||||
`SettingsDialog.tsx`'s mobile header is the canonical example. The desktop header is
|
||||
slightly different — tabs sit in the same row as window controls, no center title — but
|
||||
it's the same archetype adapted for screen real estate.
|
||||
|
||||
#### Dialog (modal)
|
||||
|
||||
```tsx
|
||||
<Dialog
|
||||
isOpen={...}
|
||||
onClose={...}
|
||||
boxClassName="sm:min-w-[520px] overflow-hidden"
|
||||
header={<HeaderBar />}
|
||||
>
|
||||
{/* content */}
|
||||
</Dialog>
|
||||
```
|
||||
|
||||
- `modal-box` provides the radius, max-width, and shadow (auto-removed in eink).
|
||||
- Width ~520px on desktop, full-width on mobile.
|
||||
- Bottom sheets on mobile via `snapHeight` prop.
|
||||
- Backdrop: `sm:!bg-black/50` (or `/20` when nested over a darker surface).
|
||||
|
||||
#### Popup (popover)
|
||||
|
||||
For dictionary lookups, annotation editors, and other anchored overlays. Uses the
|
||||
`Popup` component with a triangle pointer.
|
||||
|
||||
- **Width**: clamp to fit content; ~320–420px typical.
|
||||
- **Surface**: `bg-base-100`, `rounded-lg`, soft shadow (eink removes shadow).
|
||||
- **Triangle**: pointer toward the anchor; eink has special triangle classes.
|
||||
- **Padding**: `p-3` to `p-4` for content.
|
||||
|
||||
#### Sheet (mobile bottom)
|
||||
|
||||
Reserved for mobile contextual menus and full-screen secondary panels. Uses the dialog's
|
||||
`snapHeight` prop. Adwaita doesn't have a native sheet but Readest's mobile pattern is
|
||||
the closest analog.
|
||||
|
||||
- Always full-width.
|
||||
- Top corners rounded; bottom corners flat (it's anchored to the bottom).
|
||||
- Drag handle at top (the small horizontal pill) is mandatory if the sheet supports
|
||||
swipe-to-dismiss.
|
||||
|
||||
---
|
||||
|
||||
### 7. Motion + a11y
|
||||
|
||||
#### Motion
|
||||
|
||||
- Default duration: **150ms** for color transitions.
|
||||
- Default easing: browser default (`ease`) or `ease-out`. Never `ease-in`.
|
||||
- Longer transitions (300ms+) only for layout changes (sheet snap, panel slide).
|
||||
- **Never** use `transform` for hover unless the transform IS the message
|
||||
(chevron rotation, drag-handle drag visualization). E-ink doesn't render mid-transitions
|
||||
cleanly and Adwaita's identity is calm.
|
||||
|
||||
```tsx
|
||||
// Good — hover:bg-base-200 with transition-colors
|
||||
className = 'transition-colors duration-150 hover:bg-base-200';
|
||||
|
||||
// Bad — scale on hover
|
||||
className = 'transition-transform hover:scale-105';
|
||||
```
|
||||
|
||||
Existing exceptions: `.window-button` in globals.css uses `hover:scale-105`. That's
|
||||
legacy; new code shouldn't follow it.
|
||||
|
||||
#### Reduced motion
|
||||
|
||||
Reduced-motion preference is honored via the `no-transitions` class
|
||||
(`globals.css:624`). Layout-changing transitions should respect
|
||||
`prefers-reduced-motion: reduce` either via this class or `motion-safe:` Tailwind
|
||||
prefixes.
|
||||
|
||||
#### Focus
|
||||
|
||||
- Every focusable element must have a visible focus indicator.
|
||||
- Custom buttons:
|
||||
`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-base-content/15`.
|
||||
- Inputs: rely on daisyui's input focus ring; inputs with custom styling use
|
||||
`focus:ring-2 focus:ring-primary/40`.
|
||||
- Don't use `outline-none` without `focus-visible:` replacement.
|
||||
|
||||
#### Hit targets
|
||||
|
||||
- **Minimum**: 32px (the size of `btn-sm`).
|
||||
- **Recommended**: 40px (`btn`) on touch surfaces.
|
||||
- **Mobile**: 44px+ for taps that aren't fail-safe (delete, navigate-away).
|
||||
- The `touch-target` class in globals.css extends a small visual control's hit area to
|
||||
44px without changing its rendered size — use it on icon-sized buttons in mobile UIs.
|
||||
|
||||
#### Color contrast
|
||||
|
||||
- Body text on background: WCAG AA (4.5:1) minimum.
|
||||
- Large text: WCAG AA Large (3:1) minimum.
|
||||
- Interactive text on hover state: still passes contrast on the new background.
|
||||
- Theme palette is generated from `(bg, fg, primary)`; the tinycolor pipeline keeps
|
||||
contrast within range, but custom themes can break this — Settings → Color flags
|
||||
low-contrast custom themes.
|
||||
|
||||
#### Keyboard
|
||||
|
||||
- Tab order matches visual order. If you use `flex-row-reverse` for visual layout,
|
||||
consider `tabIndex` to fix order.
|
||||
- Modal focus trap: `<Dialog>` handles this.
|
||||
- Esc to dismiss: `<Dialog>` and `<Popup>` handle this.
|
||||
- Arrow keys for grouped controls (radio-like tab strips, sortable lists). dnd-kit's
|
||||
`KeyboardSensor` is wired for sortable lists.
|
||||
|
||||
---
|
||||
|
||||
### 8. E-ink overlay (cross-cutting)
|
||||
|
||||
E-ink mode is toggled by `[data-eink='true']` on the document. It applies a global
|
||||
override layer in `src/styles/globals.css:484-622` that:
|
||||
|
||||
- Removes all `box-shadow`.
|
||||
- Forces `text-base-content`, `text-blue-*`, `text-red-*`, `text-neutral-content` to a
|
||||
single foreground color.
|
||||
- Inverts `btn-primary` and `btn-outline` to base-content bg + base-100 text.
|
||||
- Adds 1px contrast borders to `.eink-bordered`, `.modal-box`, `.menu-container`,
|
||||
`.popup-container`, `.alert`, `.opds-navigation .card`, `.booknote-item`,
|
||||
`.bookitem-main`.
|
||||
|
||||
What this means for new components:
|
||||
|
||||
| Surface type | Required class | Why |
|
||||
| ------------------------------------ | ----------------------- | ------------------------------------------------------------- |
|
||||
| Custom bordered button or input | `eink-bordered` | Gets the 1px contrast border in eink |
|
||||
| Primary CTA | `btn-primary` | Picks up the inverted treatment |
|
||||
| Cancel / secondary action | `btn-ghost` (no border) | Reads as "outlined" only after pairing with the CTA |
|
||||
| Card / panel using `border-base-200` | `eink-bordered` | Otherwise the soft border vanishes in eink |
|
||||
| Modal / Popup | (auto) | `modal-box` and `.popup-container` are handled in globals.css |
|
||||
|
||||
Verification checklist before shipping a new UI:
|
||||
|
||||
- [ ] Toggle Settings → Misc → Eink mode and re-test every screen.
|
||||
- [ ] Every container that has a soft border (`border-base-200`) still has visible
|
||||
delineation.
|
||||
- [ ] Every CTA is distinguishable from its neighbors (cancel, secondary).
|
||||
- [ ] No hover transforms make the UI feel jumpy.
|
||||
- [ ] Text is fully opaque (no `text-base-content/60` content; eink can't render the
|
||||
reduced opacity well).
|
||||
|
||||
#### What's NOT compatible with e-ink
|
||||
|
||||
- Drop shadows for hierarchy (use borders).
|
||||
- Color-only state changes (use border weight or fill swap).
|
||||
- Hover scale / translate (they look broken on slow refresh).
|
||||
- Animations longer than ~200ms (visible refresh artifacts).
|
||||
|
||||
---
|
||||
|
||||
### 9. Cross-platform grace notes
|
||||
|
||||
Readest ships on **macOS, Windows, Linux, iOS, Android, web**. Adwaita is desktop-GNOME-
|
||||
native; we adapt where the host OS has strong conventions, but never at the cost of
|
||||
identity.
|
||||
|
||||
#### iOS
|
||||
|
||||
- Slightly larger corner radii feel native (`rounded-xl` on dialogs, `rounded-lg` on
|
||||
cards).
|
||||
- Safe area insets are mandatory for top + bottom anchored elements (see
|
||||
`docs/safe-area-insets.md`).
|
||||
- Avoid Material Design ripple effects.
|
||||
- Sheet-style modals (bottom-anchored) match iOS conventions and are preferred over
|
||||
centered dialogs on phone-sized screens.
|
||||
|
||||
#### Android
|
||||
|
||||
- Material 3 conventions that conflict with Adwaita (FABs, elevation shadows, ripple
|
||||
inks): **don't** copy them. Readest's identity is Adwaita; the user is reading on
|
||||
Android, not in Android.
|
||||
- Touch targets bumped to 48px for primary actions (Material's recommended target).
|
||||
- Back-gesture-aware UIs: ensure swipe-from-edge doesn't conflict with horizontal swipe
|
||||
controls.
|
||||
|
||||
#### Linux
|
||||
|
||||
- Native Adwaita territory. Readest can match host theme for window chrome (Tauri
|
||||
decorations) but should keep its own internal palette for the reading surface — book
|
||||
themes (sepia, gruvbox, etc.) are user choices, not OS choices.
|
||||
|
||||
#### macOS / Windows
|
||||
|
||||
- Window controls (close/minimize/maximize) are platform-native via Tauri.
|
||||
- Title bar height matches platform convention; internal layout follows Readest's
|
||||
Adwaita palette.
|
||||
|
||||
#### Web
|
||||
|
||||
- No safe-area insets needed.
|
||||
- Keyboard shortcuts are doubled with command-palette discoverability (Cmd/Ctrl+K).
|
||||
- Browser-native focus rings: respected, augmented with `focus-visible:ring-*`.
|
||||
|
||||
#### E-ink readers (Android-based, custom firmware)
|
||||
|
||||
- Detected via the eink mode toggle (Settings → Misc).
|
||||
- All rules in §8 apply.
|
||||
- This is a **first-class** target, not a fallback.
|
||||
|
||||
---
|
||||
|
||||
### 10. Anti-patterns
|
||||
|
||||
Things that LOOK fine in isolation but break the system. Each one has a real source diff
|
||||
or commit reference.
|
||||
|
||||
#### 10.1 Loud outlined CTAs for non-primary actions
|
||||
|
||||
```tsx
|
||||
// Anti-pattern (was in CustomDictionaries.tsx, fixed Nov 2026):
|
||||
<button className='btn btn-outline btn-primary gap-2 normal-case [--animation-btn:0s]'>
|
||||
<MdAdd className='h-5 w-5' />
|
||||
Import Dictionary
|
||||
</button>
|
||||
|
||||
// Correct: ListExtension archetype (see §4.6)
|
||||
```
|
||||
|
||||
Why it broke: the buttons read as primary CTAs but are list extensions. They competed
|
||||
with the active settings tab indicator and pulled the eye from the list itself.
|
||||
|
||||
#### 10.2 Recoloring the whole button on hover
|
||||
|
||||
```tsx
|
||||
// Anti-pattern:
|
||||
<button className="text-base-content/70 hover:text-base-content hover:bg-primary/10">
|
||||
|
||||
// Correct: keep the label color steady, hover via bg shift on the surface
|
||||
<button className="text-base-content hover:bg-base-200 transition-colors">
|
||||
```
|
||||
|
||||
Why: principle 2.4 (localize the hover signal). Whole-button color shifts feel decorative.
|
||||
|
||||
#### 10.3 Transform-based hover
|
||||
|
||||
```tsx
|
||||
// Anti-pattern:
|
||||
<button className="hover:scale-105 transition-transform">
|
||||
|
||||
// Correct: color/border-based hover
|
||||
<button className="hover:bg-base-200 hover:border-base-300 transition-colors">
|
||||
```
|
||||
|
||||
Why: breaks under e-ink (§2.5), feels jumpy under Adwaita's calm rhythm.
|
||||
|
||||
#### 10.4 Soft borders without `eink-bordered`
|
||||
|
||||
```tsx
|
||||
// Anti-pattern:
|
||||
<div className="border border-base-200 bg-base-100 rounded-lg p-4">
|
||||
...
|
||||
</div>
|
||||
|
||||
// Correct:
|
||||
<div className="eink-bordered border border-base-200 bg-base-100 rounded-lg p-4">
|
||||
...
|
||||
</div>
|
||||
```
|
||||
|
||||
Why: in e-ink mode, `base-200` borders disappear into the background. `eink-bordered`
|
||||
flips the border to `base-content` so the boundary stays visible.
|
||||
|
||||
Exception: containers that **don't** need a visible boundary in eink (e.g., a
|
||||
`bg-base-100` surface that's already against `bg-base-200`) can skip `eink-bordered`.
|
||||
The class is opt-in for "this surface needs a border to read correctly".
|
||||
|
||||
#### 10.5 Reduced-opacity text in e-ink
|
||||
|
||||
```tsx
|
||||
// Anti-pattern (in eink):
|
||||
<span className="text-base-content/50">Optional metadata</span>
|
||||
|
||||
// Correct (still readable in eink):
|
||||
<span className="text-base-content text-xs">Optional metadata</span>
|
||||
// Or use semantic muting that the eink overlay handles:
|
||||
<span className="text-neutral-content">Optional metadata</span>
|
||||
```
|
||||
|
||||
Why: e-ink's reduced color depth turns `/50` opacity into illegible mush. Use size or
|
||||
weight for hierarchy on muted secondary text.
|
||||
|
||||
#### 10.6 Daisyui `btn` defaults without intent
|
||||
|
||||
```tsx
|
||||
// Anti-pattern: just reaching for `btn` with no role:
|
||||
<button className="btn">Click me</button>
|
||||
|
||||
// Correct: pick an archetype from §4.
|
||||
<button className="btn btn-ghost">Cancel</button> // Flat
|
||||
<button className="btn btn-primary">Save</button> // Accent CTA
|
||||
```
|
||||
|
||||
Why: daisyui's `btn` default isn't tuned for any specific role. Pick from the action
|
||||
vocabulary so the button signals its weight in the surface hierarchy.
|
||||
|
||||
#### 10.7 Ad-hoc surface tokens
|
||||
|
||||
```tsx
|
||||
// Anti-pattern:
|
||||
<div className="bg-white border-gray-200">
|
||||
|
||||
// Correct:
|
||||
<div className="bg-base-100 border-base-200">
|
||||
```
|
||||
|
||||
Why: hard-coded colors don't theme. Readest has 11 themes plus user-defined custom themes.
|
||||
Always use the daisyui semantic tokens.
|
||||
|
||||
#### 10.8 Mixing `btn` sizes within a surface
|
||||
|
||||
```tsx
|
||||
// Anti-pattern:
|
||||
<header>
|
||||
<button className="btn btn-sm">Search</button>
|
||||
<button className="btn btn-md">Settings</button>
|
||||
<button className="btn btn-xs">Close</button>
|
||||
</header>
|
||||
|
||||
// Correct: one size per surface
|
||||
<header>
|
||||
<button className="btn btn-ghost btn-circle h-8 min-h-8 w-8">Search</button>
|
||||
<button className="btn btn-ghost btn-circle h-8 min-h-8 w-8">Settings</button>
|
||||
<button className="btn btn-ghost btn-circle h-8 min-h-8 w-8">Close</button>
|
||||
</header>
|
||||
```
|
||||
|
||||
Why: visual rhythm. Mixed sizes feel like the surface is unfinished.
|
||||
|
||||
---
|
||||
|
||||
### 11. Quick reference
|
||||
|
||||
When designing a new surface, walk this checklist:
|
||||
|
||||
1. **What's the surface tier?** Window / View / Card. (§3)
|
||||
2. **What's the corner radius?** Match the tier. (§3)
|
||||
3. **Is there a primary action?** If yes, ONE accent CTA. If no, all flats. (§4.1, §4.3)
|
||||
4. **Are there list extensions?** Use the ListExtension archetype, not `btn-outline btn-primary`. (§4.6)
|
||||
5. **Is it a list?** Use the BoxedList chassis with ActionRow / SwitchRow / ComboRow / ExpanderRow rows. (§5)
|
||||
6. **Does it need `eink-bordered`?** If it has a soft border that must stay visible in
|
||||
eink mode, yes. (§8)
|
||||
7. **Is the hover signal localized?** One focal element changes, not the whole control. (§2.4)
|
||||
8. **Is motion color-only?** No transforms unless the transform IS the message. (§2.5)
|
||||
9. **Is focus visible?** `focus-visible:ring-2 focus-visible:ring-base-content/15` on
|
||||
custom buttons. (§7)
|
||||
10. **Will it work on the smallest theme + e-ink?** Toggle Sepia + Eink, retest.
|
||||
|
||||
---
|
||||
|
||||
### 12. Glossary
|
||||
|
||||
- **Adwaita / libadwaita**: GNOME's design system and widget toolkit. Source of Readest's
|
||||
visual lineage.
|
||||
- **AdwActionRow / AdwSwitchRow / AdwComboRow / AdwExpanderRow**: libadwaita's row
|
||||
primitives. Readest mirrors these conceptually with custom React components.
|
||||
- **AdwBoxedList**: libadwaita's named container for grouped action rows.
|
||||
- **AdwBanner**: top-of-window inline alert (persistent).
|
||||
- **AdwToast**: bottom slide-in transient alert.
|
||||
- **Window / View / Card**: surface tiers (§3).
|
||||
- **ListExtension**: Readest-named archetype for "+ add new row" buttons (§4.6).
|
||||
- **eink-bordered**: utility class in `globals.css` that gives a surface its e-ink-mode
|
||||
contrast border. Opt-in.
|
||||
- **Pill ghost**: circular icon button, `btn-ghost btn-circle`.
|
||||
|
||||
---
|
||||
|
||||
### 13. Maintenance
|
||||
|
||||
This doc is the **source of truth** for new design decisions. When the system grows:
|
||||
|
||||
- New archetypes get a numbered subsection in §4 or §5.
|
||||
- New anti-patterns get added to §10 with a real source reference.
|
||||
- Updates to existing principles require a brief why-changed note in the relevant section.
|
||||
|
||||
Cross-references that must stay in sync:
|
||||
|
||||
- `CLAUDE.md` E-ink mode section → §8 of this doc.
|
||||
- `docs/safe-area-insets.md` → §9 (cross-platform).
|
||||
- `src/styles/globals.css` `[data-eink]` rules → §8.
|
||||
- `src/styles/themes.ts` Palette type → §3 token table.
|
||||
|
||||
If you change a rule here, search for the cross-reference and update both.
|
||||
@@ -41,6 +41,30 @@ pnpm i18n:extract # Scans codebase, adds new keys with __STRING_NOT_TRANSLATE
|
||||
- Translation files: `public/locales/<locale>/translation.json`
|
||||
- Only `_('KEY')` and `_('KEY', options)` patterns are recognized by i18next-scanner
|
||||
|
||||
### Adding a New Translation Language
|
||||
|
||||
The supported language set has a single ground truth: [`i18n-langs.json`](../i18n-langs.json). Both the i18next runtime (`src/i18n/i18n.ts`) and the extractor (`i18next-scanner.config.cjs`) read from it, so adding a locale is a two-file change plus a translation pass.
|
||||
|
||||
1. **Add the locale code** to [`i18n-langs.json`](../i18n-langs.json). Use the exact code i18next will emit (e.g. `hu`, `zh-CN`). Do not add `en` — it's the source language and lives outside this list.
|
||||
|
||||
2. **Add a display label** to `TRANSLATED_LANGS` in [`src/services/constants.ts`](../src/services/constants.ts). The key is the locale code, the value is the language's native name (e.g. `hu: 'Magyar'`). This is what users see in the language picker.
|
||||
|
||||
3. **Generate the translation file**:
|
||||
|
||||
```bash
|
||||
pnpm i18n:extract
|
||||
```
|
||||
|
||||
This creates `public/locales/<code>/translation.json` with every key set to `__STRING_NOT_TRANSLATED__`.
|
||||
|
||||
4. **Translate** every `__STRING_NOT_TRANSLATED__` placeholder in the new file. The `/i18n` skill automates this; the singular `en/translation.json` only holds plural variants and proper nouns, so use the JSON keys themselves as the English source.
|
||||
|
||||
5. **Verify** with `grep -r "__STRING_NOT_TRANSLATED__" public/locales/<code>/` — the result should be empty.
|
||||
|
||||
6. **Translate the KOReader companion plugin** (`apps/readest.koplugin`). It pulls the locale set from the same `i18n-langs.json` via the scanner config, but the catalog format is gettext `.po`, not JSON. Steps:
|
||||
- Add a `LANG_META` entry (label + Plural-Forms) for the new code in [`apps/readest.koplugin/scripts/extract-i18n.js`](../../readest.koplugin/scripts/extract-i18n.js). Without it the extractor prints `<code> skipped (no metadata in extract-i18n.js)` and the catalog is never created.
|
||||
- Trigger the `/i18n-koplugin` skill to run extraction and fill every empty `msgstr ""` in `apps/readest.koplugin/locales/<code>/translation.po`.
|
||||
|
||||
### Rules
|
||||
|
||||
- `stubTranslation` is for extraction only — always apply `_()` from `useTranslation` in the component for runtime translation.
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
[
|
||||
"de",
|
||||
"ja",
|
||||
"es",
|
||||
"fa",
|
||||
"fr",
|
||||
"it",
|
||||
"el",
|
||||
"ko",
|
||||
"uk",
|
||||
"nl",
|
||||
"sl",
|
||||
"sv",
|
||||
"pl",
|
||||
"pt",
|
||||
"ru",
|
||||
"tr",
|
||||
"hi",
|
||||
"id",
|
||||
"vi",
|
||||
"ms",
|
||||
"he",
|
||||
"ar",
|
||||
"th",
|
||||
"bo",
|
||||
"bn",
|
||||
"ta",
|
||||
"si",
|
||||
"ro",
|
||||
"hu",
|
||||
"uz",
|
||||
"pt-BR",
|
||||
"zh-CN",
|
||||
"zh-TW"
|
||||
]
|
||||
@@ -1,3 +1,5 @@
|
||||
const lngs = require('./i18n-langs.json');
|
||||
|
||||
const options = {
|
||||
debug: false,
|
||||
sort: false,
|
||||
@@ -5,39 +7,7 @@ const options = {
|
||||
list: ['_'],
|
||||
extensions: ['.js', '.jsx', '.ts', '.tsx'],
|
||||
},
|
||||
lngs: [
|
||||
'de',
|
||||
'ja',
|
||||
'es',
|
||||
'fa',
|
||||
'fr',
|
||||
'it',
|
||||
'el',
|
||||
'ko',
|
||||
'uk',
|
||||
'nl',
|
||||
'sl',
|
||||
'sv',
|
||||
'pl',
|
||||
'pt',
|
||||
'ru',
|
||||
'tr',
|
||||
'hi',
|
||||
'id',
|
||||
'vi',
|
||||
'ms',
|
||||
'he',
|
||||
'ar',
|
||||
'th',
|
||||
'bo',
|
||||
'bn',
|
||||
'ta',
|
||||
'si',
|
||||
'zh-CN',
|
||||
'zh-TW',
|
||||
'ro',
|
||||
'hu',
|
||||
],
|
||||
lngs,
|
||||
ns: ['translation'],
|
||||
defaultNs: 'translation',
|
||||
defaultValue: '__STRING_NOT_TRANSLATED__',
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
import withSerwistInit from '@serwist/next';
|
||||
import withBundleAnalyzer from '@next/bundle-analyzer';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
const isDev = process.env['NODE_ENV'] === 'development';
|
||||
const appPlatform = process.env['NEXT_PUBLIC_APP_PLATFORM'];
|
||||
@@ -27,10 +31,16 @@ const nextConfig = {
|
||||
assetPrefix: '',
|
||||
reactStrictMode: true,
|
||||
serverExternalPackages: ['isows'],
|
||||
allowedDevOrigins: ['192.168.2.120'],
|
||||
webpack: (config) => {
|
||||
config.resolve.alias = {
|
||||
...config.resolve.alias,
|
||||
nunjucks: 'nunjucks/browser/nunjucks.js',
|
||||
// `js-mdict` is consumed as TS source via tsconfig paths from
|
||||
// `packages/js-mdict/src/`; its sources `import 'fflate'` directly.
|
||||
// Without an alias, webpack walks up from that source location and
|
||||
// can't find fflate (only installed in this app's node_modules).
|
||||
fflate: path.resolve(__dirname, 'node_modules/fflate'),
|
||||
...(appPlatform !== 'web' ? { '@tursodatabase/database-wasm': false } : {}),
|
||||
};
|
||||
return config;
|
||||
@@ -38,6 +48,9 @@ const nextConfig = {
|
||||
turbopack: {
|
||||
resolveAlias: {
|
||||
nunjucks: 'nunjucks/browser/nunjucks.js',
|
||||
// Turbopack rejects absolute paths in resolveAlias ("server relative
|
||||
// imports not implemented") — use a project-relative path.
|
||||
fflate: './node_modules/fflate',
|
||||
...(appPlatform !== 'web' ? { '@tursodatabase/database-wasm': './src/utils/stub.ts' } : {}),
|
||||
},
|
||||
},
|
||||
@@ -67,6 +80,14 @@ const nextConfig = {
|
||||
source: '/reader/:ids',
|
||||
destination: '/reader?ids=:ids',
|
||||
},
|
||||
{
|
||||
source: '/o/book/:hash/annotation/:id',
|
||||
destination: '/o?book=:hash¬e=:id',
|
||||
},
|
||||
{
|
||||
source: '/s/:token',
|
||||
destination: '/s?token=:token',
|
||||
},
|
||||
];
|
||||
},
|
||||
async headers() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@readest/readest-app",
|
||||
"version": "0.10.6",
|
||||
"version": "0.11.1",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
@@ -14,8 +14,12 @@
|
||||
"build-web:vinext": "dotenv -e .env.web -- vinext build",
|
||||
"start-web:vinext": "dotenv -e .env.web -- vinext start",
|
||||
"build-tauri": "dotenv -e .env.tauri -- next build",
|
||||
"dev-android": "tauri android build -t aarch64 -- --features devtools && adb install -r src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk",
|
||||
"dev-ios": "tauri ios build -- --features devtools && ideviceinstaller -i src-tauri/gen/apple/build/arm64/Readest.ipa",
|
||||
"i18n:extract": "i18next-scanner --config i18next-scanner.config.cjs",
|
||||
"lint": "tsgo --noEmit && biome check .",
|
||||
"lint": "tsgo --noEmit && biome check . && pnpm lint:lua",
|
||||
"lint:lua": "node ../readest.koplugin/scripts/lint-koplugin.mjs",
|
||||
"test:lua": "node ../readest.koplugin/scripts/test-koplugin.mjs",
|
||||
"test": "dotenv -e .env -e .env.test.local -- vitest",
|
||||
"test:coverage": "dotenv -e .env -e .env.test.local -- vitest run --coverage",
|
||||
"test:browser": "dotenv -e .env -e .env.test.local -- vitest run --config vitest.browser.config.mts",
|
||||
@@ -31,7 +35,7 @@
|
||||
"clippy:check": "cargo clippy -p Readest --no-deps -- -D warnings",
|
||||
"format": "pnpm -w format",
|
||||
"format:check": "pnpm -w format:check",
|
||||
"prepare-public-vendor": "mkdirp ./public/vendor/pdfjs ./public/vendor/simplecc",
|
||||
"prepare-public-vendor": "mkdirp ./public/vendor/pdfjs ./public/vendor/simplecc ./public/vendor/jieba",
|
||||
"copy-pdfjs-js": "cpx \"../../packages/foliate-js/node_modules/pdfjs-dist/legacy/build/{pdf.worker.min.mjs,pdf.min.mjs,pdf.d.mts}\" ./public/vendor/pdfjs",
|
||||
"copy-pdfjs-wasm": "cpx \"../../packages/foliate-js/node_modules/pdfjs-dist/wasm/{openjpeg.wasm,qcms_bg.wasm}\" ./public/vendor/pdfjs",
|
||||
"copy-pdfjs-fonts": "cpx \"../../packages/foliate-js/node_modules/pdfjs-dist/{cmaps,standard_fonts}/*\" ./public/vendor/pdfjs",
|
||||
@@ -40,9 +44,11 @@
|
||||
"copy-flatten-pdfjs-css": "pnpm copy-flatten-pdfjs-annotation-layer-css && pnpm copy-flatten-pdfjs-text-layer-css",
|
||||
"copy-pdfjs": "pnpm copy-pdfjs-js && pnpm copy-pdfjs-wasm && pnpm copy-pdfjs-fonts && pnpm copy-flatten-pdfjs-css",
|
||||
"copy-simplecc": "cpx \"../../packages/simplecc-wasm/dist/web/*\" ./public/vendor/simplecc",
|
||||
"copy-jieba": "cpx \"./node_modules/jieba-wasm/pkg/web/*\" ./public/vendor/jieba",
|
||||
"setup-pdfjs": "pnpm prepare-public-vendor && pnpm copy-pdfjs",
|
||||
"setup-simplecc": "pnpm prepare-public-vendor && pnpm copy-simplecc",
|
||||
"setup-vendors": "pnpm setup-pdfjs && pnpm setup-simplecc",
|
||||
"setup-jieba": "pnpm prepare-public-vendor && pnpm copy-jieba",
|
||||
"setup-vendors": "pnpm setup-pdfjs && pnpm setup-simplecc && pnpm setup-jieba",
|
||||
"build-win-x64": "dotenv -e .env.tauri.local -- tauri build --target i686-pc-windows-msvc --bundles nsis",
|
||||
"build-win-arm64": "dotenv -e .env.tauri.local -- tauri build --target aarch64-pc-windows-msvc --bundles nsis",
|
||||
"build-linux-x64": "dotenv -e .env.tauri.local -- tauri build --target x86_64-unknown-linux-gnu --bundles appimage",
|
||||
@@ -78,11 +84,14 @@
|
||||
"@aws-sdk/client-s3": "^3.1000.0",
|
||||
"@aws-sdk/s3-request-presigner": "^3.1000.0",
|
||||
"@choochmeque/tauri-plugin-sharekit-api": "^0.3.0",
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@emnapi/core": "^1.7.1",
|
||||
"@emnapi/runtime": "^1.7.1",
|
||||
"@fabianlars/tauri-plugin-oauth": "2",
|
||||
"@napi-rs/wasm-runtime": "^1.1.1",
|
||||
"@opennextjs/cloudflare": "^1.19.0",
|
||||
"@opennextjs/cloudflare": "^1.19.4",
|
||||
"@radix-ui/react-collapsible": "^1.1.12",
|
||||
"@radix-ui/react-dialog": "^1.1.15",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
||||
@@ -95,8 +104,8 @@
|
||||
"@radix-ui/react-tooltip": "^1.2.8",
|
||||
"@serwist/next": "^9.5.6",
|
||||
"@serwist/webpack-plugin": "^9.5.6",
|
||||
"@stripe/react-stripe-js": "^3.7.0",
|
||||
"@stripe/stripe-js": "^7.4.0",
|
||||
"@stripe/react-stripe-js": "^6.2.0",
|
||||
"@stripe/stripe-js": "^9.3.1",
|
||||
"@supabase/auth-ui-react": "^0.4.7",
|
||||
"@supabase/auth-ui-shared": "^0.1.8",
|
||||
"@supabase/supabase-js": "^2.76.1",
|
||||
@@ -114,8 +123,9 @@
|
||||
"@tauri-apps/plugin-shell": "~2.3.5",
|
||||
"@tauri-apps/plugin-updater": "^2.10.0",
|
||||
"@tauri-apps/plugin-websocket": "~2.4.2",
|
||||
"@tursodatabase/database-common": "^0.5.0",
|
||||
"@tursodatabase/database-wasm": "^0.5.0",
|
||||
"@readest/turso-database-common": "0.6.0-pre.28-readest.0",
|
||||
"@readest/turso-database-wasm-common": "0.6.0-pre.28-readest.0",
|
||||
"@readest/turso-database-wasm": "0.6.0-pre.28-readest.0",
|
||||
"@tybys/wasm-util": "^0.10.1",
|
||||
"@zip.js/zip.js": "^2.8.16",
|
||||
"abortcontroller-polyfill": "^1.7.8",
|
||||
@@ -129,7 +139,8 @@
|
||||
"cmdk": "^1.1.1",
|
||||
"cors": "^2.8.5",
|
||||
"dayjs": "^1.11.13",
|
||||
"dompurify": "^3.3.0",
|
||||
"dompurify": "^3.4.0",
|
||||
"fflate": "^0.8.2",
|
||||
"foliate-js": "workspace:*",
|
||||
"franc-min": "^6.2.0",
|
||||
"fzf": "^0.5.2",
|
||||
@@ -138,10 +149,11 @@
|
||||
"highlight.js": "^11.11.1",
|
||||
"i18next": "^24.2.0",
|
||||
"i18next-browser-languagedetector": "^8.0.2",
|
||||
"i18next-http-backend": "^3.0.1",
|
||||
"i18next-http-backend": "^3.0.5",
|
||||
"iso-639-2": "^3.0.2",
|
||||
"iso-639-3": "^3.0.1",
|
||||
"isomorphic-ws": "^5.0.0",
|
||||
"jieba-wasm": "^2.4.0",
|
||||
"js-md5": "^0.8.3",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"lucide-react": "^0.562.0",
|
||||
@@ -165,12 +177,12 @@
|
||||
"remark-gfm": "^4.0.1",
|
||||
"semver": "^7.7.1",
|
||||
"streamdown": "^1.6.10",
|
||||
"stripe": "^18.2.1",
|
||||
"stripe": "^22.0.2",
|
||||
"styled-jsx": "^5.1.7",
|
||||
"tailwind-merge": "^3.4.0",
|
||||
"tauri-plugin-device-info-api": "^1.0.1",
|
||||
"tinycolor2": "^1.6.0",
|
||||
"uuid": "^11.1.0",
|
||||
"uuid": "^14.0.0",
|
||||
"ws": "^8.18.3",
|
||||
"zod": "^4.0.8",
|
||||
"zustand": "5.0.10"
|
||||
@@ -181,7 +193,7 @@
|
||||
"@tauri-apps/cli": "2.10.1",
|
||||
"@testing-library/dom": "^10.4.0",
|
||||
"@testing-library/react": "^16.3.0",
|
||||
"@tursodatabase/database": "^0.5.0",
|
||||
"@tursodatabase/database": "0.6.0-pre.28",
|
||||
"@types/cors": "^2.8.17",
|
||||
"@types/cssbeautify": "^0.3.5",
|
||||
"@types/lunr": "^2.3.7",
|
||||
@@ -230,7 +242,7 @@
|
||||
"vite": "^7.3.3",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^4.0.18",
|
||||
"wrangler": "^4.81.1"
|
||||
"wrangler": "^4.85.0"
|
||||
},
|
||||
"browserslist": [
|
||||
"chrome 92",
|
||||
|
||||
@@ -8,7 +8,15 @@
|
||||
"components": [
|
||||
{
|
||||
"/": "/auth/*",
|
||||
"comment": "Matches any URL whose path starts with /auth/"
|
||||
"comment": "Matches OAuth callback paths"
|
||||
},
|
||||
{
|
||||
"/": "/o/*",
|
||||
"comment": "Matches annotation deeplinks"
|
||||
},
|
||||
{
|
||||
"/": "/s/*",
|
||||
"comment": "Matches book share links"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -101,7 +101,6 @@
|
||||
"Updated": "تم التحديث",
|
||||
"Version {{version}}": "الإصدار {{version}}",
|
||||
"Vertical Direction": "الاتجاه العمودي",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "مرحبًا بكم في مكتبتكم. يمكنكم استيراد كتبكم هنا وقراءتها في أي وقت.",
|
||||
"Wikipedia": "ويكيبيديا",
|
||||
"Writing Mode": "وضع الكتابة",
|
||||
"Your Library": "المكتبة الخاصة بك",
|
||||
@@ -306,7 +305,6 @@
|
||||
"No notes match your search": "لا توجد ملاحظات تطابق بحثك",
|
||||
"Search notes and excerpts...": "بحث في الملاحظات والمقتطفات...",
|
||||
"Sign in to Sync": "قم بتسجيل الدخول للمزامنة",
|
||||
"Synced at {{time}}": "تمت المزامنة في {{time}}",
|
||||
"Never synced": "لم تتم المزامنة بعد",
|
||||
"Show Remaining Time": "إظهار الوقت المتبقي",
|
||||
"{{time}} min left in chapter": "{{time}} دقيقة متبقية حتى نهاية الفصل",
|
||||
@@ -477,14 +475,12 @@
|
||||
"Remove from Cloud Only": "إزالة من السحابة فقط",
|
||||
"Remove from Device Only": "إزالة من الجهاز فقط",
|
||||
"Disconnected": "غير متصل",
|
||||
"KOReader Sync Settings": "إعدادات مزامنة KOReader",
|
||||
"Sync Strategy": "استراتيجية المزامنة",
|
||||
"Ask on conflict": "اسأل عند حدوث تعارض",
|
||||
"Always use latest": "استخدام الأحدث دائمًا",
|
||||
"Send changes only": "إرسال التغييرات فقط",
|
||||
"Receive changes only": "استلام التغييرات فقط",
|
||||
"Checksum Method": "طريقة التحقق من الصحة",
|
||||
"File Content (recommended)": "محتوى الملف (موصى به)",
|
||||
"File Name": "اسم الملف",
|
||||
"Device Name": "اسم الجهاز",
|
||||
"Connect to your KOReader Sync server.": "الاتصال بخادم مزامنة KOReader الخاص بك.",
|
||||
@@ -495,10 +491,7 @@
|
||||
"Connect": "الاتصال",
|
||||
"KOReader Sync": "مزامنة KOReader",
|
||||
"Sync Conflict": "تعارض المزامنة",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "مزامنة تقدم القراءة من \"{{deviceName}}\"؟",
|
||||
"another device": "جهاز آخر",
|
||||
"Local Progress": "التقدم المحلي",
|
||||
"Remote Progress": "التقدم البعيد",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "الصفحة {{page}} من {{total}} ({{percentage}}%)",
|
||||
"Current position": "الموقع الحالي",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "تقريبًا الصفحة {{page}} من {{total}} ({{percentage}}%)",
|
||||
@@ -651,7 +644,6 @@
|
||||
"Strikethrough": "يتوسطه خط",
|
||||
"Squiggly": "متعرج",
|
||||
"Outline": "مخطط",
|
||||
"Save Current Color": "حفظ اللون الحالي",
|
||||
"Quick Colors": "ألوان سريعة",
|
||||
"Highlighter": "محدد النص",
|
||||
"Save Book Cover": "حفظ غلاف الكتاب",
|
||||
@@ -831,7 +823,6 @@
|
||||
"Annotate text after selection": "تعليق على النص بعد التحديد",
|
||||
"Search text after selection": "البحث في النص بعد التحديد",
|
||||
"Look up text in dictionary after selection": "البحث عن النص في القاموس بعد التحديد",
|
||||
"Look up text in Wikipedia after selection": "البحث عن النص في ويكيبيديا بعد التحديد",
|
||||
"Translate text after selection": "ترجمة النص بعد التحديد",
|
||||
"Read text aloud after selection": "قراءة النص بصوت عالٍ بعد التحديد",
|
||||
"Proofread text after selection": "تدقيق النص بعد التحديد",
|
||||
@@ -878,9 +869,6 @@
|
||||
"Failed to export the book.": "فشل تصدير الكتاب.",
|
||||
"Export Book": "تصدير الكتاب",
|
||||
"Whole word:": "كلمة كاملة:",
|
||||
"Error": "خطأ",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "تعذر تحميل المقال. حاول البحث مباشرة على {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "تعذر تحميل الكلمة. حاول البحث مباشرة على {{link}}.",
|
||||
"Date Published": "تاريخ النشر",
|
||||
"Only for TTS:": "فقط لـ TTS:",
|
||||
"Uploaded": "تم الرفع",
|
||||
@@ -1087,16 +1075,12 @@
|
||||
"Invalid Readwise access token": "رمز وصول Readwise غير صالح",
|
||||
"Disconnected from Readwise": "تم قطع الاتصال بـ Readwise",
|
||||
"Never": "أبداً",
|
||||
"Readwise Settings": "إعدادات Readwise",
|
||||
"Connected to Readwise": "متصل بـ Readwise",
|
||||
"Last synced: {{time}}": "آخر مزامنة: {{time}}",
|
||||
"Sync Enabled": "تم تمكين المزامنة",
|
||||
"Disconnect": "قطع الاتصال",
|
||||
"Connect your Readwise account to sync highlights.": "قم بتوصيل حساب Readwise الخاص بك لمزامنة التمييزات.",
|
||||
"Get your access token at": "احصل على رمز الوصول الخاص بك من",
|
||||
"Access Token": "رمز الوصول",
|
||||
"Paste your Readwise access token": "الصق رمز وصول Readwise الخاص بك",
|
||||
"Config": "تكوين",
|
||||
"Readwise Sync": "مزامنة Readwise",
|
||||
"Push Highlights": "إرسال التمييزات",
|
||||
"Highlights synced to Readwise": "تمت مزامنة التمييزات مع Readwise",
|
||||
@@ -1171,7 +1155,6 @@
|
||||
"Copy Selection": "نسخ التحديد",
|
||||
"Translate Selection": "ترجمة التحديد",
|
||||
"Dictionary Lookup": "البحث في القاموس",
|
||||
"Wikipedia Lookup": "البحث في ويكيبيديا",
|
||||
"Read Aloud Selection": "قراءة التحديد بصوت عالٍ",
|
||||
"Proofread Selection": "تدقيق التحديد",
|
||||
"Open Settings": "فتح الإعدادات",
|
||||
@@ -1207,25 +1190,18 @@
|
||||
"Drag to seek": "اسحب للتقديم",
|
||||
"Punctuation Delay": "تأخير علامات الترقيم",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "يرجى التأكيد على أن اتصال OPDS هذا سيتم توجيهه عبر خوادم Readest على تطبيق الويب قبل المتابعة.",
|
||||
"Custom Headers": "رؤوس مخصصة",
|
||||
"Custom Headers (optional)": "رؤوس مخصصة (اختياري)",
|
||||
"Add one header per line using \"Header-Name: value\".": "أضف رأسًا واحدًا لكل سطر باستخدام \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "أفهم أن اتصال OPDS هذا سيتم توجيهه عبر خوادم Readest على تطبيق الويب. إذا لم أثق بـ Readest فيما يتعلق ببيانات الاعتماد أو الرؤوس هذه، يجب أن أستخدم التطبيق الأصلي بدلاً من ذلك.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "تعذر الاتصال بـ Hardcover. يرجى التحقق من اتصال الشبكة.",
|
||||
"Invalid Hardcover API token": "رمز API الخاص بـ Hardcover غير صالح",
|
||||
"Disconnected from Hardcover": "تم قطع الاتصال بـ Hardcover",
|
||||
"Hardcover Settings": "إعدادات Hardcover",
|
||||
"Connected to Hardcover": "متصل بـ Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "اربط حسابك على Hardcover لمزامنة تقدم القراءة والملاحظات.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "احصل على رمز API من hardcover.app ← الإعدادات ← API.",
|
||||
"API Token": "رمز API",
|
||||
"Paste your Hardcover API token": "الصق رمز API الخاص بك في Hardcover",
|
||||
"Hardcover sync enabled for this book": "تم تفعيل مزامنة Hardcover لهذا الكتاب",
|
||||
"Hardcover sync disabled for this book": "تم تعطيل مزامنة Hardcover لهذا الكتاب",
|
||||
"Hardcover Sync": "مزامنة Hardcover",
|
||||
"Enable for This Book": "تفعيل لهذا الكتاب",
|
||||
"Push Notes": "دفع الملاحظات",
|
||||
"Enable Hardcover sync for this book first.": "قم بتفعيل مزامنة Hardcover لهذا الكتاب أولاً.",
|
||||
"No annotations or excerpts to sync for this book.": "لا توجد تعليقات توضيحية أو مقتطفات لمزامنتها لهذا الكتاب.",
|
||||
"Configure Hardcover in Settings first.": "قم بإعداد Hardcover في الإعدادات أولاً.",
|
||||
"No new Hardcover note changes to sync.": "لا توجد تغييرات جديدة في ملاحظات Hardcover للمزامنة.",
|
||||
@@ -1239,9 +1215,302 @@
|
||||
"Split Hyphens": "تقسيم الواصلات",
|
||||
"Apply Theme Colors to PDF": "تطبيق ألوان السمة على PDF",
|
||||
"Name": "الاسم",
|
||||
"Unavailable": "غير متاح",
|
||||
"Remove": "إزالة",
|
||||
"Edit OPDS Catalog": "تعديل كتالوج OPDS",
|
||||
"Save Changes": "حفظ التغييرات",
|
||||
"Use Book Layout": "استخدام تخطيط الكتاب"
|
||||
"Use Book Layout": "استخدام تخطيط الكتاب",
|
||||
"End of this section. Continue to the next.": "نهاية هذا القسم. تابع إلى القسم التالي.",
|
||||
"Auto-download": "تنزيل تلقائي",
|
||||
"Auto-download new items": "تنزيل العناصر الجديدة تلقائياً",
|
||||
"Automatically download new publications when the app syncs": "تنزيل المنشورات الجديدة تلقائياً عند مزامنة التطبيق",
|
||||
"{{count}} new item(s) downloaded from OPDS_zero": "لم يتم تنزيل أي عناصر جديدة من OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "تم تنزيل عنصر جديد من OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_two": "تم تنزيل عنصرين جديدين من OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_few": "تم تنزيل {{count}} عناصر جديدة من OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "تم تنزيل {{count}} عنصراً جديداً من OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "تم تنزيل {{count}} عنصر جديد من OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_zero": "فشلت مزامنة كتالوجات OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "فشلت مزامنة كتالوج OPDS واحد",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_two": "فشلت مزامنة كتالوجي OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_few": "فشلت مزامنة {{count}} كتالوجات OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "فشلت مزامنة {{count}} كتالوجاً من OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "فشلت مزامنة {{count}} كتالوج OPDS",
|
||||
"Last synced {{when}}": "آخر مزامنة {{when}}",
|
||||
"Failed downloads": "التنزيلات الفاشلة",
|
||||
"No failed downloads": "لا توجد تنزيلات فاشلة",
|
||||
"Attempts: {{count}}_zero": "المحاولات: {{count}}",
|
||||
"Attempts: {{count}}_one": "المحاولات: {{count}}",
|
||||
"Attempts: {{count}}_two": "المحاولات: {{count}}",
|
||||
"Attempts: {{count}}_few": "المحاولات: {{count}}",
|
||||
"Attempts: {{count}}_many": "المحاولات: {{count}}",
|
||||
"Attempts: {{count}}_other": "المحاولات: {{count}}",
|
||||
"Skip": "تخطي",
|
||||
"Skip all": "تخطي الكل",
|
||||
"Retry all": "إعادة المحاولة للكل",
|
||||
"{{count}} failed_zero": "{{count}} فشل",
|
||||
"{{count}} failed_one": "{{count}} فشل",
|
||||
"{{count}} failed_two": "{{count}} فشل",
|
||||
"{{count}} failed_few": "{{count}} فشل",
|
||||
"{{count}} failed_many": "{{count}} فشل",
|
||||
"{{count}} failed_other": "{{count}} فشل",
|
||||
"(none)": "(لا شيء)",
|
||||
"Identifiers": "المعرفات",
|
||||
"Read (Stream)": "قراءة (بث)",
|
||||
"Failed to start stream": "فشل بدء البث",
|
||||
"No dictionaries enabled": "لا توجد قواميس مفعلة",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "فعّل قاموسًا من الإعدادات ← اللغة ← القواميس.",
|
||||
"Wiktionary": "ويكاموس",
|
||||
"Drag to reorder": "اسحب لإعادة الترتيب",
|
||||
"Built-in": "مدمج",
|
||||
"Bundle is missing on this device. Re-import to use it.": "الحزمة غير موجودة على هذا الجهاز. أعد استيرادها لاستخدامها.",
|
||||
"This dictionary format is not supported.": "تنسيق هذا القاموس غير مدعوم.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_zero": "لم يتم استيراد أي قاموس",
|
||||
"Imported {{count}} dictionary_one": "تم استيراد قاموس واحد ({{count}})",
|
||||
"Imported {{count}} dictionary_two": "تم استيراد قاموسين",
|
||||
"Imported {{count}} dictionary_few": "تم استيراد {{count}} قواميس",
|
||||
"Imported {{count}} dictionary_many": "تم استيراد {{count}} قاموسًا",
|
||||
"Imported {{count}} dictionary_other": "تم استيراد {{count}} قاموسًا",
|
||||
"Skipped incomplete bundles: {{names}}": "تم تخطي الحزم غير المكتملة: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "فشل استيراد القاموس: {{message}}",
|
||||
"Dictionaries": "القواميس",
|
||||
"Delete Dictionary": "حذف القاموس",
|
||||
"Importing…": "جاري الاستيراد…",
|
||||
"Import Dictionary": "استيراد قاموس",
|
||||
"No dictionaries available.": "لا تتوفر قواميس.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "تحتاج حزم StarDict إلى ملفات .ifo و.idx و.dict.dz (الـ.syn اختياري).",
|
||||
"Select all the bundle files together when importing.": "حدد جميع ملفات الحزمة معًا عند الاستيراد.",
|
||||
"Manage Dictionaries": "إدارة القواميس",
|
||||
"Select Dictionary Files": "اختر ملفات القاموس",
|
||||
"Read on Wikipedia →": "اقرأ على ويكيبيديا ←",
|
||||
"This link can't be opened": "تعذر فتح هذا الرابط",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "تفتقد إلى معلومات مطلوبة في رابط التعليق. ربما تم اقتطاع الرابط الأصلي.",
|
||||
"Go to Readest": "الانتقال إلى Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "قارئ كتب إلكتروني مفتوح المصدر للجميع وعلى كل جهاز.",
|
||||
"Open in Readest": "فتح في Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "إذا لم يفتح Readest تلقائيًا، فاختر أحد الخيارات أدناه:",
|
||||
"Continue reading where you left off.": "تابع القراءة من حيث توقفت.",
|
||||
"Readest logo": "شعار Readest",
|
||||
"Opening Readest...": "جارٍ فتح Readest…",
|
||||
"Open in Readest app": "فتح في تطبيق Readest",
|
||||
"Continue in browser": "متابعة في المتصفح",
|
||||
"Don't have Readest?": "ليس لديك Readest؟",
|
||||
"Book not in your library": "الكتاب غير موجود في مكتبتك",
|
||||
"Share Book": "مشاركة الكتاب",
|
||||
"Could not create share link": "تعذر إنشاء رابط المشاركة",
|
||||
"Link copied": "تم نسخ الرابط",
|
||||
"Could not copy link": "تعذر نسخ الرابط",
|
||||
"Share revoked": "تم إلغاء المشاركة",
|
||||
"Could not revoke share": "تعذر إلغاء المشاركة",
|
||||
"Uploading book…": "جاري رفع الكتاب…",
|
||||
"Generating…": "جاري الإنشاء…",
|
||||
"Generate share link": "إنشاء رابط مشاركة",
|
||||
"Share URL": "رابط المشاركة",
|
||||
"Copy link": "نسخ الرابط",
|
||||
"Copied": "تم النسخ",
|
||||
"Share via…": "مشاركة عبر…",
|
||||
"Expires {{date}}": "تنتهي في {{date}}",
|
||||
"Revoking…": "جاري الإلغاء…",
|
||||
"Revoke share": "إلغاء المشاركة",
|
||||
"Sign in to share books": "سجّل الدخول لمشاركة الكتب",
|
||||
"Expiring soon": "تنتهي صلاحيته قريبًا",
|
||||
"Missing share token": "رمز المشاركة مفقود",
|
||||
"Could not add to your library": "تعذرت الإضافة إلى مكتبتك",
|
||||
"This share link is no longer available": "لم يعد رابط المشاركة هذا متاحًا",
|
||||
"The original link may have expired or been revoked.": "ربما انتهت صلاحية الرابط الأصلي أو تم إلغاؤه.",
|
||||
"Get Readest": "احصل على Readest",
|
||||
"Loading shared book…": "جاري تحميل الكتاب المشترك…",
|
||||
"Adding…": "جاري الإضافة…",
|
||||
"Add to my library": "إضافة إلى مكتبتي",
|
||||
"Could not load your shares": "تعذر تحميل مشاركاتك",
|
||||
"Revoked": "ملغى",
|
||||
"Expired": "منتهي الصلاحية",
|
||||
"Shared books": "الكتب المشتركة",
|
||||
"You haven't shared any books yet": "لم تشارك أي كتب بعد",
|
||||
"Open a book and tap Share to send it to a friend.": "افتح كتابًا واضغط على مشاركة لإرساله إلى صديق.",
|
||||
"{{count}} active_zero": "لا توجد روابط نشطة",
|
||||
"{{count}} active_one": "رابط نشط واحد",
|
||||
"{{count}} active_two": "رابطان نشطان",
|
||||
"{{count}} active_few": "{{count}} روابط نشطة",
|
||||
"{{count}} active_many": "{{count}} رابطًا نشطًا",
|
||||
"{{count}} active_other": "{{count}} رابط نشط",
|
||||
"{{count}} downloads_zero": "لا توجد تنزيلات",
|
||||
"{{count}} downloads_one": "تنزيل واحد",
|
||||
"{{count}} downloads_two": "تنزيلان",
|
||||
"{{count}} downloads_few": "{{count}} تنزيلات",
|
||||
"{{count}} downloads_many": "{{count}} تنزيلًا",
|
||||
"{{count}} downloads_other": "{{count}} تنزيل",
|
||||
"starts at saved page": "يبدأ من الصفحة المحفوظة",
|
||||
"More actions": "المزيد من الإجراءات",
|
||||
"Loading…": "جاري التحميل…",
|
||||
"Load more": "تحميل المزيد",
|
||||
"Could not load shared book": "تعذر تحميل الكتاب المشترك",
|
||||
"The share link is missing required information.": "يفتقد رابط المشاركة معلومات مطلوبة.",
|
||||
"Please check your connection and try again.": "يرجى التحقق من اتصالك والمحاولة مرة أخرى.",
|
||||
"Sign in to import shared books": "سجّل الدخول لاستيراد الكتب المشتركة",
|
||||
"Already in your library": "موجود بالفعل في مكتبتك",
|
||||
"Added to your library": "تمت الإضافة إلى مكتبتك",
|
||||
"Could not import shared book": "تعذر استيراد الكتاب المشترك",
|
||||
"Manage Shared Links": "إدارة روابط المشاركة",
|
||||
"Expires in": "تنتهي خلال",
|
||||
"{{count}} days_zero": "لا توجد أيام",
|
||||
"{{count}} days_one": "يوم واحد",
|
||||
"{{count}} days_two": "يومان",
|
||||
"{{count}} days_few": "{{count}} أيام",
|
||||
"{{count}} days_many": "{{count}} يومًا",
|
||||
"{{count}} days_other": "{{count}} يوم",
|
||||
"Expires in {{count}} days_zero": "تنتهي خلال أقل من يوم",
|
||||
"Expires in {{count}} days_one": "تنتهي خلال يوم واحد",
|
||||
"Expires in {{count}} days_two": "تنتهي خلال يومين",
|
||||
"Expires in {{count}} days_few": "تنتهي خلال {{count}} أيام",
|
||||
"Expires in {{count}} days_many": "تنتهي خلال {{count}} يومًا",
|
||||
"Expires in {{count}} days_other": "تنتهي خلال {{count}} يوم",
|
||||
"Expires in {{count}} hours_zero": "تنتهي خلال أقل من ساعة",
|
||||
"Expires in {{count}} hours_one": "تنتهي خلال ساعة واحدة",
|
||||
"Expires in {{count}} hours_two": "تنتهي خلال ساعتين",
|
||||
"Expires in {{count}} hours_few": "تنتهي خلال {{count}} ساعات",
|
||||
"Expires in {{count}} hours_many": "تنتهي خلال {{count}} ساعة",
|
||||
"Expires in {{count}} hours_other": "تنتهي خلال {{count}} ساعة",
|
||||
"Open in app": "فتح في التطبيق",
|
||||
"Shared with you": "تمت مشاركته معك",
|
||||
"Downloading… {{percent}}%": "جارٍ التنزيل… {{percent}}٪",
|
||||
"Import progress": "تقدم الاستيراد",
|
||||
"Share reading progress": "مشاركة تقدّم القراءة",
|
||||
"Includes your reading progress": "يتضمن تقدّم قراءتك",
|
||||
"Synced {{time}}": "تمت المزامنة {{time}}",
|
||||
"Sync Info": "معلومات المزامنة",
|
||||
"Last Synced": "آخر مزامنة",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "تحتاج حزم DICT إلى ملف .index وملف .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "تحتاج حزم Slob إلى ملف .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "يجب أن يبدأ قالب URL بـ http(s):// وأن يحتوي على %WORD%.",
|
||||
"Web": "ويب",
|
||||
"Add Web Search": "إضافة بحث ويب",
|
||||
"Edit Web Search": "تعديل بحث الويب",
|
||||
"e.g. Google": "مثال: Google",
|
||||
"URL Template": "قالب URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "استخدم %WORD% حيث يجب أن تظهر الكلمة المبحوث عنها.",
|
||||
"Open the search result in your browser:": "افتح نتيجة البحث في متصفحك:",
|
||||
"Open in {{name}}": "افتح في {{name}}",
|
||||
"Book Fingerprint": "بصمة الكتاب",
|
||||
"Search the web": "البحث في الويب",
|
||||
"App deeplink (readest://)": "رابط التطبيق (readest://)",
|
||||
"Universal web link (https://)": "رابط ويب شامل (https://)",
|
||||
"Name cannot be empty.": "لا يمكن أن يكون الاسم فارغًا.",
|
||||
"Replaced {{count}} existing dictionary_zero": "لم يتم استبدال أي قاموس",
|
||||
"Replaced {{count}} existing dictionary_one": "تم استبدال قاموس واحد",
|
||||
"Replaced {{count}} existing dictionary_two": "تم استبدال قاموسين",
|
||||
"Replaced {{count}} existing dictionary_few": "تم استبدال {{count}} قواميس",
|
||||
"Replaced {{count}} existing dictionary_many": "تم استبدال {{count}} قاموسًا",
|
||||
"Replaced {{count}} existing dictionary_other": "تم استبدال {{count}} قاموس",
|
||||
"Cancel Edit": "إلغاء التعديل",
|
||||
"Edit Dictionary": "تعديل القاموس",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "تستخدم حزم MDict ملفات .mdx؛ ملفات .mdd و .css المرافقة اختيارية.",
|
||||
"Dictionary name": "اسم القاموس",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "لا يمكن تشغيل هذا الصوت هنا — يستخدم القاموس تنسيقًا قديمًا. جرّب قاموسًا يستخدم صوت Opus أو MP3 أو WAV.",
|
||||
"File uploaded: {{title}}": "تم تحميل الملف: {{title}}",
|
||||
"File downloaded: {{title}}": "تم تنزيل الملف: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "تم حذف النسخة السحابية للملف: {{title}}",
|
||||
"Failed to upload file: {{title}}": "فشل تحميل الملف: {{title}}",
|
||||
"Failed to download file: {{title}}": "فشل تنزيل الملف: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "فشل في حذف النسخة السحابية للملف: {{title}}",
|
||||
"{{percentage}}% used": "تم استخدام {{percentage}}٪",
|
||||
"Set PIN…": "تعيين رمز PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "اطلب رمز PIN مكوّن من 4 أرقام لفتح Readest",
|
||||
"Change PIN…": "تغيير رمز PIN…",
|
||||
"Disable PIN…": "تعطيل رمز PIN…",
|
||||
"Sync passphrase ready": "عبارة مرور المزامنة جاهزة",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "سيؤدي هذا إلى حذف بيانات الاعتماد المشفرة التي نقوم بمزامنتها (مثل كلمات مرور كتالوج OPDS) على كل جهاز بشكل دائم. سيتم الاحتفاظ بالنسخ المحلية. ستحتاج إلى إعادة إدخال عبارة مرور المزامنة أو تعيين عبارة جديدة. هل تريد المتابعة؟",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "تم نسيان عبارة مرور المزامنة — تم مسح جميع الحقول المشفرة",
|
||||
"Sync passphrase": "عبارة مرور المزامنة",
|
||||
"Set passphrase": "تعيين عبارة المرور",
|
||||
"Forgot passphrase": "نسيت عبارة المرور",
|
||||
"Incorrect PIN": "رمز PIN غير صحيح",
|
||||
"App locked": "التطبيق مقفل",
|
||||
"Enter your PIN": "أدخل رمز PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest مقفل. أدخل رمز PIN المكوّن من 4 أرقام للمتابعة.",
|
||||
"PIN code": "رمز PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "نسيان رمز PIN يمنعك من الوصول إلى هذا الجهاز. ستحتاج إلى مسح بيانات التطبيق لإعادة تعيينه.",
|
||||
"Passphrase must be at least 8 characters": "يجب أن تتكون عبارة المرور من 8 أحرف على الأقل",
|
||||
"Passphrases do not match": "عبارات المرور غير متطابقة",
|
||||
"Set sync passphrase": "تعيين عبارة مرور المزامنة",
|
||||
"Enter sync passphrase": "أدخل عبارة مرور المزامنة",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "تقوم عبارة مرور المزامنة بتشفير الحقول الحساسة (مثل بيانات اعتماد كتالوج OPDS) قبل مزامنتها. نحن لا نرى عبارة المرور هذه أبدًا. اختر شيئًا يمكن تذكره — لا توجد طريقة لاستعادتها بدونها.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "أدخل عبارة مرور المزامنة التي عيّنتها على جهاز آخر لفك تشفير بيانات الاعتماد المتزامنة.",
|
||||
"Confirm passphrase": "تأكيد عبارة المرور",
|
||||
"Unlock": "إلغاء القفل",
|
||||
"Set PIN": "تعيين رمز PIN",
|
||||
"Change PIN": "تغيير رمز PIN",
|
||||
"Disable PIN": "تعطيل رمز PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "أدخل رمز PIN الحالي، ثم اختر رمز PIN جديد مكوّن من 4 أرقام.",
|
||||
"Enter your current PIN to disable the app lock.": "أدخل رمز PIN الحالي لتعطيل قفل التطبيق.",
|
||||
"PIN must be {{length}} digits": "يجب أن يتكون رمز PIN من {{length}} أرقام",
|
||||
"PINs do not match": "رمزا PIN غير متطابقين",
|
||||
"Current PIN": "رمز PIN الحالي",
|
||||
"New PIN": "رمز PIN جديد",
|
||||
"Confirm new PIN": "تأكيد رمز PIN الجديد",
|
||||
"Manage Sync": "إدارة المزامنة",
|
||||
"Imported book files and library metadata": "ملفات الكتب المستوردة وبيانات المكتبة",
|
||||
"Last-read position, bookmarks, and per-book preferences": "آخر موضع قراءة والإشارات المرجعية وتفضيلات كل كتاب",
|
||||
"Highlights and notes": "التظليلات والملاحظات",
|
||||
"Fonts": "الخطوط",
|
||||
"Custom font files": "ملفات الخطوط المخصصة",
|
||||
"Backgrounds": "الخلفيات",
|
||||
"Custom background textures": "أنسجة الخلفية المخصصة",
|
||||
"OPDS catalogs": "كتالوجات OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "روابط الكتالوجات المحفوظة وبيانات الاعتماد (المشفرة)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "عبارة مرور المزامنة غير صحيحة — تعذر فك تشفير بيانات الاعتماد المتزامنة",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "تمت إعادة تعيين بيانات عبارة مرور المزامنة على الخادم. جاري إعادة تشفير بيانات الاعتماد بعبارة المرور الجديدة…",
|
||||
"Failed to decrypt synced credentials": "تعذر فك تشفير بيانات الاعتماد المتزامنة",
|
||||
"Imported dictionary bundles and settings": "حزم القواميس المستوردة والإعدادات",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "اختر ما تتم مزامنته عبر أجهزتك. تعطيل أي فئة يوقف هذا الجهاز عن إرسال أو استقبال السجلات من ذلك النوع. أي شيء موجود بالفعل على الخادم يُترك كما هو، وعند إعادة التفعيل تُستأنف المزامنة من حيث توقفت.",
|
||||
"Data Sync": "مزامنة البيانات",
|
||||
"Manage Fonts": "إدارة الخطوط",
|
||||
"App settings": "إعدادات التطبيق",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "السمة وألوان التظليل والتكاملات (KOSync وReadwise وHardcover) وترتيب القواميس",
|
||||
"Required while Dictionaries sync is enabled": "مطلوب أثناء تفعيل مزامنة القواميس",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "يُعاد الضبط خلال {{hours}} س {{minutes}} د",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "اختر رمز PIN مكوّنًا من 4 أرقام. ستحتاج إلى إدخاله في كل مرة تفتح فيها Readest. لا توجد طريقة لاستعادة رمز PIN المنسي. مسح بيانات التطبيق هو الطريقة الوحيدة لإعادة ضبطه.",
|
||||
"Credentials": "بيانات الاعتماد",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "الرموز وأسماء المستخدمين وكلمات المرور لـ OPDS و KOReader و Hardcover و Readwise. عند التعطيل، تبقى بيانات الاعتماد على هذا الجهاز فقط ولا تُرفع أبدًا.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "تُشفَّر الحقول الحساسة المتزامنة قبل الرفع. عيّن عبارة مرور الآن أو لاحقًا عند الحاجة إلى التشفير.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "محفوظة في هذا الحساب. سيُطلب منك إدخالها عند فك تشفير بيانات الاعتماد.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "يختلف تقدم القراءة على هذا الجهاز عن «{{deviceName}}».",
|
||||
"This device": "هذا الجهاز",
|
||||
"Red": "أحمر",
|
||||
"Yellow": "أصفر",
|
||||
"Green": "أخضر",
|
||||
"Blue": "أزرق",
|
||||
"Violet": "بنفسجي",
|
||||
"Edit color": "تعديل اللون",
|
||||
"Add custom color": "إضافة لون مخصص",
|
||||
"Add label": "إضافة تسمية",
|
||||
"Choose color": "اختيار لون",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "متصل بـ Hardcover. آخر مزامنة {{time}}.",
|
||||
"Integrations": "التكاملات",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "متصل بـ Readwise. آخر مزامنة {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "تصفح وتنزيل الكتب من الفهارس عبر الإنترنت.",
|
||||
"Connected as {{user}}": "متصل باسم {{user}}",
|
||||
"Not connected": "غير متصل",
|
||||
"{{count}} catalog_zero": "لا توجد فهارس",
|
||||
"{{count}} catalog_one": "فهرس واحد",
|
||||
"{{count}} catalog_two": "فهرسان",
|
||||
"{{count}} catalog_few": "{{count}} فهارس",
|
||||
"{{count}} catalog_many": "{{count}} فهرسًا",
|
||||
"{{count}} catalog_other": "{{count}} فهرس",
|
||||
"No catalogs": "لا توجد فهارس",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "اربط Readest بخدمات خارجية للمزامنة والإبرازات والفهارس.",
|
||||
"Reading Sync": "مزامنة القراءة",
|
||||
"Content Sources": "مصادر المحتوى",
|
||||
"Scroll tabs": "تمرير علامات التبويب",
|
||||
"Catalog actions": "إجراءات الفهرس",
|
||||
"File Content": "محتوى الملف",
|
||||
"Start your library": "ابدأ مكتبتك",
|
||||
"Pick a book from your device to add it to your library.": "اختر كتابًا من جهازك لإضافته إلى مكتبتك.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "أفلِت كتابًا في أي مكان على هذه النافذة، أو اختر واحدًا من حاسوبك.",
|
||||
"Sign in to sync your library": "سجّل الدخول لمزامنة مكتبتك"
|
||||
}
|
||||
|
||||
@@ -117,7 +117,6 @@
|
||||
"Failed to delete book: {{title}}": "বই মুছতে ব্যর্থ: {{title}}",
|
||||
"Failed to delete cloud backup of the book: {{title}}": "বইয়ের ক্লাউড ব্যাকআপ মুছতে ব্যর্থ: {{title}}",
|
||||
"Failed to delete local copy of the book: {{title}}": "বইয়ের স্থানীয় কপি মুছতে ব্যর্থ: {{title}}",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "আপনার লাইব্রেরিতে স্বাগতম। আপনি এখানে বই আমদানি করে যেকোনো সময় পড়তে পারেন।",
|
||||
"Copied to notebook": "নোটবুকে কপি করা হয়েছে",
|
||||
"No annotations to export": "রপ্তানি করার জন্য কোন টীকা নেই",
|
||||
"Exported from Readest": "রিডেস্ট থেকে রপ্তানি করা হয়েছে",
|
||||
@@ -155,13 +154,9 @@
|
||||
"Small": "ছোট",
|
||||
"Large": "বড়",
|
||||
"Sync Conflict": "সিঙ্ক দ্বন্দ্ব",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "\"{{deviceName}}\" থেকে পড়ার অগ্রগতি সিঙ্ক করবেন?",
|
||||
"another device": "অন্য ডিভাইস",
|
||||
"Local Progress": "স্থানীয় অগ্রগতি",
|
||||
"Remote Progress": "দূরবর্তী অগ্রগতি",
|
||||
"Failed to connect": "সংযোগ ব্যর্থ",
|
||||
"Disconnected": "সংযোগ বিচ্ছিন্ন",
|
||||
"KOReader Sync Settings": "KOReader সিঙ্ক সেটিংস",
|
||||
"Sync as {{userDisplayName}}": "{{userDisplayName}} হিসেবে সিঙ্ক",
|
||||
"Sync Server Connected": "সিঙ্ক সার্ভার সংযুক্ত",
|
||||
"Sync Strategy": "সিঙ্ক কৌশল",
|
||||
@@ -170,7 +165,6 @@
|
||||
"Send changes only": "শুধু পরিবর্তন পাঠান",
|
||||
"Receive changes only": "শুধু পরিবর্তন গ্রহণ করুন",
|
||||
"Checksum Method": "চেকসাম পদ্ধতি",
|
||||
"File Content (recommended)": "ফাইল কন্টেন্ট (সুপারিশকৃত)",
|
||||
"File Name": "ফাইলের নাম",
|
||||
"Device Name": "ডিভাইসের নাম",
|
||||
"Connect to your KOReader Sync server.": "আপনার KOReader সিঙ্ক সার্ভারে সংযোগ করুন।",
|
||||
@@ -330,7 +324,6 @@
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: ১টি কণ্ঠস্বর",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}}টি কণ্ঠস্বর",
|
||||
"Sign in to Sync": "সিঙ্কের জন্য সাইন ইন",
|
||||
"Synced at {{time}}": "{{time}} এ সিঙ্ক হয়েছে",
|
||||
"Never synced": "কখনো সিঙ্ক হয়নি",
|
||||
"Reading Progress Synced": "পড়ার অগ্রগতি সিঙ্ক হয়েছে",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "{{total}} এর {{page}} পৃষ্ঠা ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "কাটা লেখা",
|
||||
"Squiggly": "ঢেউখেলানো দাগ",
|
||||
"Outline": "বাহিরের রেখা",
|
||||
"Save Current Color": "বর্তমান রঙ সংরক্ষণ করুন",
|
||||
"Quick Colors": "দ্রুত রংসমূহ",
|
||||
"Highlighter": "হাইলাইটার",
|
||||
"Save Book Cover": "বইয়ের মলাট সংরক্ষণ করুন",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "নির্বাচনের পরে টেক্সট মন্তব্য করুন",
|
||||
"Search text after selection": "নির্বাচনের পরে টেক্সট অনুসন্ধান করুন",
|
||||
"Look up text in dictionary after selection": "নির্বাচনের পরে টেক্সট অভিধানে দেখুন",
|
||||
"Look up text in Wikipedia after selection": "নির্বাচনের পরে টেক্সট উইকিপিডিয়ায় দেখুন",
|
||||
"Translate text after selection": "নির্বাচনের পরে টেক্সট অনুবাদ করুন",
|
||||
"Read text aloud after selection": "নির্বাচনের পরে টেক্সট উচ্চারণ করুন",
|
||||
"Proofread text after selection": "নির্বাচনের পরে টেক্সট প্রুফরিড করুন",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "বই রপ্তানি করতে ব্যর্থ।",
|
||||
"Export Book": "বই রপ্তানি করুন",
|
||||
"Whole word:": "সম্পূর্ণ শব্দ:",
|
||||
"Error": "ত্রুটি",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "নিবন্ধ লোড করতে অক্ষম। সরাসরি {{link}} এ অনুসন্ধান করার চেষ্টা করুন।",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "শব্দ লোড করতে অক্ষম। সরাসরি {{link}} এ অনুসন্ধান করার চেষ্টা করুন।",
|
||||
"Date Published": "প্রকাশনার তারিখ",
|
||||
"Only for TTS:": "শুধুমাত্র TTS-এর জন্য:",
|
||||
"Uploaded": "আপলোড হয়েছে",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "অকার্যকর Readwise অ্যাক্সেস টোকেন",
|
||||
"Disconnected from Readwise": "Readwise থেকে সংযোগ বিচ্ছিন্ন হয়েছে",
|
||||
"Never": "কখনো না",
|
||||
"Readwise Settings": "Readwise সেটিংস",
|
||||
"Connected to Readwise": "Readwise এর সাথে সংযুক্ত",
|
||||
"Last synced: {{time}}": "শেষ সিঙ্ক করা হয়েছে: {{time}}",
|
||||
"Sync Enabled": "সিঙ্কিং সক্ষম",
|
||||
"Disconnect": "সংযোগ বিচ্ছিন্ন করুন",
|
||||
"Connect your Readwise account to sync highlights.": "হাইলাইটগুলি সিঙ্ক করার জন্য আপনার Readwise অ্যাকাউন্টটি সংযোগ করুন।",
|
||||
"Get your access token at": "আপনার অ্যাক্সেস টোকেনটি এখানে পাবেন",
|
||||
"Access Token": "অ্যাক্সেস টোকেন",
|
||||
"Paste your Readwise access token": "আপনার Readwise অ্যাক্সেস টোকেনটি পেস্ট করুন",
|
||||
"Config": "কনফিগ",
|
||||
"Readwise Sync": "Readwise সিঙ্ক",
|
||||
"Push Highlights": "হাইলাইট পাঠান",
|
||||
"Highlights synced to Readwise": "হাইলাইটগুলি Readwise এ সিঙ্ক করা হয়েছে",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "নির্বাচিত অংশ কপি করুন",
|
||||
"Translate Selection": "নির্বাচিত অংশ অনুবাদ করুন",
|
||||
"Dictionary Lookup": "অভিধানে খুঁজুন",
|
||||
"Wikipedia Lookup": "উইকিপিডিয়ায় খুঁজুন",
|
||||
"Read Aloud Selection": "নির্বাচিত অংশ জোরে পড়ুন",
|
||||
"Proofread Selection": "নির্বাচিত অংশ প্রুফরিড করুন",
|
||||
"Open Settings": "সেটিংস খুলুন",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "খুঁজতে টানুন",
|
||||
"Punctuation Delay": "বিরাম চিহ্ন বিলম্ব",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "অনুগ্রহ করে নিশ্চিত করুন যে এই OPDS সংযোগটি ওয়েব অ্যাপে Readest সার্ভারের মাধ্যমে প্রক্সি করা হবে।",
|
||||
"Custom Headers": "কাস্টম হেডার",
|
||||
"Custom Headers (optional)": "কাস্টম হেডার (ঐচ্ছিক)",
|
||||
"Add one header per line using \"Header-Name: value\".": "প্রতি লাইনে একটি হেডার যোগ করুন \"Header-Name: value\" ব্যবহার করে।",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "আমি বুঝতে পারছি যে এই OPDS সংযোগটি ওয়েব অ্যাপে Readest সার্ভারের মাধ্যমে প্রক্সি করা হবে। আমি যদি এই শংসাপত্র বা হেডারগুলির সাথে Readest-কে বিশ্বাস না করি, তবে আমার পরিবর্তে নেটিভ অ্যাপটি ব্যবহার করা উচিত।",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcover-এ সংযোগ করা যাচ্ছে না। অনুগ্রহ করে আপনার নেটওয়ার্ক সংযোগ পরীক্ষা করুন।",
|
||||
"Invalid Hardcover API token": "অবৈধ Hardcover API টোকেন",
|
||||
"Disconnected from Hardcover": "Hardcover থেকে সংযোগ বিচ্ছিন্ন",
|
||||
"Hardcover Settings": "Hardcover সেটিংস",
|
||||
"Connected to Hardcover": "Hardcover-এ সংযুক্ত",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "পড়ার অগ্রগতি এবং নোট সিঙ্ক করতে আপনার Hardcover অ্যাকাউন্ট সংযুক্ত করুন।",
|
||||
"Get your API token from hardcover.app → Settings → API.": "hardcover.app → সেটিংস → API থেকে আপনার API টোকেন পান।",
|
||||
"API Token": "API টোকেন",
|
||||
"Paste your Hardcover API token": "আপনার Hardcover API টোকেন পেস্ট করুন",
|
||||
"Hardcover sync enabled for this book": "এই বইয়ের জন্য Hardcover সিঙ্ক সক্রিয়",
|
||||
"Hardcover sync disabled for this book": "এই বইয়ের জন্য Hardcover সিঙ্ক নিষ্ক্রিয়",
|
||||
"Hardcover Sync": "Hardcover সিঙ্ক",
|
||||
"Enable for This Book": "এই বইয়ের জন্য সক্রিয় করুন",
|
||||
"Push Notes": "নোট পুশ করুন",
|
||||
"Enable Hardcover sync for this book first.": "প্রথমে এই বইয়ের জন্য Hardcover সিঙ্ক সক্রিয় করুন।",
|
||||
"No annotations or excerpts to sync for this book.": "এই বইয়ের জন্য সিঙ্ক করার মতো কোনো টীকা বা উদ্ধৃতি নেই।",
|
||||
"Configure Hardcover in Settings first.": "প্রথমে সেটিংসে Hardcover কনফিগার করুন।",
|
||||
"No new Hardcover note changes to sync.": "সিঙ্ক করার জন্য নতুন কোনো Hardcover নোট পরিবর্তন নেই।",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "হাইফেন বিভক্ত করুন",
|
||||
"Apply Theme Colors to PDF": "PDF-এ থিম রং প্রয়োগ করুন",
|
||||
"Name": "নাম",
|
||||
"Unavailable": "অনুপলব্ধ",
|
||||
"Remove": "সরান",
|
||||
"Edit OPDS Catalog": "OPDS ক্যাটালগ সম্পাদনা",
|
||||
"Save Changes": "পরিবর্তন সংরক্ষণ",
|
||||
"Use Book Layout": "বইয়ের লেআউট ব্যবহার করুন"
|
||||
"Use Book Layout": "বইয়ের লেআউট ব্যবহার করুন",
|
||||
"End of this section. Continue to the next.": "এই বিভাগের শেষ। পরবর্তী বিভাগে চালিয়ে যান।",
|
||||
"Auto-download": "স্বয়ংক্রিয় ডাউনলোড",
|
||||
"Auto-download new items": "নতুন আইটেম স্বয়ংক্রিয়ভাবে ডাউনলোড করুন",
|
||||
"Automatically download new publications when the app syncs": "অ্যাপ সিঙ্ক হওয়ার সময় নতুন প্রকাশনা স্বয়ংক্রিয়ভাবে ডাউনলোড করুন",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "OPDS থেকে {{count}}টি নতুন আইটেম ডাউনলোড হয়েছে",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDS থেকে {{count}}টি নতুন আইটেম ডাউনলোড হয়েছে",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "{{count}}টি OPDS ক্যাটালগ সিঙ্ক করতে ব্যর্থ",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "{{count}}টি OPDS ক্যাটালগ সিঙ্ক করতে ব্যর্থ",
|
||||
"Last synced {{when}}": "শেষ সিঙ্ক হয়েছে {{when}}",
|
||||
"Failed downloads": "ব্যর্থ ডাউনলোড",
|
||||
"No failed downloads": "কোনো ব্যর্থ ডাউনলোড নেই",
|
||||
"Attempts: {{count}}_one": "প্রচেষ্টা: {{count}}",
|
||||
"Attempts: {{count}}_other": "প্রচেষ্টা: {{count}}",
|
||||
"Skip": "এড়িয়ে যান",
|
||||
"Skip all": "সব এড়িয়ে যান",
|
||||
"Retry all": "সব পুনরায় চেষ্টা করুন",
|
||||
"{{count}} failed_one": "{{count}}টি ব্যর্থ",
|
||||
"{{count}} failed_other": "{{count}}টি ব্যর্থ",
|
||||
"(none)": "(কোনোটি না)",
|
||||
"Identifiers": "শনাক্তকারী",
|
||||
"Read (Stream)": "পড়ুন (স্ট্রিম)",
|
||||
"Failed to start stream": "স্ট্রিম শুরু করতে ব্যর্থ",
|
||||
"No dictionaries enabled": "কোনো অভিধান সক্রিয় নেই",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "সেটিংস → ভাষা → অভিধান থেকে একটি অভিধান সক্রিয় করুন।",
|
||||
"Wiktionary": "উইক্শনারি",
|
||||
"Drag to reorder": "পুনঃক্রম করতে টানুন",
|
||||
"Built-in": "বিল্ট-ইন",
|
||||
"Bundle is missing on this device. Re-import to use it.": "এই ডিভাইসে বান্ডলটি নেই। ব্যবহার করতে পুনরায় আমদানি করুন।",
|
||||
"This dictionary format is not supported.": "এই অভিধান বিন্যাস সমর্থিত নয়।",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}}টি অভিধান আমদানি করা হয়েছে",
|
||||
"Imported {{count}} dictionary_other": "{{count}}টি অভিধান আমদানি করা হয়েছে",
|
||||
"Skipped incomplete bundles: {{names}}": "অসম্পূর্ণ বান্ডল এড়ানো হয়েছে: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "অভিধান আমদানি ব্যর্থ: {{message}}",
|
||||
"Dictionaries": "অভিধান",
|
||||
"Delete Dictionary": "অভিধান মুছুন",
|
||||
"Importing…": "আমদানি হচ্ছে…",
|
||||
"Import Dictionary": "অভিধান আমদানি করুন",
|
||||
"No dictionaries available.": "কোনো অভিধান উপলব্ধ নেই।",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict বান্ডলে .ifo, .idx এবং .dict.dz ফাইল প্রয়োজন (.syn ঐচ্ছিক)।",
|
||||
"Select all the bundle files together when importing.": "আমদানির সময় বান্ডলের সব ফাইল একসঙ্গে নির্বাচন করুন।",
|
||||
"Manage Dictionaries": "অভিধান পরিচালনা",
|
||||
"Select Dictionary Files": "অভিধান ফাইল নির্বাচন করুন",
|
||||
"Read on Wikipedia →": "উইকিপিডিয়ায় পড়ুন →",
|
||||
"This link can't be opened": "এই লিঙ্কটি খোলা যাচ্ছে না",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "অ্যানোটেশন লিঙ্কে প্রয়োজনীয় তথ্য নেই। মূল লিঙ্কটি কাটা পড়ে থাকতে পারে।",
|
||||
"Go to Readest": "Readest-এ যান",
|
||||
"Open-source ebook reader for everyone, on every device.": "সবার জন্য, প্রতিটি ডিভাইসের জন্য — ওপেন-সোর্স ইবুক রিডার।",
|
||||
"Open in Readest": "Readest-এ খুলুন",
|
||||
"If Readest didn't open automatically, choose an option below:": "Readest স্বয়ংক্রিয়ভাবে না খুললে, নিচের একটি বিকল্প বেছে নিন:",
|
||||
"Continue reading where you left off.": "যেখানে রেখেছিলেন, সেখান থেকেই পড়া চালিয়ে যান।",
|
||||
"Readest logo": "Readest লোগো",
|
||||
"Opening Readest...": "Readest খোলা হচ্ছে…",
|
||||
"Open in Readest app": "Readest অ্যাপে খুলুন",
|
||||
"Continue in browser": "ব্রাউজারে চালিয়ে যান",
|
||||
"Don't have Readest?": "Readest নেই?",
|
||||
"Book not in your library": "এই বইটি আপনার লাইব্রেরিতে নেই",
|
||||
"Share Book": "বই শেয়ার করুন",
|
||||
"Could not create share link": "শেয়ার লিঙ্ক তৈরি করা যায়নি",
|
||||
"Link copied": "লিঙ্ক কপি হয়েছে",
|
||||
"Could not copy link": "লিঙ্ক কপি করা যায়নি",
|
||||
"Share revoked": "শেয়ার বাতিল হয়েছে",
|
||||
"Could not revoke share": "শেয়ার বাতিল করা যায়নি",
|
||||
"Uploading book…": "বই আপলোড হচ্ছে…",
|
||||
"Generating…": "তৈরি হচ্ছে…",
|
||||
"Generate share link": "শেয়ার লিঙ্ক তৈরি করুন",
|
||||
"Share URL": "শেয়ার URL",
|
||||
"Copy link": "লিঙ্ক কপি করুন",
|
||||
"Copied": "কপি হয়েছে",
|
||||
"Share via…": "মাধ্যমে শেয়ার করুন…",
|
||||
"Expires {{date}}": "{{date}} এ মেয়াদ শেষ",
|
||||
"Revoking…": "বাতিল হচ্ছে…",
|
||||
"Revoke share": "শেয়ার বাতিল করুন",
|
||||
"Sign in to share books": "বই শেয়ার করতে সাইন ইন করুন",
|
||||
"Expiring soon": "শীঘ্রই মেয়াদ শেষ হবে",
|
||||
"Missing share token": "শেয়ার টোকেন অনুপস্থিত",
|
||||
"Could not add to your library": "আপনার লাইব্রেরিতে যোগ করা যায়নি",
|
||||
"This share link is no longer available": "এই শেয়ার লিঙ্কটি আর উপলব্ধ নেই",
|
||||
"The original link may have expired or been revoked.": "মূল লিঙ্কটির মেয়াদ শেষ হয়ে থাকতে পারে বা বাতিল হয়েছে।",
|
||||
"Get Readest": "Readest পান",
|
||||
"Loading shared book…": "শেয়ার করা বই লোড হচ্ছে…",
|
||||
"Adding…": "যোগ করা হচ্ছে…",
|
||||
"Add to my library": "আমার লাইব্রেরিতে যোগ করুন",
|
||||
"Could not load your shares": "আপনার শেয়ারগুলো লোড করা যায়নি",
|
||||
"Revoked": "বাতিল",
|
||||
"Expired": "মেয়াদোত্তীর্ণ",
|
||||
"Shared books": "শেয়ার করা বই",
|
||||
"You haven't shared any books yet": "আপনি এখনও কোনো বই শেয়ার করেননি",
|
||||
"Open a book and tap Share to send it to a friend.": "একটি বই খুলুন এবং বন্ধুকে পাঠাতে শেয়ার ট্যাপ করুন।",
|
||||
"{{count}} active_one": "{{count}}টি সক্রিয়",
|
||||
"{{count}} active_other": "{{count}}টি সক্রিয়",
|
||||
"{{count}} downloads_one": "{{count}}টি ডাউনলোড",
|
||||
"{{count}} downloads_other": "{{count}}টি ডাউনলোড",
|
||||
"starts at saved page": "সংরক্ষিত পৃষ্ঠা থেকে শুরু হয়",
|
||||
"More actions": "আরও ক্রিয়াকলাপ",
|
||||
"Loading…": "লোড হচ্ছে…",
|
||||
"Load more": "আরও লোড করুন",
|
||||
"Could not load shared book": "শেয়ার করা বই লোড করা যায়নি",
|
||||
"The share link is missing required information.": "শেয়ার লিঙ্কে প্রয়োজনীয় তথ্য নেই।",
|
||||
"Please check your connection and try again.": "অনুগ্রহ করে আপনার সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন।",
|
||||
"Sign in to import shared books": "শেয়ার করা বই আমদানি করতে সাইন ইন করুন",
|
||||
"Already in your library": "ইতিমধ্যে আপনার লাইব্রেরিতে রয়েছে",
|
||||
"Added to your library": "আপনার লাইব্রেরিতে যোগ করা হয়েছে",
|
||||
"Could not import shared book": "শেয়ার করা বই আমদানি করা যায়নি",
|
||||
"Manage Shared Links": "শেয়ার লিঙ্ক পরিচালনা করুন",
|
||||
"Expires in": "মেয়াদ শেষ হবে",
|
||||
"{{count}} days_one": "১ দিন",
|
||||
"{{count}} days_other": "{{count}} দিন",
|
||||
"Expires in {{count}} days_one": "১ দিনে মেয়াদ শেষ",
|
||||
"Expires in {{count}} days_other": "{{count}} দিনে মেয়াদ শেষ",
|
||||
"Expires in {{count}} hours_one": "১ ঘণ্টায় মেয়াদ শেষ",
|
||||
"Expires in {{count}} hours_other": "{{count}} ঘণ্টায় মেয়াদ শেষ",
|
||||
"Open in app": "অ্যাপে খুলুন",
|
||||
"Shared with you": "আপনার সাথে শেয়ার করা",
|
||||
"Downloading… {{percent}}%": "ডাউনলোড হচ্ছে… {{percent}}%",
|
||||
"Import progress": "আমদানি অগ্রগতি",
|
||||
"Share reading progress": "পড়ার অগ্রগতি শেয়ার করুন",
|
||||
"Includes your reading progress": "আপনার পড়ার অগ্রগতি অন্তর্ভুক্ত",
|
||||
"Synced {{time}}": "{{time}} সিঙ্ক হয়েছে",
|
||||
"Sync Info": "সিঙ্ক তথ্য",
|
||||
"Last Synced": "শেষ সিঙ্ক",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT বান্ডেলের জন্য একটি .index ফাইল এবং একটি .dict.dz ফাইল প্রয়োজন।",
|
||||
"Slob bundles need a .slob file.": "Slob বান্ডেলের জন্য একটি .slob ফাইল প্রয়োজন।",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL টেমপ্লেটটি অবশ্যই http(s):// দিয়ে শুরু হতে হবে এবং %WORD% থাকতে হবে।",
|
||||
"Web": "ওয়েব",
|
||||
"Add Web Search": "ওয়েব অনুসন্ধান যোগ করুন",
|
||||
"Edit Web Search": "ওয়েব অনুসন্ধান সম্পাদনা করুন",
|
||||
"e.g. Google": "যেমন Google",
|
||||
"URL Template": "URL টেমপ্লেট",
|
||||
"Use %WORD% where the looked-up word should appear.": "যেখানে অনুসন্ধান করা শব্দ উপস্থিত হওয়া উচিত সেখানে %WORD% ব্যবহার করুন।",
|
||||
"Open the search result in your browser:": "আপনার ব্রাউজারে অনুসন্ধান ফলাফল খুলুন:",
|
||||
"Open in {{name}}": "{{name}}-এ খুলুন",
|
||||
"Book Fingerprint": "বইয়ের ফিঙ্গারপ্রিন্ট",
|
||||
"Search the web": "ওয়েবে অনুসন্ধান করুন",
|
||||
"App deeplink (readest://)": "অ্যাপ ডিপলিংক (readest://)",
|
||||
"Universal web link (https://)": "সর্বজনীন ওয়েব লিঙ্ক (https://)",
|
||||
"Name cannot be empty.": "নাম খালি রাখা যাবে না।",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}}টি বিদ্যমান অভিধান প্রতিস্থাপিত হয়েছে",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}}টি বিদ্যমান অভিধান প্রতিস্থাপিত হয়েছে",
|
||||
"Cancel Edit": "সম্পাদনা বাতিল করুন",
|
||||
"Edit Dictionary": "অভিধান সম্পাদনা করুন",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict বান্ডেল .mdx ফাইল ব্যবহার করে; সহগামী .mdd ও .css ফাইল ঐচ্ছিক।",
|
||||
"Dictionary name": "অভিধানের নাম",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "এই অডিও এখানে চালানো যাচ্ছে না — অভিধানটি একটি পুরনো ফর্ম্যাট ব্যবহার করছে। Opus, MP3 বা WAV অডিও সহ একটি ব্যবহার করে দেখুন।",
|
||||
"File uploaded: {{title}}": "ফাইল আপলোড হয়েছে: {{title}}",
|
||||
"File downloaded: {{title}}": "ফাইল ডাউনলোড হয়েছে: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "ফাইলের ক্লাউড অনুলিপি মুছে ফেলা হয়েছে: {{title}}",
|
||||
"Failed to upload file: {{title}}": "ফাইল আপলোড ব্যর্থ: {{title}}",
|
||||
"Failed to download file: {{title}}": "ফাইল ডাউনলোড ব্যর্থ: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "ফাইলের ক্লাউড অনুলিপি মুছতে ব্যর্থ: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% ব্যবহৃত",
|
||||
"Set PIN…": "PIN সেট করুন…",
|
||||
"Require a 4-digit PIN to open Readest": "Readest খুলতে একটি ৪-সংখ্যার PIN প্রয়োজন করুন",
|
||||
"Change PIN…": "PIN পরিবর্তন করুন…",
|
||||
"Disable PIN…": "PIN নিষ্ক্রিয় করুন…",
|
||||
"Sync passphrase ready": "সিঙ্ক পাসফ্রেজ প্রস্তুত",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "এটি প্রতিটি ডিভাইসে আমরা সিঙ্ক করি এমন এনক্রিপ্ট করা শংসাপত্র (যেমন, OPDS ক্যাটালগ পাসওয়ার্ড) স্থায়ীভাবে মুছে ফেলে। স্থানীয় কপিগুলি সংরক্ষিত থাকে। আপনাকে সিঙ্ক পাসফ্রেজ পুনরায় প্রবেশ করতে হবে বা একটি নতুন সেট করতে হবে। চালিয়ে যাবেন?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "সিঙ্ক পাসফ্রেজ ভুলে গিয়েছেন — সমস্ত এনক্রিপ্ট করা ক্ষেত্র সাফ করা হয়েছে",
|
||||
"Sync passphrase": "সিঙ্ক পাসফ্রেজ",
|
||||
"Set passphrase": "পাসফ্রেজ সেট করুন",
|
||||
"Forgot passphrase": "পাসফ্রেজ ভুলে গেছেন",
|
||||
"Incorrect PIN": "ভুল PIN",
|
||||
"App locked": "অ্যাপ লক করা হয়েছে",
|
||||
"Enter your PIN": "আপনার PIN লিখুন",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest লক করা আছে। চালিয়ে যেতে আপনার ৪-সংখ্যার PIN লিখুন।",
|
||||
"PIN code": "PIN কোড",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PIN ভুলে গেলে আপনি এই ডিভাইসে প্রবেশ করতে পারবেন না। এটি রিসেট করতে অ্যাপের ডেটা মুছে ফেলতে হবে।",
|
||||
"Passphrase must be at least 8 characters": "পাসফ্রেজ কমপক্ষে 8 অক্ষরের হতে হবে",
|
||||
"Passphrases do not match": "পাসফ্রেজগুলি মিলছে না",
|
||||
"Set sync passphrase": "সিঙ্ক পাসফ্রেজ সেট করুন",
|
||||
"Enter sync passphrase": "সিঙ্ক পাসফ্রেজ লিখুন",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "একটি সিঙ্ক পাসফ্রেজ আপনার সংবেদনশীল ক্ষেত্রগুলি (যেমন OPDS ক্যাটালগ শংসাপত্র) সিঙ্ক করার আগে এনক্রিপ্ট করে। আমরা কখনই এই পাসফ্রেজ দেখি না। এমন কিছু বেছে নিন যা মনে রাখা যায় — এটি ছাড়া পুনরুদ্ধার সম্ভব নয়।",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "আপনার সিঙ্ক করা শংসাপত্রগুলি ডিক্রিপ্ট করতে অন্য একটি ডিভাইসে আপনি যে সিঙ্ক পাসফ্রেজ সেট করেছেন তা লিখুন।",
|
||||
"Confirm passphrase": "পাসফ্রেজ নিশ্চিত করুন",
|
||||
"Unlock": "আনলক করুন",
|
||||
"Set PIN": "PIN সেট করুন",
|
||||
"Change PIN": "PIN পরিবর্তন করুন",
|
||||
"Disable PIN": "PIN নিষ্ক্রিয় করুন",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "আপনার বর্তমান PIN লিখুন, তারপর একটি নতুন ৪-সংখ্যার PIN বেছে নিন।",
|
||||
"Enter your current PIN to disable the app lock.": "অ্যাপ লক নিষ্ক্রিয় করতে আপনার বর্তমান PIN লিখুন।",
|
||||
"PIN must be {{length}} digits": "PIN অবশ্যই {{length}} সংখ্যার হতে হবে",
|
||||
"PINs do not match": "PIN মিলছে না",
|
||||
"Current PIN": "বর্তমান PIN",
|
||||
"New PIN": "নতুন PIN",
|
||||
"Confirm new PIN": "নতুন PIN নিশ্চিত করুন",
|
||||
"Manage Sync": "সিঙ্ক ব্যবস্থাপনা",
|
||||
"Imported book files and library metadata": "আমদানি করা বইয়ের ফাইল ও লাইব্রেরির মেটাডেটা",
|
||||
"Last-read position, bookmarks, and per-book preferences": "শেষ পঠিত অবস্থান, বুকমার্ক এবং প্রতি-বই পছন্দসমূহ",
|
||||
"Highlights and notes": "হাইলাইট এবং নোট",
|
||||
"Fonts": "ফন্ট",
|
||||
"Custom font files": "কাস্টম ফন্ট ফাইল",
|
||||
"Backgrounds": "পটভূমিসমূহ",
|
||||
"Custom background textures": "কাস্টম পটভূমির টেক্সচার",
|
||||
"OPDS catalogs": "OPDS ক্যাটালগ",
|
||||
"Saved catalog URLs and (encrypted) credentials": "সংরক্ষিত ক্যাটালগ URL এবং (এনক্রিপ্ট করা) ক্রেডেনশিয়াল",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "ভুল সিঙ্ক পাসফ্রেজ — সিঙ্ক করা ক্রেডেনশিয়াল ডিক্রিপ্ট করা যায়নি",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "সার্ভারের সিঙ্ক পাসফ্রেজ ডেটা রিসেট করা হয়েছে। নতুন পাসফ্রেজ দিয়ে আপনার ক্রেডেনশিয়াল পুনরায় এনক্রিপ্ট করা হচ্ছে…",
|
||||
"Failed to decrypt synced credentials": "সিঙ্ক করা ক্রেডেনশিয়াল ডিক্রিপ্ট করতে ব্যর্থ",
|
||||
"Imported dictionary bundles and settings": "আমদানি করা অভিধান বান্ডিল এবং সেটিংস",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "আপনার ডিভাইসগুলোর মধ্যে কী সিঙ্ক হবে তা বেছে নিন। কোনো বিভাগ নিষ্ক্রিয় করলে এই ডিভাইসটি সেই ধরনের সারি পাঠানো বা গ্রহণ করা বন্ধ করে দেয়। সার্ভারে ইতিমধ্যে থাকা কিছুই পরিবর্তন হয় না, পুনরায় সক্রিয় করলে যেখানে থেমেছিলেন সেখান থেকে আবার শুরু হয়।",
|
||||
"Data Sync": "ডেটা সিঙ্ক",
|
||||
"Manage Fonts": "ফন্ট পরিচালনা",
|
||||
"App settings": "অ্যাপ সেটিংস",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "থিম, হাইলাইট রং, ইন্টিগ্রেশন (KOSync, Readwise, Hardcover) এবং অভিধানের ক্রম",
|
||||
"Required while Dictionaries sync is enabled": "অভিধান সিঙ্ক সক্রিয় থাকাকালীন প্রয়োজনীয়",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} ঘ {{minutes}} মি পরে রিসেট হবে",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "একটি ৪-অঙ্কের পিন বেছে নিন। প্রতিবার Readest খোলার সময় আপনাকে এটি প্রবেশ করাতে হবে। ভুলে যাওয়া পিন পুনরুদ্ধারের কোনো উপায় নেই। অ্যাপের ডেটা মুছে ফেলাই এটি রিসেট করার একমাত্র উপায়।",
|
||||
"Credentials": "ক্রেডেনশিয়াল",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover এবং Readwise-এর জন্য টোকেন, ব্যবহারকারীর নাম এবং পাসওয়ার্ড। নিষ্ক্রিয় থাকলে ক্রেডেনশিয়ালগুলি কেবল এই ডিভাইসেই থাকে এবং কখনই আপলোড হয় না।",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "সংবেদনশীল সিঙ্ক করা ক্ষেত্রগুলি আপলোডের আগে এনক্রিপ্ট করা হয়। এনক্রিপশনের প্রয়োজন হলে এখনই অথবা পরে একটি পাসফ্রেজ সেট করুন।",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "এই অ্যাকাউন্টে সংরক্ষিত। ক্রেডেনশিয়াল ডিক্রিপ্ট করার সময় আপনাকে এটি দিতে বলা হবে।",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "এই ডিভাইসে পড়ার অগ্রগতি \"{{deviceName}}\" থেকে আলাদা।",
|
||||
"This device": "এই ডিভাইস",
|
||||
"Red": "লাল",
|
||||
"Yellow": "হলুদ",
|
||||
"Green": "সবুজ",
|
||||
"Blue": "নীল",
|
||||
"Violet": "বেগুনি",
|
||||
"Edit color": "রঙ সম্পাদনা করুন",
|
||||
"Add custom color": "কাস্টম রঙ যোগ করুন",
|
||||
"Add label": "লেবেল যোগ করুন",
|
||||
"Choose color": "রঙ নির্বাচন করুন",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcover-এর সাথে সংযুক্ত। সর্বশেষ সিঙ্ক {{time}}।",
|
||||
"Integrations": "ইন্টিগ্রেশন",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwise-এর সাথে সংযুক্ত। সর্বশেষ সিঙ্ক {{time}}।",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "অনলাইন ক্যাটালগ থেকে বই ব্রাউজ এবং ডাউনলোড করুন।",
|
||||
"Connected as {{user}}": "{{user}} হিসাবে সংযুক্ত",
|
||||
"Not connected": "সংযুক্ত নয়",
|
||||
"{{count}} catalog_one": "{{count}}টি ক্যাটালগ",
|
||||
"{{count}} catalog_other": "{{count}}টি ক্যাটালগ",
|
||||
"No catalogs": "কোনো ক্যাটালগ নেই",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "সিঙ্ক, হাইলাইট এবং ক্যাটালগের জন্য Readest-কে বাহ্যিক পরিষেবার সাথে সংযুক্ত করুন।",
|
||||
"Reading Sync": "পড়ার সিঙ্ক",
|
||||
"Content Sources": "কন্টেন্ট উৎস",
|
||||
"Scroll tabs": "ট্যাব স্ক্রোল করুন",
|
||||
"Catalog actions": "ক্যাটালগ অ্যাকশন",
|
||||
"File Content": "ফাইল সামগ্রী",
|
||||
"Start your library": "আপনার লাইব্রেরি শুরু করুন",
|
||||
"Pick a book from your device to add it to your library.": "আপনার লাইব্রেরিতে যোগ করতে ডিভাইস থেকে একটি বই বেছে নিন।",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "এই উইন্ডোর যেকোনো জায়গায় একটি বই ছাড়ুন, অথবা আপনার কম্পিউটার থেকে একটি বেছে নিন।",
|
||||
"Sign in to sync your library": "আপনার লাইব্রেরি সিঙ্ক করতে সাইন ইন করুন"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "བསྐྱར་བརྗེའི་ཚེས་གྲངས།",
|
||||
"Version {{version}}": "ཐོན་རིམ {{version}}",
|
||||
"Vertical Direction": "ཀྲིང་རིམ།",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "དཔེ་མཛོད་སྟོང་པ་ཡིན། ཁྱེད་ཀྱིས་ཁྱེད་རང་གི་དཔེ་དེབ་ནང་འདྲེན་བྱས་ནས་དུས་དང་རྣམ་པ་ཀུན་ཏུ་ཀློག་ཐུབ།",
|
||||
"Wikipedia": "ཝེ་ཁི་པི་ཌི་ཡ།",
|
||||
"Writing Mode": "པར་སྒྲིག་གི་རྣམ་པ།",
|
||||
"Your Library": "དཔེ་མཛོད།",
|
||||
@@ -296,7 +295,6 @@
|
||||
"No notes match your search": "མཐུན་པའི་ཟིན་བྲིས་མ་རྙེད།",
|
||||
"Search notes and excerpts...": "ཟིན་བྲིས་འཚོལ་བཤེར།...",
|
||||
"Sign in to Sync": "ནང་བསྐྱོད་བྱས་རྗེས་སྐད་མཉམ་བྱེད་པ།",
|
||||
"Synced at {{time}}": "སྐད་མཉམ་བྱས་པའི་དུས་ཚོད། {{time}}",
|
||||
"Never synced": "ནམ་ཡང་སྐད་མཉམ་བྱས་མ་མྱོང་།",
|
||||
"Show Remaining Time": "ལྷག་མའི་དུས་ཚོད་མངོན་པ།",
|
||||
"{{time}} min left in chapter": "ལེའུ་འདིར་ད་དུང་ {{time}} སྐར་མ་ལྷག་ཡོད།",
|
||||
@@ -457,7 +455,6 @@
|
||||
"Remove from Device Only": "སྒྲིག་ཆས་ཐོག་ནས་ཕྱིར་འཐེན།",
|
||||
"Failed to connect": "འབྲེལ་བ་བྱས་མ་ཐུབ།",
|
||||
"Disconnected": "འབྲེལ་བ་བྱས་མ་ཐུབ།",
|
||||
"KOReader Sync Settings": "KOReader སྤྲི་དོན་གཞི་འདེམས་པ།",
|
||||
"Sync as {{userDisplayName}}": "ཁྱེད་ཀྱིས {{userDisplayName}} སྤྲི་དོན་གཞི་འདེམས་པ།",
|
||||
"Sync Server Connected": "སྤྲི་དོན་སང་བཞིན་འདེམས་པ།",
|
||||
"Sync Strategy": "སྤྲི་དོན་འབྱུང་ཁུངས།",
|
||||
@@ -466,7 +463,6 @@
|
||||
"Send changes only": "འབྱུང་ཁུངས་འདེམས་པ་བྱས་ནས་བརྗེ་བ།",
|
||||
"Receive changes only": "འབྱུང་ཁུངས་འདེམས་པ་བྱས་ནས་བརྗེ་བ།",
|
||||
"Checksum Method": "ཡིག་སྣེ་འབྱུང་ཁུངས།",
|
||||
"File Content (recommended)": "ཡིག་སྣེ་འབྱུང་ཁུངས།",
|
||||
"File Name": "ཡིག་སྣེ་འབྱུང་ཁུངས།",
|
||||
"Device Name": "ཡིག་སྣེ་འབྱུང་ཁུངས།",
|
||||
"Connect to your KOReader Sync server.": "ཁྱེད་ཀྱིས KOReader སྤྲི་དོན་སང་བཞིན་འདེམས་པ།",
|
||||
@@ -477,10 +473,7 @@
|
||||
"Connect": "འབྲེལ་བ་བྱས་པ།",
|
||||
"KOReader Sync": "KOReader སྤྲི་དོན་འདེམས་པ།",
|
||||
"Sync Conflict": "སྤྲི་དོན་འབྱུང་ཁུངས།",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "ཁྱེད་ཀྱིས \"{{deviceName}}\" སྤྲི་དོན་འབྱུང་ཁུངས་འདེམས་པ་བྱས་ནས་བརྗེ་བ།",
|
||||
"another device": "གཞན་ཡིག་སྣེ།",
|
||||
"Local Progress": "ཀུན་འབྱུང་ཁུངས།",
|
||||
"Remote Progress": "བརྒྱབ་འབྱུང་ཁུངས།",
|
||||
"All the world's a stage,\nAnd all the men and women merely players;\nThey have their exits and their entrances,\nAnd one man in his time plays many parts,\nHis acts being seven ages.\n\n— William Shakespeare": "འབྱུང་ཁུངས་འདེམས་པ་བྱས་ནས་བརྗེ་བ།",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "ཤོག་ {{page}} དང་ {{total}} ({{percentage}}%)",
|
||||
"Current position": "ད་ལྟའི་གནས་ས།",
|
||||
@@ -631,7 +624,6 @@
|
||||
"Strikethrough": "འཐེན་ཐིག",
|
||||
"Squiggly": "འཁྱོག་ཐིག",
|
||||
"Outline": "མཐའ་ཐིག",
|
||||
"Save Current Color": "མིག་སྔའི་ཚོན་གཏན་འཁེལ་བྱེད།",
|
||||
"Quick Colors": "མྱུར་ཚོན།",
|
||||
"Highlighter": "མདོག་ཚད་ཀྱི་བསྡུར་བ།",
|
||||
"Save Book Cover": "དེབ་གནས་བཅས་པའི་སྤྱོད་བྱས་མ་ཐུབ།",
|
||||
@@ -781,7 +773,6 @@
|
||||
"Annotate text after selection": "ཡིག་ཆ་འདེམས་པའི་ཐབས་ཀྱིས་མཆན་འགྲེལ་བྱེད་",
|
||||
"Search text after selection": "ཡིག་ཆ་འདེམས་པའི་ཐབས་ཀྱིས་འཚོལ་ཞིབ་བྱེད་",
|
||||
"Look up text in dictionary after selection": "ཡིག་ཆ་འདེམས་པའི་ཐབས་ཀྱིས་ཚིག་མཛོད་ནང་འཚོལ་",
|
||||
"Look up text in Wikipedia after selection": "ཡིག་ཆ་འདེམས་པའི་ཐབས་ཀྱིས་ཝེ་ཀི་པི་ཌི་ཡི་ནང་འཚོལ་",
|
||||
"Translate text after selection": "ཡིག་ཆ་འདེམས་པའི་ཐབས་ཀྱིས་སྐད་བསྒྱུར་བྱེད་",
|
||||
"Read text aloud after selection": "ཡིག་ཆ་འདེམས་པའི་ཐབས་ཀྱིས་སྐད་ཀྱིས་ཀློག་",
|
||||
"Proofread text after selection": "ཡིག་ཆ་འདེམས་པའི་ཐབས་ཀྱིས་ཞིབ་བཤེར་བྱེད་",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "དཔེ་དེབ་ཕྱིར་འདོན་མི་ཐུབ།",
|
||||
"Export Book": "དཔེ་དེབ་ཕྱིར་འདོན།",
|
||||
"Whole word:": "ཚིག་གྲུབ་ཆ་ཚང་:",
|
||||
"Error": "ནོར་འཁྲུལ།",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "རྩོམ་ཡིག་མངོན་མི་ཐུབ། {{link}} ཐད་ཀར་འཚོལ་བ་བྱོས།",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "ཚིག་མངོན་མི་ཐུབ། {{link}} ཐད་ཀར་འཚོལ་བ་བྱོས།",
|
||||
"Date Published": "པར་སྐྲུན་ཚེས་གྲངས།",
|
||||
"Only for TTS:": "TTS ལ་ཁོ་ན།:",
|
||||
"Uploaded": "ཡར་སྐྱེལ་བྱས་ཟིན།",
|
||||
@@ -1027,16 +1015,12 @@
|
||||
"Invalid Readwise access token": "Readwise འཛུལ་སྤྱོད་ལག་ཁྱེར་ནོར་འདུག",
|
||||
"Disconnected from Readwise": "Readwise ནས་མཐུད་ལམ་བཅད་ཟིན།",
|
||||
"Never": "ནམ་ཡང་མིན།",
|
||||
"Readwise Settings": "Readwise སྒྲིག་བཀོད།",
|
||||
"Connected to Readwise": "Readwise ལ་མཐུད་ཟིན།",
|
||||
"Last synced: {{time}}": "མཐའ་མའི་མཉམ་བྱུང་དུས་ཚོད། {{time}}",
|
||||
"Sync Enabled": "མཉམ་བྱུང་ནུས་པ་སྤར་ཟིན།",
|
||||
"Disconnect": "མཐུད་ལམ་གཅོད་པ།",
|
||||
"Connect your Readwise account to sync highlights.": "ཁྱེད་ཀྱི་ Readwise རྩིས་ཐོ་མཐུད་ནས་བཀོད་མཆན་མཉམ་བྱུང་གནང་རོགས།",
|
||||
"Get your access token at": "འཛུལ་སྤྱོད་ལག་ཁྱེར་འདི་ནས་ལེན་རོགས།",
|
||||
"Access Token": "འཛུལ་སྤྱོད་ལག་ཁྱེེར།",
|
||||
"Paste your Readwise access token": "Readwise འཛུལ་སྤྱོད་ལག་ཁྱེར་འདིར་སྦྱོར་རོགས།",
|
||||
"Config": "སྒྲིག་བཀོད།",
|
||||
"Readwise Sync": "Readwise མཉམ་བྱུང་།",
|
||||
"Push Highlights": "བཀོད་མཆན་སྐྱེལ་བ།",
|
||||
"Highlights synced to Readwise": "བཀོད་མཆན་ Readwise ལ་མཉམ་བྱུང་བྱས་ཟིན།",
|
||||
@@ -1106,7 +1090,6 @@
|
||||
"Copy Selection": "བདམས་པ་བཤུ་བ།",
|
||||
"Translate Selection": "བདམས་པ་ཡིག་སྒྱུར།",
|
||||
"Dictionary Lookup": "ཚིག་མཛོད་ནང་འཚོལ་བ།",
|
||||
"Wikipedia Lookup": "ཝེ་ཁེ་པི་ཌི་ཡར་འཚོལ་བ།",
|
||||
"Read Aloud Selection": "བདམས་པ་སྒྲ་ཆེན་པོས་ཀློག",
|
||||
"Proofread Selection": "བདམས་པ་ཞུ་དག",
|
||||
"Open Settings": "སྒྲིག་འགོད་ཁ་ཕྱེ་བ།",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "འཚོལ་བར་འདྲུད།",
|
||||
"Punctuation Delay": "ཚེག་ཤད་ཕྱིར་འགྱངས།",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "མུ་མཐུད་མ་བྱས་གོང་ OPDS འབྲེལ་མཐུད་འདི་དྲ་རྒྱའི་ཉེར་སྤྱོད་ཐོག་ Readest ཞབས་ཞུ་བ་བརྒྱུད་ནས་བསྐུར་རྒྱུ་ཡིན་པ་གཏན་འཁེལ་བྱོས།",
|
||||
"Custom Headers": "སྲོལ་སྒྲིག་མགོ་བརྗེ",
|
||||
"Custom Headers (optional)": "སྲོལ་སྒྲིག་མགོ་བརྗེ (གདམ་གའི)",
|
||||
"Add one header per line using \"Header-Name: value\".": "\"Header-Name: value\" བེད་སྤྱོད་བྱས་ནས་ཕྲེང་རེ་རེའི་ནང་མགོ་བརྗེ་གཅིག་སྣོན།",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "OPDS འབྲེལ་མཐུད་འདི་དྲ་རྒྱའི་ཉེར་སྤྱོད་ཐོག་ Readest ཞབས་ཞུ་བ་བརྒྱུད་ནས་བསྐུར་རྒྱུ་ཡིན་པ་ངས་ཧ་གོ། ང་ Readest ལ་ངེས་འཛིན་འམ་མགོ་བརྗེ་འདི་དག་ཡིད་ཆེས་མེད་ན། ང་ས་གནས་ཉེར་སྤྱོད་བེད་སྤྱོད་བྱ་དགོས།",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcover ལ་འབྲེལ་མཐུད་བྱེད་ཐུབ་མ་སོང་། ཁྱེད་ཀྱི་དྲ་རྒྱའི་འབྲེལ་མཐུད་ལ་ཞིབ་བཤེར་གནང་།",
|
||||
"Invalid Hardcover API token": "Hardcover API ཐོབ་ཐང་མ་ཆིག་སྒྲིལ་མིན།",
|
||||
"Disconnected from Hardcover": "Hardcover ནས་འབྲེལ་མཐུད་ཆད་སོང་།",
|
||||
"Hardcover Settings": "Hardcover སྒྲིག་འགོད",
|
||||
"Connected to Hardcover": "Hardcover ལ་འབྲེལ་མཐུད་བྱས་ཟིན།",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "ཀློག་འགྲོས་དང་མཆན་ཟླ་སྒྲིག་བྱེད་པར་ཁྱེད་ཀྱི Hardcover ཐོ་ཁུངས་འབྲེལ་མཐུད་བྱོས།",
|
||||
"Get your API token from hardcover.app → Settings → API.": "hardcover.app → སྒྲིག་འགོད → API ནས་ཁྱེད་ཀྱི API ཐོབ་ཐང་ལེན།",
|
||||
"API Token": "API ཐོབ་ཐང་།",
|
||||
"Paste your Hardcover API token": "ཁྱེད་ཀྱི Hardcover API ཐོབ་ཐང་སྦྱར།",
|
||||
"Hardcover sync enabled for this book": "དེབ་འདིའི་ཆེད་ Hardcover ཟླ་སྒྲིག་སྤྱོད་འགོ་ཚུགས།",
|
||||
"Hardcover sync disabled for this book": "དེབ་འདིའི་ཆེད་ Hardcover ཟླ་སྒྲིག་མཚམས་བཞག",
|
||||
"Hardcover Sync": "Hardcover ཟླ་སྒྲིག",
|
||||
"Enable for This Book": "དེབ་འདིའི་ཆེད་སྤྱོད་འགོ་ཚུགས།",
|
||||
"Push Notes": "མཆན་གཏོང་བ",
|
||||
"Enable Hardcover sync for this book first.": "སྔོན་ལ་དེབ་འདིའི་ཆེད་ Hardcover ཟླ་སྒྲིག་སྤྱོད་འགོ་ཚུགས།",
|
||||
"No annotations or excerpts to sync for this book.": "དེབ་འདིའི་ཆེད་ཟླ་སྒྲིག་བྱེད་པའི་མཆན་ཡང་ན་དྲངས་ཡིག་མེད།",
|
||||
"Configure Hardcover in Settings first.": "སྔོན་ལ་སྒྲིག་འགོད་ནང་ Hardcover རིགས་སྒྲིག་བྱོས།",
|
||||
"No new Hardcover note changes to sync.": "ཟླ་སྒྲིག་བྱེད་པའི་ Hardcover མཆན་གསར་པ་མེད།",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "སྦྲེལ་རྟགས་གཅད་པ",
|
||||
"Apply Theme Colors to PDF": "PDF ལ་བརྗོད་དོན་ཚོས་གཞི་སྤྱོད་པ",
|
||||
"Name": "མིང",
|
||||
"Unavailable": "རག་མི་ཐུབ",
|
||||
"Remove": "བསུབ།",
|
||||
"Edit OPDS Catalog": "OPDS དཀར་ཆག་རྩོམ་སྒྲིག",
|
||||
"Save Changes": "བསྒྱུར་བཅོས་ཉར་ཚགས།",
|
||||
"Use Book Layout": "དཔེ་ཆའི་བཀོད་སྒྲིག་སྤྱོད་པ"
|
||||
"Use Book Layout": "དཔེ་ཆའི་བཀོད་སྒྲིག་སྤྱོད་པ",
|
||||
"End of this section. Continue to the next.": "སྡེ་ཚན་འདིའི་མཇུག་རེད། རྗེས་མའི་སྡེ་ཚན་དུ་མུ་མཐུད་རོགས།",
|
||||
"Auto-download": "རང་འགུལ་ཕབ་ལེན།",
|
||||
"Auto-download new items": "གསར་འདོན་གསར་པ་རང་འགུལ་ཕབ་ལེན།",
|
||||
"Automatically download new publications when the app syncs": "མཉེན་ཆས་མཉམ་སྦྱོར་སྐབས་གསར་འདོན་གསར་པ་རང་འགུལ་ཕབ་ལེན་བྱེད།",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDS ནས་གསར་འདོན་གསར་པ་ {{count}} ཕབ་ལེན་བྱས།",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "OPDS དཀར་ཆག་ {{count}} མཉམ་སྦྱོར་མ་ཐུབ།",
|
||||
"Last synced {{when}}": "མཐའ་མའི་མཐུན་སྒྲིག་ {{when}}",
|
||||
"Failed downloads": "ཕབ་ལེན་ཕམ་ཁ།",
|
||||
"No failed downloads": "ཕབ་ལེན་ཕམ་ཁ་མེད།",
|
||||
"Attempts: {{count}}_other": "ཐེངས་ {{count}}",
|
||||
"Skip": "གཡོལ།",
|
||||
"Skip all": "ཡོད་ཚད་གཡོལ།",
|
||||
"Retry all": "ཡོད་ཚད་ཡང་སྐྱར།",
|
||||
"{{count}} failed_other": "{{count}} ཕམ་ཁ།",
|
||||
"(none)": "(མེད)",
|
||||
"Identifiers": "ངོས་འཛིན་བྱེད་མཁན",
|
||||
"Read (Stream)": "ཀློག་པ། (རྒྱུན་སྤེལ།)",
|
||||
"Failed to start stream": "རྒྱུན་སྤེལ་འགོ་འཛུགས་མ་ཐུབ།",
|
||||
"No dictionaries enabled": "ཚིག་མཛོད་གང་ཡང་སྒོ་མི་འབྱེད།",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "སྒྲིག་འགོད ← སྐད་ཡིག ← ཚིག་མཛོད་ནས་ཚིག་མཛོད་ཤིག་ལ་སྒོ་འབྱེད།",
|
||||
"Wiktionary": "ཝི་ཀེ་ཤོག་ནར།",
|
||||
"Drag to reorder": "གོ་རིམ་སྒྱུར་བར་འཐེན།",
|
||||
"Built-in": "ནང་ཁུལ།",
|
||||
"Bundle is missing on this device. Re-import to use it.": "ཡོ་བྱད་འདི་དུས་ཆས་ཁྲོད་མི་འདུག འདི་སྤྱོད་པར་ཡང་བསྐྱར་ནང་འདྲེན་གནང་རོགས།",
|
||||
"This dictionary format is not supported.": "ཚིག་མཛོད་འདིའི་རྣམ་པར་རྒྱབ་སྐྱོར་མི་བྱེད།",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "ཚིག་མཛོད་ {{count}} ནང་འདྲེན་གྲུབ།",
|
||||
"Skipped incomplete bundles: {{names}}": "ཚང་མི་འདུག་པའི་ཡོ་བྱད་སྤོས་ནས་འགྲོ་སོང༌། {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "ཚིག་མཛོད་ནང་འདྲེན་གྲུབ་མ་སོང༌། {{message}}",
|
||||
"Dictionaries": "ཚིག་མཛོད་ཁག",
|
||||
"Delete Dictionary": "ཚིག་མཛོད་སུབ།",
|
||||
"Importing…": "ནང་འདྲེན་བྱེད་བཞིན་པ…",
|
||||
"Import Dictionary": "ཚིག་མཛོད་ནང་འདྲེན།",
|
||||
"No dictionaries available.": "ཚིག་མཛོད་གང་ཡང་མི་འདུག།",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict ཡོ་བྱད་ལ་ .ifo དང་ .idx, .dict.dz ཡིག་ཆ་ཁག་དགོས་པ་ཡིན། (.syn ནི་འདེམས་འཁྱོངས་ཡིན།)",
|
||||
"Select all the bundle files together when importing.": "ནང་འདྲེན་སྐབས་ཡོ་བྱད་ཡིག་ཆ་ཡོངས་མཉམ་དུ་འདེམས་རོགས།",
|
||||
"Manage Dictionaries": "ཚིག་མཛོད་སྟངས་འཛིན།",
|
||||
"Select Dictionary Files": "ཚིག་མཛོད་ཡིག་ཆ་འདེམས།",
|
||||
"Read on Wikipedia →": "ཝི་ཁི་ཕིཌིཡ་ནས་ཀློག →",
|
||||
"This link can't be opened": "འདྲེན་བྱང་འདི་ཁ་ཕྱེ་ཐུབ་མེད།",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "དྲན་བྱང་འདྲེན་བྱང་ལ་དགོས་ངེས་གནས་ཚུལ་མི་འདུག འདྲེན་བྱང་གདོད་མ་གཅོད་ཡོད་སྲིད།",
|
||||
"Go to Readest": "Readest ལ་འགྲོ",
|
||||
"Open-source ebook reader for everyone, on every device.": "མི་ཀུན་ལ། སྒྲིག་ཆས་སྣ་ཚོགས་ཐོག་ཏུ་སྤྱོད་རུང་བའི་འབྱེད་པའི་ཀོ་ཌ་ཨི་དེབ་ཀློག་ཆས།",
|
||||
"Open in Readest": "Readest ནང་ཁ་ཕྱེ",
|
||||
"If Readest didn't open automatically, choose an option below:": "Readest རང་འགུལ་གྱིས་ཁ་ཕྱེ་མེད་ན། འོག་གི་གདམ་ག་ཞིག་འདེམས་རོགས།",
|
||||
"Continue reading where you left off.": "ཁྱོད་ཀྱིས་མཚམས་བཞག་སའི་ས་ནས་མུ་མཐུད་ཀློག་རོགས།",
|
||||
"Readest logo": "Readest ཀྱི་ལས་རྟགས།",
|
||||
"Opening Readest...": "Readest ཁ་ཕྱེ་བཞིན་པ…",
|
||||
"Open in Readest app": "Readest ཉེར་སྤྱོད་ནང་ཁ་ཕྱེ",
|
||||
"Continue in browser": "བརྡར་ཞིབ་ཆས་ནང་མུ་མཐུད",
|
||||
"Don't have Readest?": "Readest མེད་དམ།",
|
||||
"Book not in your library": "དེབ་འདི་ཁྱེད་ཀྱི་དཔེ་མཛོད་ནང་མི་འདུག",
|
||||
"Share Book": "དཔེ་ཆ་མཉམ་སྤྱོད།",
|
||||
"Could not create share link": "མཉམ་སྤྱོད་འབྲེལ་མཐུད་བཟོ་མ་ཐུབ།",
|
||||
"Link copied": "འབྲེལ་མཐུད་པར་སློག་གྲུབ།",
|
||||
"Could not copy link": "འབྲེལ་མཐུད་པར་སློག་མ་ཐུབ།",
|
||||
"Share revoked": "མཉམ་སྤྱོད་ཕྱིར་འཐེན།",
|
||||
"Could not revoke share": "མཉམ་སྤྱོད་ཕྱིར་འཐེན་མ་ཐུབ།",
|
||||
"Uploading book…": "དཔེ་ཆ་ཡར་སྐྱེལ་བཞིན་པ…",
|
||||
"Generating…": "བཟོ་བཞིན་པ…",
|
||||
"Generate share link": "མཉམ་སྤྱོད་འབྲེལ་མཐུད་བཟོ།",
|
||||
"Share URL": "མཉམ་སྤྱོད་གནས་སྡོད།",
|
||||
"Copy link": "འབྲེལ་མཐུད་པར་སློག",
|
||||
"Copied": "པར་སློག་གྲུབ།",
|
||||
"Share via…": "བརྒྱུད་ནས་མཉམ་སྤྱོད…",
|
||||
"Expires {{date}}": "{{date}} ལ་དུས་ཟད།",
|
||||
"Revoking…": "ཕྱིར་འཐེན་བཞིན་པ…",
|
||||
"Revoke share": "མཉམ་སྤྱོད་ཕྱིར་འཐེན།",
|
||||
"Sign in to share books": "དཔེ་ཆ་མཉམ་སྤྱོད་པར་ཐོ་འགོད་གནང་རོགས།",
|
||||
"Expiring soon": "མྱུར་དུ་ཟད་ངེས།",
|
||||
"Missing share token": "མཉམ་སྤྱོད་ཐམ་ག་མེད།",
|
||||
"Could not add to your library": "ཁྱེད་ཀྱི་དཔེ་མཛོད་ལ་སྣོན་མ་ཐུབ།",
|
||||
"This share link is no longer available": "མཉམ་སྤྱོད་འབྲེལ་མཐུད་འདི་མི་འཐོབ།",
|
||||
"The original link may have expired or been revoked.": "གདོད་མའི་འབྲེལ་མཐུད་དུས་ཟད་པའམ་ཕྱིར་འཐེན་སྲིད།",
|
||||
"Get Readest": "Readest བཞེས་པ།",
|
||||
"Loading shared book…": "མཉམ་སྤྱོད་དཔེ་ཆ་མར་སྐྱེལ་བཞིན་པ…",
|
||||
"Adding…": "སྣོན་བཞིན་པ…",
|
||||
"Add to my library": "ངའི་དཔེ་མཛོད་ལ་སྣོན།",
|
||||
"Could not load your shares": "ཁྱེད་ཀྱི་མཉམ་སྤྱོད་མར་སྐྱེལ་མ་ཐུབ།",
|
||||
"Revoked": "ཕྱིར་འཐེན།",
|
||||
"Expired": "དུས་ཟད།",
|
||||
"Shared books": "མཉམ་སྤྱོད་དཔེ་ཆ།",
|
||||
"You haven't shared any books yet": "ཁྱོས་ད་དུང་དཔེ་ཆ་གང་ཡང་མཉམ་སྤྱོད་མ་བྱས།",
|
||||
"Open a book and tap Share to send it to a friend.": "དཔེ་ཆ་ཞིག་ཁ་ཕྱེ་ནས་གྲོགས་པོ་ལ་སྐུར་ཆེད་མཉམ་སྤྱོད་གཏུགས།",
|
||||
"{{count}} active_other": "{{count}} ལས་འཛིན་བཞིན་པ།",
|
||||
"{{count}} downloads_other": "{{count}} ཕབ་ལེན།",
|
||||
"starts at saved page": "ཉར་ཚགས་ཤོག་ངོས་ནས་འགོ་འཛུགས།",
|
||||
"More actions": "བྱ་འགུལ་མང་བ།",
|
||||
"Loading…": "མར་སྐྱེལ་བཞིན་པ…",
|
||||
"Load more": "མང་བ་མར་སྐྱེལ།",
|
||||
"Could not load shared book": "མཉམ་སྤྱོད་དཔེ་ཆ་མར་སྐྱེལ་མ་ཐུབ།",
|
||||
"The share link is missing required information.": "མཉམ་སྤྱོད་འབྲེལ་མཐུད་ལ་ཆ་རྐྱེན་མེད།",
|
||||
"Please check your connection and try again.": "ཁྱེད་ཀྱི་འབྲེལ་མཐུད་ཞིབ་འཇུག་གནང་ནས་ཡང་བསྐྱར་ཐེངས་གཅིག་འབད་རོགས།",
|
||||
"Sign in to import shared books": "མཉམ་སྤྱོད་དཔེ་ཆ་འདྲེན་པར་ཐོ་འགོད་གནང་རོགས།",
|
||||
"Already in your library": "ཁྱེད་ཀྱི་དཔེ་མཛོད་ནང་ཡོད་ཟིན་པ།",
|
||||
"Added to your library": "ཁྱེད་ཀྱི་དཔེ་མཛོད་ལ་སྣོན་ཟིན།",
|
||||
"Could not import shared book": "མཉམ་སྤྱོད་དཔེ་ཆ་འདྲེན་མ་ཐུབ།",
|
||||
"Manage Shared Links": "མཉམ་སྤྱོད་འབྲེལ་མཐུད་དོ་དམ།",
|
||||
"Expires in": "དུས་ཟད།",
|
||||
"{{count}} days_other": "ཉིན་{{count}}",
|
||||
"Expires in {{count}} days_other": "ཉིན་{{count}}ནང་ཟད།",
|
||||
"Expires in {{count}} hours_other": "ཆུ་ཚོད་{{count}}ནང་ཟད།",
|
||||
"Open in app": "ཉེར་སྤྱོད་ནང་ཁ་ཕྱེ།",
|
||||
"Shared with you": "ཁྱེད་དང་མཉམ་སྤྱོད་བྱས།",
|
||||
"Downloading… {{percent}}%": "ཕབ་ལེན་བྱེད་བཞིན་པ… {{percent}}%",
|
||||
"Import progress": "ནང་འདྲེན་གྱི་ཡར་ཐོན།",
|
||||
"Share reading progress": "ཀློག་འདོན་གྱི་ཡར་ཐོན་སྤེལ་མཁོ།",
|
||||
"Includes your reading progress": "ཁྱེད་ཀྱི་ཀློག་འདོན་གྱི་ཡར་ཐོན་འདུས།",
|
||||
"Synced {{time}}": "{{time}}མཉམ་སྒྲིག་བྱས་པ",
|
||||
"Sync Info": "མཉམ་སྒྲིག་གྱི་ཆ་འཕྲིན",
|
||||
"Last Synced": "མཐའ་མའི་མཉམ་སྒྲིག",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT ཕུང་པོར་ .index ཡིག་ཆ་དང་ .dict.dz ཡིག་ཆ་གཉིས་ཀ་དགོས།",
|
||||
"Slob bundles need a .slob file.": "Slob ཕུང་པོར་ .slob ཡིག་ཆ་ཞིག་དགོས།",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL ཕྱི་མོ་ http(s):// གིས་འགོ་འཛུགས་དགོས་ལ་ %WORD% ཡོད་དགོས།",
|
||||
"Web": "དྲ་རྒྱ",
|
||||
"Add Web Search": "དྲ་རྒྱའི་འཚོལ་བཤེར་སྣོན།",
|
||||
"Edit Web Search": "དྲ་རྒྱའི་འཚོལ་བཤེར་རྩོམ་སྒྲིག",
|
||||
"e.g. Google": "དཔེར་ན། Google",
|
||||
"URL Template": "URL ཕྱི་མོ",
|
||||
"Use %WORD% where the looked-up word should appear.": "འཚོལ་བཤེར་བྱས་པའི་ཚིག་འཆར་ས་གནས་སུ་ %WORD% བཀོལ་སྤྱོད་གནང་རོགས།",
|
||||
"Open the search result in your browser:": "ཁྱེད་ཀྱི་བརྡ་འཚོལ་མཁོ་ཆས་ལ་འཚོལ་བཤེར་གྲུབ་འབྲས་ཁ་ཕྱེ:",
|
||||
"Open in {{name}}": "{{name}} ནང་ཁ་ཕྱེ།",
|
||||
"Book Fingerprint": "དཔེ་ཆའི་མཛུབ་རྗེས།",
|
||||
"Search the web": "དྲ་ངོས་སུ་འཚོལ་ཞིབ།",
|
||||
"App deeplink (readest://)": "ཉེར་སྤྱོད་ཟབ་སྦྲེལ (readest://)",
|
||||
"Universal web link (https://)": "སྤྱི་ཁྱབ་དྲ་སྦྲེལ (https://)",
|
||||
"Name cannot be empty.": "མིང་སྟོང་པར་འཇོག་མི་རུང་།",
|
||||
"Replaced {{count}} existing dictionary_other": "གཞི་ནས་ཡོད་པའི་ཚིག་མཛོད་ {{count}} བརྗེ་སྒྱུར་བྱས།",
|
||||
"Cancel Edit": "བཟོ་བཅོས་ཕྱིར་འཐེན།",
|
||||
"Edit Dictionary": "ཚིག་མཛོད་བཟོ་བཅོས།",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict གི་ཡིག་ཆས་ཚོགས་ཀྱིས་ .mdx ཡིག་ཆ་སྤྱོད། སྦྲེལ་མཐུན་ .mdd དང་ .css ཡིག་ཆ་ཡིན་ན་འདེམས་ཆོག",
|
||||
"Dictionary name": "ཚིག་མཛོད་མིང་།",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "སྒྲ་འདི་འདིར་སྒྲོག་མི་ཐུབ — ཚིག་མཛོད་འདིས་རྩིས་མེད་པའི་རྣམ་པ་སྤྱོད། Opus, MP3, ཡང་ན་ WAV གི་སྒྲ་ལྡན་པ་ཞིག་ལ་འདེམས་སྡུར་གྱིས།",
|
||||
"File uploaded: {{title}}": "ཡིག་ཆ་སྤྲད་ཟིན། {{title}}",
|
||||
"File downloaded: {{title}}": "ཡིག་ཆ་ཕབ་ལེན་བྱས་ཟིན། {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "ཡིག་ཆའི་སྤྲི་དོན་གྱི་འདྲ་བཤུས་བསུབ་ཟིན། {{title}}",
|
||||
"Failed to upload file: {{title}}": "ཡིག་ཆ་སྤྲད་མ་ཐུབ། {{title}}",
|
||||
"Failed to download file: {{title}}": "ཡིག་ཆ་ཕབ་ལེན་བྱས་མ་ཐུབ། {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "ཡིག་ཆའི་སྤྲི་དོན་གྱི་འདྲ་བཤུས་བསུབ་ཐུབ་མེད། {{title}}",
|
||||
"{{percentage}}% used": "སྤྱོད་ཟིན་ {{percentage}}%",
|
||||
"Set PIN…": "PIN སྒྲིག་པ་…",
|
||||
"Require a 4-digit PIN to open Readest": "Readest ཁ་ཕྱེ་བར་ཨང་གྲངས་ ༤ ཡོད་པའི་ PIN ཞིག་དགོས",
|
||||
"Change PIN…": "PIN བརྗེ་བ་…",
|
||||
"Disable PIN…": "PIN སྤོ་བ་…",
|
||||
"Sync passphrase ready": "མཉམ་སྦྱོར་གསང་ཚིག་གྲ་སྒྲིག་ཟིན་པ།",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "འདིས་ཡིག་ཆ་ཁག་གསང་སྦས་སུ་མཉམ་སྦྱོར་བྱས་པ་རྣམས་ (དཔེར་ན། OPDS དཀར་ཆག་གི་གསང་ཨང་) སྒྲིག་ཆས་རེ་རེའི་ཐོག་གཏན་འཇགས་སུ་སུབ་སྲིད། ས་གནས་ཀྱི་པར་གཞི་ཉར་ཡོད། ཁྱོད་ཀྱིས་མཉམ་སྦྱོར་གསང་ཚིག་སྔར་བཞིན་འཇུག་པའམ་གསར་པ་སྒྲིག་དགོས། མུ་མཐུད་དམ།",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "མཉམ་སྦྱོར་གསང་ཚིག་བརྗེད་སོང་ — གསང་སྦས་ཀྱི་ས་སྟོང་ཚང་མ་སུབ་ཟིན།",
|
||||
"Sync passphrase": "མཉམ་སྦྱོར་གསང་ཚིག",
|
||||
"Set passphrase": "གསང་ཚིག་སྒྲིག་པ།",
|
||||
"Forgot passphrase": "གསང་ཚིག་བརྗེད་སོང་།",
|
||||
"Incorrect PIN": "PIN ནོར་འདུག",
|
||||
"App locked": "མཉེན་ཆས་སྒོ་བརྒྱབ་ཡོད",
|
||||
"Enter your PIN": "ཁྱེད་ཀྱི་ PIN འབྲི་རོགས",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest སྒོ་བརྒྱབ་ཡོད། མུ་མཐུད་པར་ཨང་གྲངས་ ༤ ཡོད་པའི་ PIN འབྲི་རོགས།",
|
||||
"PIN code": "PIN ཨང་གྲངས",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PIN བརྗེད་ན་ཁྱེད་ཀྱིས་སྒྲིག་ཆས་འདིར་འཛུལ་མི་ཐུབ། སླར་སྒྲིག་པར་མཉེན་ཆས་ཀྱི་གཞི་གྲངས་གཙང་སེལ་བྱ་དགོས།",
|
||||
"Passphrase must be at least 8 characters": "གསང་ཚིག་ལ་ཡི་གེ་གྲངས་ ༨ ལས་མི་ཉུང་བ་དགོས།",
|
||||
"Passphrases do not match": "གསང་ཚིག་གཉིས་མཐུན་མི་འདུག",
|
||||
"Set sync passphrase": "མཉམ་སྦྱོར་གསང་ཚིག་སྒྲིག་པ།",
|
||||
"Enter sync passphrase": "མཉམ་སྦྱོར་གསང་ཚིག་འཇུག་རོགས།",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "མཉམ་སྦྱོར་གསང་ཚིག་གིས་གལ་ཆེའི་ས་སྟོང་རྣམས་ (དཔེར་ན་ OPDS དཀར་ཆག་གི་ངོས་འཛིན་ཆ་འཕྲིན) མཉམ་སྦྱོར་མ་བྱས་གོང་གསང་སྦས་སུ་སྒྱུར། ང་ཚོས་གསང་ཚིག་འདི་ནམ་ཡང་མཐོང་མི་ཐུབ། དྲན་སླ་བ་ཞིག་འདེམས་རོགས། — དེ་མེད་ན་སླར་འཚོལ་མི་ཐུབ།",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "ཁྱེད་ཀྱི་མཉམ་སྦྱོར་ངོས་འཛིན་ཆ་འཕྲིན་གསང་སྦས་འགྲོལ་ཆེད་སྒྲིག་ཆས་གཞན་པོར་སྒྲིག་པའི་མཉམ་སྦྱོར་གསང་ཚིག་འཇུག་རོགས།",
|
||||
"Confirm passphrase": "གསང་ཚིག་གཏན་འཁེལ།",
|
||||
"Unlock": "ཁ་ཕྱེ།",
|
||||
"Set PIN": "PIN སྒྲིག་པ",
|
||||
"Change PIN": "PIN བརྗེ་བ",
|
||||
"Disable PIN": "PIN སྤོ་བ",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "ཁྱེད་ཀྱི་ད་ལྟའི་ PIN འབྲི་རྗེས། ཨང་གྲངས་ ༤ ཡོད་པའི་ PIN གསར་པ་ཞིག་འདེམས།",
|
||||
"Enter your current PIN to disable the app lock.": "མཉེན་ཆས་ཀྱི་སྒོ་བརྒྱབ་པ་སྤོ་བར་ཁྱེད་ཀྱི་ད་ལྟའི་ PIN འབྲི་རོགས།",
|
||||
"PIN must be {{length}} digits": "PIN ནི་ཨང་གྲངས་ {{length}} ཡིན་དགོས",
|
||||
"PINs do not match": "PIN མི་འདྲ",
|
||||
"Current PIN": "ད་ལྟའི་ PIN",
|
||||
"New PIN": "PIN གསར་པ",
|
||||
"Confirm new PIN": "PIN གསར་པ་གཏན་འཁེལ",
|
||||
"Manage Sync": "མཉམ་འགྲོ་སྟངས་འཛིན།",
|
||||
"Imported book files and library metadata": "ནང་འཇུག་བྱས་པའི་དཔེ་ཆའི་ཡིག་ཆ་དང་དཔེ་མཛོད་མཛོད་གནད་སྡུད།",
|
||||
"Last-read position, bookmarks, and per-book preferences": "མཐའ་མཇུག་ཀློག་སའི་གནས་ས། དཔེ་རྟགས། དཔེ་ཆ་རེ་རེའི་འདེམས་སྒྲིག།",
|
||||
"Highlights and notes": "གསལ་རྟགས་དང་ཟིན་བྲིས།",
|
||||
"Fonts": "ཡིག་གཟུགས།",
|
||||
"Custom font files": "རང་འདེམས་ཡིག་གཟུགས་ཀྱི་ཡིག་ཆ།",
|
||||
"Backgrounds": "རྒྱབ་ལྗོངས།",
|
||||
"Custom background textures": "རང་འདེམས་རྒྱབ་ལྗོངས་ཀྱི་རི་མོ།",
|
||||
"OPDS catalogs": "OPDS དཀར་ཆག།",
|
||||
"Saved catalog URLs and (encrypted) credentials": "ཉར་ཚགས་བྱས་པའི་དཀར་ཆག་གི་URL་དང་(གསང་འཇུག་བྱས་པའི་)ཐོབ་ཐང་ལག་འཁྱེར།",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "མཉམ་འགྲོ་གསང་གྲངས་ནོར་འདུག — མཉམ་འགྲོ་བྱས་པའི་ཐོབ་ཐང་ལག་འཁྱེར་ཁ་ཕྱེ་མི་ཐུབ།",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "ཞབས་ཞུ་བའི་ཐོག་གི་མཉམ་འགྲོ་གསང་གྲངས་ཀྱི་གནད་སྡུད་སླར་སྒྲིག་བྱས་སོང་། གསང་གྲངས་གསར་པས་ཁྱེད་ཀྱི་ཐོབ་ཐང་ལག་འཁྱེར་སླར་གསང་འཇུག་བྱེད་བཞིན་པ་ཡིན…",
|
||||
"Failed to decrypt synced credentials": "མཉམ་འགྲོ་བྱས་པའི་ཐོབ་ཐང་ལག་འཁྱེར་ཁ་ཕྱེ་བར་ཕམ་ཉེས་བྱུང་།",
|
||||
"Imported dictionary bundles and settings": "ནང་འཇུག་བྱས་པའི་ཚིག་མཛོད་ཐུམ་སྒྲིལ་དང་སྒྲིག་འགོད།",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "ཁྱེད་ཀྱི་སྒྲིག་ཆས་ཁག་གི་བར་ལ་གང་མཉམ་འགྲོ་དགོས་པ་འདེམས་རོགས། སྡེ་ཚན་ཞིག་ནུས་མེད་བཟོས་ན། སྒྲིག་ཆས་འདིས་རིགས་དེའི་ཡིག་ཆ་སྐུར་སྤྲོད་དམ་ལེན་པ་མཚམས་འཇོག་བྱེད། ཞབས་ཞུ་བ་སྟེང་གནས་ཟིན་པའི་གང་ཡང་འགྱུར་ལྡོག་མི་ཐེབས། ཡང་བསྐྱར་ནུས་ཅན་བཟོས་ཚེ། མཚམས་འཇོག་སའི་གནས་ནས་མུ་མཐུད་འགྲོ་བ་ཡིན།",
|
||||
"Data Sync": "གཞི་གྲངས་མཉམ་འགྲོ།",
|
||||
"Manage Fonts": "ཡིག་གཟུགས་སྟངས་འཛིན།",
|
||||
"App settings": "མཉེན་ཆས་སྒྲིག་འགོད།",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "བརྗོད་གཞི། གསལ་རྟགས་ཁ་དོག ཟུང་འབྲེལ་ (KOSync, Readwise, Hardcover) དང་ཚིག་མཛོད་ཀྱི་གོ་རིམ།",
|
||||
"Required while Dictionaries sync is enabled": "ཚིག་མཛོད་ཁག་མཉམ་འགྲོ་སྤྱོད་སྐབས་དགོས་མཁོ་ཡོད།",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} ཆུ་ཚོད་ {{minutes}} སྐར་མ་ནང་སླར་གསོ་བྱེད།",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "ཨང་གྲངས་བཞི་ཅན་གྱི་ PIN ཞིག་འདེམས་རོགས། Readest ཕྱེ་རུས་ཐེངས་རེར་ཁྱེད་ཀྱིས་དེ་ནང་འཇུག་དགོས། བརྗེད་སོང་བའི་ PIN ཞིག་སླར་གསོ་བྱེད་ཐབས་མེད། ཉེར་སྤྱོད་ཀྱི་གཞི་གྲངས་གཙང་སེལ་བྱེད་པ་ནི་སླར་སྒྲིག་བྱེད་ཐབས་གཅིག་པོ་ཡིན།",
|
||||
"Credentials": "ངོས་སྦྱོར་ཆ་འཕྲིན།",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, དང་ Readwise བཅས་ཀྱི་ཐོ་ཀེན་དང་སྤྱོད་མི་མིང་དང་གསང་གྲངས། སྤོ་འཛུགས་མེད་པའི་སྐབས། ངོས་སྦྱོར་ཆ་འཕྲིན་ཡིག་ཆས་འདི་ཁོ་ནར་གནས་པ་དང་ནམ་ཡང་སྤོ་གཏོང་མི་བྱེད།",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "གཙོ་གནད་ཆགས་པའི་མཉམ་སྡེབ་ཐོ་ཁོངས་ཡིག་ཆ་སྤོ་གཏོང་མ་བྱས་སྔོན་ལ་གསང་སྦས་སུ་འགྱུར་བར་བཟོ། གསང་སྦས་དགོས་སྐབས་ད་ལྟ་འམ་ཕྱིས་སུ་གསང་ཚིག་ཕྲེང་གཅིག་སྒྲིག་འཛུགས་གནང་རོགས།",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "རྩིས་ཐོ་འདིར་ཉར་ཚགས་བྱས་ཡོད། ངོས་སྦྱོར་ཆ་འཕྲིན་ལ་གསང་སྦས་འགྲོལ་སྐབས་ཁྱེད་ལ་འདྲི་སློང་གནང་འགྱུར།",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "སྒྲིག་ཆས་འདིའི་ཀློག་འགྲོས་ནི་\"{{deviceName}}\"དང་མི་འདྲ།",
|
||||
"This device": "སྒྲིག་ཆས་འདི།",
|
||||
"Red": "དམར་པོ།",
|
||||
"Yellow": "སེར་པོ།",
|
||||
"Green": "ལྗང་ཁུ།",
|
||||
"Blue": "སྔོན་པོ།",
|
||||
"Violet": "མུ་མེན།",
|
||||
"Edit color": "ཁ་དོག་རྩོམ་སྒྲིག",
|
||||
"Add custom color": "རང་འདེམས་ཁ་དོག་སྣོན་པ།",
|
||||
"Add label": "བྱང་བུ་སྣོན་པ།",
|
||||
"Choose color": "ཁ་དོག་འདེམས་པ།",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcover ལ་མཐུད་ཟིན། མཐའ་མའི་མཉམ་སྒྲིག་ {{time}}།",
|
||||
"Integrations": "མཉམ་སྦྲེལ།",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwise ལ་མཐུད་ཟིན། མཐའ་མའི་མཉམ་སྒྲིག་ {{time}}།",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "དྲ་ཐོག་དཀར་ཆག་ནས་དེབ་བལྟ་ཞིབ་དང་ཕབ་ལེན་བྱེད་པ།",
|
||||
"Connected as {{user}}": "{{user}} ཡི་མིང་འོག་མཐུད་ཟིན།",
|
||||
"Not connected": "མ་མཐུད།",
|
||||
"{{count}} catalog_other": "དཀར་ཆག་ {{count}}",
|
||||
"No catalogs": "དཀར་ཆག་མེད།",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Readest ཕྱི་ཕྱོགས་ཞབས་ཞུ་ལ་སྦྲེལ་ནས་མཉམ་སྒྲིག་དང་གསལ་སྟོན། དཀར་ཆག་སོགས་སྤྱོད།",
|
||||
"Reading Sync": "ཀློག་པའི་མཉམ་སྒྲིག",
|
||||
"Content Sources": "ནང་དོན་འབྱུང་ཁུངས།",
|
||||
"Scroll tabs": "ཤོག་བྱང་འགུལ་སྐྱོད།",
|
||||
"Catalog actions": "དཔེ་ཐོའི་བྱ་སྤྱོད།",
|
||||
"File Content": "ཡིག་ཆའི་ནང་དོན།",
|
||||
"Start your library": "ཁྱེད་ཀྱི་དཔེ་མཛོད་འགོ་འཛུགས།",
|
||||
"Pick a book from your device to add it to your library.": "ཁྱེད་ཀྱི་སྒྲིག་ཆས་ནས་དཔེ་དེབ་ཅིག་འདེམས་ནས་ཁྱེད་ཀྱི་དཔེ་མཛོད་ལ་ཁ་སྣོན་གྱིས།",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "སྒེའུ་ཁུང་འདིའི་གང་སར་དཔེ་དེབ་ཅིག་འཇོག་པའམ་ཡང་ན་ཁྱེད་ཀྱི་གློག་ཀླད་ནས་འདེམས་རོགས།",
|
||||
"Sign in to sync your library": "ཁྱེད་ཀྱི་དཔེ་མཛོད་མཉམ་སྦྱོར་གྱི་ཆེད་ནང་བསྐྱོད་གནང་རོགས།"
|
||||
}
|
||||
|
||||
@@ -101,7 +101,6 @@
|
||||
"Updated": "Aktualisiert",
|
||||
"Version {{version}}": "Version {{version}}",
|
||||
"Vertical Direction": "Vertikale Richtung",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Willkommen in Ihrer Bibliothek. Sie können hier Ihre Bücher importieren und jederzeit lesen.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Writing Mode": "Schreibmodus",
|
||||
"Your Library": "Ihre Bibliothek",
|
||||
@@ -298,7 +297,6 @@
|
||||
"No notes match your search": "Noch keine Notizen gefunden",
|
||||
"Search notes and excerpts...": "Notizen und Auszüge suchen...",
|
||||
"Sign in to Sync": "Anmelden zum Synchronisieren",
|
||||
"Synced at {{time}}": "Synchronisiert um {{time}}",
|
||||
"Never synced": "Nie synchronisiert",
|
||||
"Show Remaining Time": "Verbleibende Zeit anzeigen",
|
||||
"{{time}} min left in chapter": "{{time}} min verbleibend im Kapitel",
|
||||
@@ -461,14 +459,12 @@
|
||||
"Remove from Cloud Only": "Nur aus der Cloud entfernen",
|
||||
"Remove from Device Only": "Nur vom Gerät entfernen",
|
||||
"Disconnected": "Getrennt",
|
||||
"KOReader Sync Settings": "KOReader Sync-Einstellungen",
|
||||
"Sync Strategy": "Sync-Strategie",
|
||||
"Ask on conflict": "Bei Konflikten fragen",
|
||||
"Always use latest": "Immer die neueste Version verwenden",
|
||||
"Send changes only": "Nur Änderungen senden",
|
||||
"Receive changes only": "Nur Änderungen empfangen",
|
||||
"Checksum Method": "Prüfziffernverfahren",
|
||||
"File Content (recommended)": "Dateiinhalte (empfohlen)",
|
||||
"File Name": "Dateiname",
|
||||
"Device Name": "Gerätename",
|
||||
"Connect to your KOReader Sync server.": "Mit Ihrem KOReader Sync-Server verbinden.",
|
||||
@@ -479,10 +475,7 @@
|
||||
"Connect": "Verbinden",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "Sync-Konflikt",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Lesefortschritt von \"{{deviceName}}\" synchronisieren?",
|
||||
"another device": "ein anderes Gerät",
|
||||
"Local Progress": "Lokaler Fortschritt",
|
||||
"Remote Progress": "Entfernter Fortschritt",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Seite {{page}} von {{total}} ({{percentage}}%)",
|
||||
"Current position": "Aktuelle Position",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Ungefähr Seite {{page}} von {{total}} ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "Durchgestrichen",
|
||||
"Squiggly": "Wellig",
|
||||
"Outline": "Umriss",
|
||||
"Save Current Color": "Aktuelle Farbe speichern",
|
||||
"Quick Colors": "Schnellfarben",
|
||||
"Highlighter": "Textmarker",
|
||||
"Save Book Cover": "Buchcover speichern",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "Text nach Auswahl annotieren",
|
||||
"Search text after selection": "Text nach Auswahl suchen",
|
||||
"Look up text in dictionary after selection": "Text nach Auswahl im Wörterbuch nachschlagen",
|
||||
"Look up text in Wikipedia after selection": "Text nach Auswahl in Wikipedia nachschlagen",
|
||||
"Translate text after selection": "Text nach Auswahl übersetzen",
|
||||
"Read text aloud after selection": "Text nach Auswahl vorlesen",
|
||||
"Proofread text after selection": "Text nach Auswahl Korrektur lesen",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "Buch konnte nicht exportiert werden.",
|
||||
"Export Book": "Buch exportieren",
|
||||
"Whole word:": "Ganzes Wort:",
|
||||
"Error": "Fehler",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Artikel kann nicht geladen werden. Versuchen Sie die direkte Suche auf {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Wort kann nicht geladen werden. Versuchen Sie die direkte Suche auf {{link}}.",
|
||||
"Date Published": "Veröffentlichungsdatum",
|
||||
"Only for TTS:": "Nur für TTS:",
|
||||
"Uploaded": "Hochgeladen",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "Ungültiges Readwise-Zugriffstoken",
|
||||
"Disconnected from Readwise": "Von Readwise getrennt",
|
||||
"Never": "Nie",
|
||||
"Readwise Settings": "Readwise-Einstellungen",
|
||||
"Connected to Readwise": "Mit Readwise verbunden",
|
||||
"Last synced: {{time}}": "Zuletzt synchronisiert: {{time}}",
|
||||
"Sync Enabled": "Synchronisierung aktiviert",
|
||||
"Disconnect": "Trennen",
|
||||
"Connect your Readwise account to sync highlights.": "Verbinden Sie Ihr Readwise-Konto, um Highlights zu synchronisieren.",
|
||||
"Get your access token at": "Holen Sie sich Ihr Zugriffstoken unter",
|
||||
"Access Token": "Zugriffstoken",
|
||||
"Paste your Readwise access token": "Fügen Sie Ihr Readwise-Zugriffstoken ein",
|
||||
"Config": "Konfiguration",
|
||||
"Readwise Sync": "Readwise-Synchronisierung",
|
||||
"Push Highlights": "Highlights übertragen",
|
||||
"Highlights synced to Readwise": "Highlights mit Readwise synchronisiert",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "Auswahl kopieren",
|
||||
"Translate Selection": "Auswahl übersetzen",
|
||||
"Dictionary Lookup": "Im Wörterbuch nachschlagen",
|
||||
"Wikipedia Lookup": "In Wikipedia nachschlagen",
|
||||
"Read Aloud Selection": "Auswahl vorlesen",
|
||||
"Proofread Selection": "Auswahl korrekturlesen",
|
||||
"Open Settings": "Einstellungen öffnen",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "Ziehen zum Suchen",
|
||||
"Punctuation Delay": "Satzzeichen-Verzögerung",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Bitte bestätigen Sie, dass diese OPDS-Verbindung über Readest-Server in der Web-App weitergeleitet wird, bevor Sie fortfahren.",
|
||||
"Custom Headers": "Benutzerdefinierte Header",
|
||||
"Custom Headers (optional)": "Benutzerdefinierte Header (optional)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Fügen Sie pro Zeile einen Header im Format \"Header-Name: value\" hinzu.",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Ich verstehe, dass diese OPDS-Verbindung über Readest-Server in der Web-App weitergeleitet wird. Wenn ich Readest meine Anmeldedaten oder Header nicht anvertraue, sollte ich stattdessen die native App verwenden.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Verbindung zu Hardcover nicht möglich. Bitte überprüfen Sie Ihre Netzwerkverbindung.",
|
||||
"Invalid Hardcover API token": "Ungültiges Hardcover-API-Token",
|
||||
"Disconnected from Hardcover": "Von Hardcover getrennt",
|
||||
"Hardcover Settings": "Hardcover-Einstellungen",
|
||||
"Connected to Hardcover": "Mit Hardcover verbunden",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Verbinden Sie Ihr Hardcover-Konto, um Lesefortschritt und Notizen zu synchronisieren.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Holen Sie Ihr API-Token von hardcover.app → Einstellungen → API.",
|
||||
"API Token": "API-Token",
|
||||
"Paste your Hardcover API token": "Fügen Sie Ihr Hardcover-API-Token ein",
|
||||
"Hardcover sync enabled for this book": "Hardcover-Synchronisierung für dieses Buch aktiviert",
|
||||
"Hardcover sync disabled for this book": "Hardcover-Synchronisierung für dieses Buch deaktiviert",
|
||||
"Hardcover Sync": "Hardcover-Synchronisierung",
|
||||
"Enable for This Book": "Für dieses Buch aktivieren",
|
||||
"Push Notes": "Notizen übertragen",
|
||||
"Enable Hardcover sync for this book first.": "Aktivieren Sie zuerst die Hardcover-Synchronisierung für dieses Buch.",
|
||||
"No annotations or excerpts to sync for this book.": "Keine Anmerkungen oder Auszüge zum Synchronisieren für dieses Buch.",
|
||||
"Configure Hardcover in Settings first.": "Konfigurieren Sie zuerst Hardcover in den Einstellungen.",
|
||||
"No new Hardcover note changes to sync.": "Keine neuen Hardcover-Notizänderungen zum Synchronisieren.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "Bindestriche trennen",
|
||||
"Apply Theme Colors to PDF": "Designfarben auf PDF anwenden",
|
||||
"Name": "Name",
|
||||
"Unavailable": "Nicht verfügbar",
|
||||
"Remove": "Entfernen",
|
||||
"Edit OPDS Catalog": "OPDS-Katalog bearbeiten",
|
||||
"Save Changes": "Änderungen speichern",
|
||||
"Use Book Layout": "Buchlayout verwenden"
|
||||
"Use Book Layout": "Buchlayout verwenden",
|
||||
"End of this section. Continue to the next.": "Ende dieses Abschnitts. Weiter zum nächsten.",
|
||||
"Auto-download": "Automatisch herunterladen",
|
||||
"Auto-download new items": "Neue Einträge automatisch herunterladen",
|
||||
"Automatically download new publications when the app syncs": "Neue Veröffentlichungen automatisch herunterladen, wenn die App synchronisiert",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} neuer Eintrag von OPDS heruntergeladen",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} neue Einträge von OPDS heruntergeladen",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Synchronisation von {{count}} OPDS-Katalog fehlgeschlagen",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Synchronisation von {{count}} OPDS-Katalogen fehlgeschlagen",
|
||||
"Last synced {{when}}": "Zuletzt synchronisiert {{when}}",
|
||||
"Failed downloads": "Fehlgeschlagene Downloads",
|
||||
"No failed downloads": "Keine fehlgeschlagenen Downloads",
|
||||
"Attempts: {{count}}_one": "Versuche: {{count}}",
|
||||
"Attempts: {{count}}_other": "Versuche: {{count}}",
|
||||
"Skip": "Überspringen",
|
||||
"Skip all": "Alle überspringen",
|
||||
"Retry all": "Alle erneut versuchen",
|
||||
"{{count}} failed_one": "{{count}} fehlgeschlagen",
|
||||
"{{count}} failed_other": "{{count}} fehlgeschlagen",
|
||||
"(none)": "(keine)",
|
||||
"Identifiers": "Bezeichner",
|
||||
"Read (Stream)": "Lesen (Stream)",
|
||||
"Failed to start stream": "Stream konnte nicht gestartet werden",
|
||||
"No dictionaries enabled": "Keine Wörterbücher aktiviert",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Aktiviere ein Wörterbuch unter Einstellungen → Sprache → Wörterbücher.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Zum Neuanordnen ziehen",
|
||||
"Built-in": "Integriert",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Bundle fehlt auf diesem Gerät. Erneut importieren, um es zu verwenden.",
|
||||
"This dictionary format is not supported.": "Dieses Wörterbuchformat wird nicht unterstützt.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} Wörterbuch importiert",
|
||||
"Imported {{count}} dictionary_other": "{{count}} Wörterbücher importiert",
|
||||
"Skipped incomplete bundles: {{names}}": "Unvollständige Bundles übersprungen: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Wörterbuch-Import fehlgeschlagen: {{message}}",
|
||||
"Dictionaries": "Wörterbücher",
|
||||
"Delete Dictionary": "Wörterbuch löschen",
|
||||
"Importing…": "Wird importiert …",
|
||||
"Import Dictionary": "Wörterbuch importieren",
|
||||
"No dictionaries available.": "Keine Wörterbücher verfügbar.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict-Bundles benötigen .ifo-, .idx- und .dict.dz-Dateien (.syn optional).",
|
||||
"Select all the bundle files together when importing.": "Wähle beim Import alle Bundle-Dateien zusammen aus.",
|
||||
"Manage Dictionaries": "Wörterbücher verwalten",
|
||||
"Select Dictionary Files": "Wörterbuchdateien auswählen",
|
||||
"Read on Wikipedia →": "Auf Wikipedia lesen →",
|
||||
"This link can't be opened": "Dieser Link kann nicht geöffnet werden",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Dem Annotationslink fehlen erforderliche Informationen. Der ursprüngliche Link wurde möglicherweise abgeschnitten.",
|
||||
"Go to Readest": "Zu Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Open-Source-E-Book-Reader für alle, auf jedem Gerät.",
|
||||
"Open in Readest": "In Readest öffnen",
|
||||
"If Readest didn't open automatically, choose an option below:": "Falls Readest nicht automatisch geöffnet wurde, wähle eine Option:",
|
||||
"Continue reading where you left off.": "Lies dort weiter, wo du aufgehört hast.",
|
||||
"Readest logo": "Readest-Logo",
|
||||
"Opening Readest...": "Readest wird geöffnet …",
|
||||
"Open in Readest app": "In der Readest-App öffnen",
|
||||
"Continue in browser": "Im Browser fortfahren",
|
||||
"Don't have Readest?": "Du hast Readest noch nicht?",
|
||||
"Book not in your library": "Buch nicht in deiner Bibliothek",
|
||||
"Share Book": "Buch teilen",
|
||||
"Could not create share link": "Freigabelink konnte nicht erstellt werden",
|
||||
"Link copied": "Link kopiert",
|
||||
"Could not copy link": "Link konnte nicht kopiert werden",
|
||||
"Share revoked": "Freigabe widerrufen",
|
||||
"Could not revoke share": "Freigabe konnte nicht widerrufen werden",
|
||||
"Uploading book…": "Buch wird hochgeladen…",
|
||||
"Generating…": "Wird erstellt…",
|
||||
"Generate share link": "Freigabelink erstellen",
|
||||
"Share URL": "Freigabelink",
|
||||
"Copy link": "Link kopieren",
|
||||
"Copied": "Kopiert",
|
||||
"Share via…": "Teilen über…",
|
||||
"Expires {{date}}": "Läuft ab am {{date}}",
|
||||
"Revoking…": "Wird widerrufen…",
|
||||
"Revoke share": "Freigabe widerrufen",
|
||||
"Sign in to share books": "Melde dich an, um Bücher zu teilen",
|
||||
"Expiring soon": "Läuft bald ab",
|
||||
"Missing share token": "Freigabe-Token fehlt",
|
||||
"Could not add to your library": "Konnte nicht zu deiner Bibliothek hinzugefügt werden",
|
||||
"This share link is no longer available": "Dieser Freigabelink ist nicht mehr verfügbar",
|
||||
"The original link may have expired or been revoked.": "Der ursprüngliche Link ist möglicherweise abgelaufen oder wurde widerrufen.",
|
||||
"Get Readest": "Readest holen",
|
||||
"Loading shared book…": "Geteiltes Buch wird geladen…",
|
||||
"Adding…": "Wird hinzugefügt…",
|
||||
"Add to my library": "Zu meiner Bibliothek hinzufügen",
|
||||
"Could not load your shares": "Deine Freigaben konnten nicht geladen werden",
|
||||
"Revoked": "Widerrufen",
|
||||
"Expired": "Abgelaufen",
|
||||
"Shared books": "Geteilte Bücher",
|
||||
"You haven't shared any books yet": "Du hast noch keine Bücher geteilt",
|
||||
"Open a book and tap Share to send it to a friend.": "Öffne ein Buch und tippe auf „Teilen“, um es an einen Freund zu senden.",
|
||||
"{{count}} active_one": "{{count}} aktiv",
|
||||
"{{count}} active_other": "{{count}} aktiv",
|
||||
"{{count}} downloads_one": "{{count}} Download",
|
||||
"{{count}} downloads_other": "{{count}} Downloads",
|
||||
"starts at saved page": "beginnt auf gespeicherter Seite",
|
||||
"More actions": "Weitere Aktionen",
|
||||
"Loading…": "Wird geladen…",
|
||||
"Load more": "Mehr laden",
|
||||
"Could not load shared book": "Geteiltes Buch konnte nicht geladen werden",
|
||||
"The share link is missing required information.": "Dem Freigabelink fehlen erforderliche Informationen.",
|
||||
"Please check your connection and try again.": "Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.",
|
||||
"Sign in to import shared books": "Melde dich an, um geteilte Bücher zu importieren",
|
||||
"Already in your library": "Bereits in deiner Bibliothek",
|
||||
"Added to your library": "Zu deiner Bibliothek hinzugefügt",
|
||||
"Could not import shared book": "Geteiltes Buch konnte nicht importiert werden",
|
||||
"Manage Shared Links": "Freigabelinks verwalten",
|
||||
"Expires in": "Läuft ab in",
|
||||
"{{count}} days_one": "1 Tag",
|
||||
"{{count}} days_other": "{{count}} Tage",
|
||||
"Expires in {{count}} days_one": "Läuft in 1 Tag ab",
|
||||
"Expires in {{count}} days_other": "Läuft in {{count}} Tagen ab",
|
||||
"Expires in {{count}} hours_one": "Läuft in 1 Stunde ab",
|
||||
"Expires in {{count}} hours_other": "Läuft in {{count}} Stunden ab",
|
||||
"Open in app": "In der App öffnen",
|
||||
"Shared with you": "Mit dir geteilt",
|
||||
"Downloading… {{percent}}%": "Wird heruntergeladen… {{percent}}%",
|
||||
"Import progress": "Importfortschritt",
|
||||
"Share reading progress": "Lesefortschritt teilen",
|
||||
"Includes your reading progress": "Enthält deinen Lesefortschritt",
|
||||
"Synced {{time}}": "Synchronisiert {{time}}",
|
||||
"Sync Info": "Synchronisierungs-Info",
|
||||
"Last Synced": "Zuletzt synchronisiert",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT-Bundles benötigen eine .index-Datei und eine .dict.dz-Datei.",
|
||||
"Slob bundles need a .slob file.": "Slob-Bundles benötigen eine .slob-Datei.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL-Vorlage muss mit http(s):// beginnen und %WORD% enthalten.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Websuche hinzufügen",
|
||||
"Edit Web Search": "Websuche bearbeiten",
|
||||
"e.g. Google": "z. B. Google",
|
||||
"URL Template": "URL-Vorlage",
|
||||
"Use %WORD% where the looked-up word should appear.": "Verwenden Sie %WORD%, wo das gesuchte Wort erscheinen soll.",
|
||||
"Open the search result in your browser:": "Öffne das Suchergebnis in deinem Browser:",
|
||||
"Open in {{name}}": "In {{name}} öffnen",
|
||||
"Book Fingerprint": "Buch-Fingerabdruck",
|
||||
"Search the web": "Im Web suchen",
|
||||
"App deeplink (readest://)": "App-Deeplink (readest://)",
|
||||
"Universal web link (https://)": "Universeller Weblink (https://)",
|
||||
"Name cannot be empty.": "Name darf nicht leer sein.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} bestehendes Wörterbuch ersetzt",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} bestehende Wörterbücher ersetzt",
|
||||
"Cancel Edit": "Bearbeiten abbrechen",
|
||||
"Edit Dictionary": "Wörterbuch bearbeiten",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict-Bundles verwenden .mdx-Dateien; begleitende .mdd- und .css-Dateien sind optional.",
|
||||
"Dictionary name": "Wörterbuchname",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Diese Audio kann hier nicht abgespielt werden — das Wörterbuch verwendet ein veraltetes Format. Probieren Sie ein Wörterbuch mit Opus-, MP3- oder WAV-Audio.",
|
||||
"File uploaded: {{title}}": "Datei hochgeladen: {{title}}",
|
||||
"File downloaded: {{title}}": "Datei heruntergeladen: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Cloud-Kopie der Datei gelöscht: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Fehler beim Hochladen der Datei: {{title}}",
|
||||
"Failed to download file: {{title}}": "Fehler beim Herunterladen der Datei: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Fehler beim Löschen der Cloud-Kopie der Datei: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% verbraucht",
|
||||
"Set PIN…": "PIN festlegen…",
|
||||
"Require a 4-digit PIN to open Readest": "Eine 4-stellige PIN zum Öffnen von Readest verlangen",
|
||||
"Change PIN…": "PIN ändern…",
|
||||
"Disable PIN…": "PIN deaktivieren…",
|
||||
"Sync passphrase ready": "Sync-Passphrase bereit",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Dies löscht dauerhaft die verschlüsselten Anmeldedaten, die wir auf jedem Gerät synchronisieren (z. B. OPDS-Katalog-Passwörter). Lokale Kopien bleiben erhalten. Sie müssen die Sync-Passphrase erneut eingeben oder eine neue festlegen. Fortfahren?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Sync-Passphrase vergessen — alle verschlüsselten Felder wurden gelöscht",
|
||||
"Sync passphrase": "Sync-Passphrase",
|
||||
"Set passphrase": "Passphrase festlegen",
|
||||
"Forgot passphrase": "Passphrase vergessen",
|
||||
"Incorrect PIN": "Falsche PIN",
|
||||
"App locked": "App gesperrt",
|
||||
"Enter your PIN": "PIN eingeben",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest ist gesperrt. Geben Sie Ihre 4-stellige PIN ein, um fortzufahren.",
|
||||
"PIN code": "PIN-Code",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Wenn Sie Ihre PIN vergessen, sperren Sie sich von diesem Gerät aus. Sie müssen die App-Daten löschen, um sie zurückzusetzen.",
|
||||
"Passphrase must be at least 8 characters": "Die Passphrase muss mindestens 8 Zeichen lang sein",
|
||||
"Passphrases do not match": "Die Passphrasen stimmen nicht überein",
|
||||
"Set sync passphrase": "Sync-Passphrase festlegen",
|
||||
"Enter sync passphrase": "Sync-Passphrase eingeben",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Eine Sync-Passphrase verschlüsselt Ihre sensiblen Felder (wie OPDS-Katalog-Anmeldedaten), bevor sie synchronisiert werden. Wir sehen diese Passphrase nie. Wählen Sie etwas Einprägsames — ohne sie ist keine Wiederherstellung möglich.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Geben Sie die Sync-Passphrase ein, die Sie auf einem anderen Gerät festgelegt haben, um Ihre synchronisierten Anmeldedaten zu entschlüsseln.",
|
||||
"Confirm passphrase": "Passphrase bestätigen",
|
||||
"Unlock": "Entsperren",
|
||||
"Set PIN": "PIN festlegen",
|
||||
"Change PIN": "PIN ändern",
|
||||
"Disable PIN": "PIN deaktivieren",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Geben Sie Ihre aktuelle PIN ein und wählen Sie dann eine neue 4-stellige PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Geben Sie Ihre aktuelle PIN ein, um die App-Sperre zu deaktivieren.",
|
||||
"PIN must be {{length}} digits": "Die PIN muss aus {{length}} Ziffern bestehen",
|
||||
"PINs do not match": "PINs stimmen nicht überein",
|
||||
"Current PIN": "Aktuelle PIN",
|
||||
"New PIN": "Neue PIN",
|
||||
"Confirm new PIN": "Neue PIN bestätigen",
|
||||
"Manage Sync": "Synchronisierung verwalten",
|
||||
"Imported book files and library metadata": "Importierte Buchdateien und Bibliotheksmetadaten",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Zuletzt gelesene Position, Lesezeichen und buchspezifische Einstellungen",
|
||||
"Highlights and notes": "Hervorhebungen und Notizen",
|
||||
"Fonts": "Schriftarten",
|
||||
"Custom font files": "Benutzerdefinierte Schriftdateien",
|
||||
"Backgrounds": "Hintergründe",
|
||||
"Custom background textures": "Benutzerdefinierte Hintergrundtexturen",
|
||||
"OPDS catalogs": "OPDS-Kataloge",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Gespeicherte Katalog-URLs und (verschlüsselte) Anmeldedaten",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Falsche Sync-Passphrase — synchronisierte Anmeldedaten konnten nicht entschlüsselt werden",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Sync-Passphrase auf dem Server wurde zurückgesetzt. Anmeldedaten werden mit der neuen Passphrase neu verschlüsselt…",
|
||||
"Failed to decrypt synced credentials": "Synchronisierte Anmeldedaten konnten nicht entschlüsselt werden",
|
||||
"Imported dictionary bundles and settings": "Importierte Wörterbuch-Pakete und Einstellungen",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Lege fest, was zwischen deinen Geräten synchronisiert wird. Beim Deaktivieren einer Kategorie sendet und empfängt dieses Gerät keine Einträge dieser Art mehr. Bereits auf dem Server vorhandene Daten bleiben unverändert, beim erneuten Aktivieren wird dort fortgesetzt, wo du aufgehört hast.",
|
||||
"Data Sync": "Datensynchronisierung",
|
||||
"Manage Fonts": "Schriftarten verwalten",
|
||||
"App settings": "App-Einstellungen",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Design, Hervorhebungsfarben, Integrationen (KOSync, Readwise, Hardcover) und Wörterbuchreihenfolge",
|
||||
"Required while Dictionaries sync is enabled": "Erforderlich, solange die Synchronisierung von Wörterbüchern aktiviert ist",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Zurückgesetzt in {{hours}} Std. {{minutes}} Min.",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Wählen Sie eine 4-stellige PIN. Sie müssen sie jedes Mal eingeben, wenn Sie Readest öffnen. Eine vergessene PIN kann nicht wiederhergestellt werden. Das Löschen der App-Daten ist die einzige Möglichkeit, sie zurückzusetzen.",
|
||||
"Credentials": "Anmeldedaten",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, Benutzernamen und Passwörter für OPDS, KOReader, Hardcover und Readwise. Wenn deaktiviert, bleiben die Anmeldedaten nur auf diesem Gerät und werden nie hochgeladen.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Sensible synchronisierte Felder werden vor dem Hochladen verschlüsselt. Lege jetzt oder später eine Passphrase fest, wenn die Verschlüsselung benötigt wird.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "In diesem Konto gespeichert. Du wirst beim Entschlüsseln von Anmeldedaten danach gefragt.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Der Lesefortschritt auf diesem Gerät weicht von „{{deviceName}}“ ab.",
|
||||
"This device": "Dieses Gerät",
|
||||
"Red": "Rot",
|
||||
"Yellow": "Gelb",
|
||||
"Green": "Grün",
|
||||
"Blue": "Blau",
|
||||
"Violet": "Violett",
|
||||
"Edit color": "Farbe bearbeiten",
|
||||
"Add custom color": "Benutzerdefinierte Farbe hinzufügen",
|
||||
"Add label": "Beschriftung hinzufügen",
|
||||
"Choose color": "Farbe auswählen",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Mit Hardcover verbunden. Zuletzt synchronisiert {{time}}.",
|
||||
"Integrations": "Integrationen",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Mit Readwise verbunden. Zuletzt synchronisiert {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Bücher aus Online-Katalogen durchsuchen und herunterladen.",
|
||||
"Connected as {{user}}": "Verbunden als {{user}}",
|
||||
"Not connected": "Nicht verbunden",
|
||||
"{{count}} catalog_one": "{{count}} Katalog",
|
||||
"{{count}} catalog_other": "{{count}} Kataloge",
|
||||
"No catalogs": "Keine Kataloge",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Verbinden Sie Readest mit externen Diensten für Synchronisierung, Markierungen und Kataloge.",
|
||||
"Reading Sync": "Lese-Synchronisierung",
|
||||
"Content Sources": "Inhaltsquellen",
|
||||
"Scroll tabs": "Tabs scrollen",
|
||||
"Catalog actions": "Katalogaktionen",
|
||||
"File Content": "Dateiinhalt",
|
||||
"Start your library": "Starten Sie Ihre Bibliothek",
|
||||
"Pick a book from your device to add it to your library.": "Wählen Sie ein Buch von Ihrem Gerät, um es Ihrer Bibliothek hinzuzufügen.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Ziehen Sie ein Buch an eine beliebige Stelle dieses Fensters oder wählen Sie eines von Ihrem Computer aus.",
|
||||
"Sign in to sync your library": "Melden Sie sich an, um Ihre Bibliothek zu synchronisieren"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Ενημερώθηκε",
|
||||
"Version {{version}}": "Έκδοση {{version}}",
|
||||
"Vertical Direction": "Κάθετη κατεύθυνση",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Καλώς ήρθατε στη βιβλιοθήκη σας. Μπορείτε να εισάγετε τα βιβλία σας εδώ και να τα διαβάσετε οποιαδήποτε στιγμή.",
|
||||
"Wikipedia": "Βικιπαίδεια",
|
||||
"Writing Mode": "Λειτουργία γραφής",
|
||||
"Your Library": "Η βιβλιοθήκη σας",
|
||||
@@ -299,7 +298,6 @@
|
||||
"No notes match your search": "Καμία σημείωση δεν βρέθηκε",
|
||||
"Search notes and excerpts...": "Αναζήτηση σημειώσεων...",
|
||||
"Sign in to Sync": "Σύνδεση για συγχρονισμό",
|
||||
"Synced at {{time}}": "Συγχρονίστηκε στις {{time}}",
|
||||
"Never synced": "Ποτέ δεν συγχρονίστηκε",
|
||||
"Show Remaining Time": "Εμφάνιση υπολειπόμενου χρόνου",
|
||||
"{{time}} min left in chapter": "{{time}} λεπτά απομένουν στο κεφάλαιο",
|
||||
@@ -461,14 +459,12 @@
|
||||
"Remove from Cloud Only": "Αφαίρεση μόνο από το Cloud",
|
||||
"Remove from Device Only": "Αφαίρεση μόνο από το Device",
|
||||
"Disconnected": "Αποσυνδεδεμένο",
|
||||
"KOReader Sync Settings": "Ρυθμίσεις συγχρονισμού KOReader",
|
||||
"Sync Strategy": "Στρατηγική συγχρονισμού",
|
||||
"Ask on conflict": "Ρώτησε σε περίπτωση σύγκρουσης",
|
||||
"Always use latest": "Χρησιμοποίησε πάντα την τελευταία έκδοση",
|
||||
"Send changes only": "Αποστολή μόνο αλλαγών",
|
||||
"Receive changes only": "Λήψη μόνο αλλαγών",
|
||||
"Checksum Method": "Μέθοδος ελέγχου",
|
||||
"File Content (recommended)": "Περιεχόμενο αρχείου (συνιστάται)",
|
||||
"File Name": "Όνομα αρχείου",
|
||||
"Device Name": "Όνομα συσκευής",
|
||||
"Connect to your KOReader Sync server.": "Συνδεθείτε στον διακομιστή συγχρονισμού KOReader.",
|
||||
@@ -479,10 +475,7 @@
|
||||
"Connect": "Σύνδεση",
|
||||
"KOReader Sync": "Συγχρονισμός KOReader",
|
||||
"Sync Conflict": "Σύγκρουση συγχρονισμού",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Συγχρονίστε την πρόοδο ανάγνωσης από το \"{{deviceName}}\";",
|
||||
"another device": "άλλη συσκευή",
|
||||
"Local Progress": "Τοπική πρόοδος",
|
||||
"Remote Progress": "Απομακρυσμένη πρόοδος",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Σελίδα {{page}} από {{total}} ({{percentage}}%)",
|
||||
"Current position": "Τρέχουσα θέση",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Περίπου σελίδα {{page}} από {{total}} ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "Διαγραμμένο",
|
||||
"Squiggly": "Κυματιστό",
|
||||
"Outline": "Περίγραμμα",
|
||||
"Save Current Color": "Αποθήκευση τρέχουσας χρώματος",
|
||||
"Quick Colors": "Γρήγορα χρώματα",
|
||||
"Highlighter": "Υπογραμμιστής",
|
||||
"Save Book Cover": "Αποθήκευση εξωφύλλου βιβλίου",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "Σχολιασμός κειμένου μετά την επιλογή",
|
||||
"Search text after selection": "Αναζήτηση κειμένου μετά την επιλογή",
|
||||
"Look up text in dictionary after selection": "Αναζήτηση κειμένου στο λεξικό μετά την επιλογή",
|
||||
"Look up text in Wikipedia after selection": "Αναζήτηση κειμένου στη Wikipedia μετά την επιλογή",
|
||||
"Translate text after selection": "Μετάφραση κειμένου μετά την επιλογή",
|
||||
"Read text aloud after selection": "Ανάγνωση κειμένου μετά την επιλογή",
|
||||
"Proofread text after selection": "Διόρθωση κειμένου μετά την επιλογή",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "Αποτυχία εξαγωγής του βιβλίου.",
|
||||
"Export Book": "Εξαγωγή βιβλίου",
|
||||
"Whole word:": "Ολόκληρη λέξη:",
|
||||
"Error": "Σφάλμα",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Αδυναμία φόρτωσης του άρθρου. Δοκιμάστε να αναζητήσετε απευθείας στο {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Αδυναμία φόρτωσης της λέξης. Δοκιμάστε να αναζητήσετε απευθείας στο {{link}}.",
|
||||
"Date Published": "Ημερομηνία δημοσίευσης",
|
||||
"Only for TTS:": "Μόνο για TTS:",
|
||||
"Uploaded": "Μεταφορτώθηκε",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "Μη έγκυρο διακριτικό πρόσβασης Readwise",
|
||||
"Disconnected from Readwise": "Αποσυνδέθηκε από το Readwise",
|
||||
"Never": "Ποτέ",
|
||||
"Readwise Settings": "Ρυθμίσεις Readwise",
|
||||
"Connected to Readwise": "Συνδέθηκε στο Readwise",
|
||||
"Last synced: {{time}}": "Τελευταίος συγχρονισμός: {{time}}",
|
||||
"Sync Enabled": "Ο συγχρονισμός ενεργοποιήθηκε",
|
||||
"Disconnect": "Αποσύνδεση",
|
||||
"Connect your Readwise account to sync highlights.": "Συνδέστε τον λογαριασμό σας Readwise για να συγχρονίσετε τις επισημάνσεις.",
|
||||
"Get your access token at": "Αποκτήστε το διακριτικό πρόσβασής σας στο",
|
||||
"Access Token": "Διακριτικό πρόσβασης",
|
||||
"Paste your Readwise access token": "Επικολλήστε το διακριτικό πρόσβασης Readwise",
|
||||
"Config": "Ρύθμιση παραμέτρων",
|
||||
"Readwise Sync": "Συγχρονισμός Readwise",
|
||||
"Push Highlights": "Προώθηση επισημάνσεων",
|
||||
"Highlights synced to Readwise": "Οι επισημάνσεις συγχρονίστηκαν στο Readwise",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "Αντιγραφή επιλογής",
|
||||
"Translate Selection": "Μετάφραση επιλογής",
|
||||
"Dictionary Lookup": "Αναζήτηση στο λεξικό",
|
||||
"Wikipedia Lookup": "Αναζήτηση στη Wikipedia",
|
||||
"Read Aloud Selection": "Ανάγνωση επιλογής",
|
||||
"Proofread Selection": "Διόρθωση επιλογής",
|
||||
"Open Settings": "Άνοιγμα ρυθμίσεων",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "Σύρετε για αναζήτηση",
|
||||
"Punctuation Delay": "Καθυστέρηση στίξης",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Επιβεβαιώστε ότι αυτή η σύνδεση OPDS θα δρομολογηθεί μέσω των διακομιστών Readest στην εφαρμογή ιστού πριν συνεχίσετε.",
|
||||
"Custom Headers": "Προσαρμοσμένες κεφαλίδες",
|
||||
"Custom Headers (optional)": "Προσαρμοσμένες κεφαλίδες (προαιρετικό)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Προσθέστε μία κεφαλίδα ανά γραμμή χρησιμοποιώντας \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Κατανοώ ότι αυτή η σύνδεση OPDS θα δρομολογηθεί μέσω των διακομιστών Readest στην εφαρμογή ιστού. Αν δεν εμπιστεύομαι τo Readest με αυτά τα διαπιστευτήρια ή τις κεφαλίδες, θα πρέπει να χρησιμοποιήσω την εγγενή εφαρμογή.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Αδυναμία σύνδεσης στο Hardcover. Ελέγξτε τη σύνδεση δικτύου σας.",
|
||||
"Invalid Hardcover API token": "Μη έγκυρο Hardcover API token",
|
||||
"Disconnected from Hardcover": "Αποσυνδέθηκε από το Hardcover",
|
||||
"Hardcover Settings": "Ρυθμίσεις Hardcover",
|
||||
"Connected to Hardcover": "Συνδεδεμένο στο Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Συνδέστε τον λογαριασμό σας Hardcover για συγχρονισμό προόδου ανάγνωσης και σημειώσεων.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Λάβετε το API token σας από hardcover.app → Ρυθμίσεις → API.",
|
||||
"API Token": "API Token",
|
||||
"Paste your Hardcover API token": "Επικολλήστε το Hardcover API token σας",
|
||||
"Hardcover sync enabled for this book": "Ο συγχρονισμός Hardcover ενεργοποιήθηκε για αυτό το βιβλίο",
|
||||
"Hardcover sync disabled for this book": "Ο συγχρονισμός Hardcover απενεργοποιήθηκε για αυτό το βιβλίο",
|
||||
"Hardcover Sync": "Συγχρονισμός Hardcover",
|
||||
"Enable for This Book": "Ενεργοποίηση για αυτό το βιβλίο",
|
||||
"Push Notes": "Αποστολή σημειώσεων",
|
||||
"Enable Hardcover sync for this book first.": "Ενεργοποιήστε πρώτα τον συγχρονισμό Hardcover για αυτό το βιβλίο.",
|
||||
"No annotations or excerpts to sync for this book.": "Δεν υπάρχουν σχολιασμοί ή αποσπάσματα για συγχρονισμό σε αυτό το βιβλίο.",
|
||||
"Configure Hardcover in Settings first.": "Ρυθμίστε πρώτα το Hardcover στις Ρυθμίσεις.",
|
||||
"No new Hardcover note changes to sync.": "Δεν υπάρχουν νέες αλλαγές σημειώσεων Hardcover για συγχρονισμό.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "Διαχωρισμός παύλων",
|
||||
"Apply Theme Colors to PDF": "Εφαρμογή χρωμάτων θέματος σε PDF",
|
||||
"Name": "Όνομα",
|
||||
"Unavailable": "Μη διαθέσιμο",
|
||||
"Remove": "Αφαίρεση",
|
||||
"Edit OPDS Catalog": "Επεξεργασία καταλόγου OPDS",
|
||||
"Save Changes": "Αποθήκευση αλλαγών",
|
||||
"Use Book Layout": "Χρήση διάταξης βιβλίου"
|
||||
"Use Book Layout": "Χρήση διάταξης βιβλίου",
|
||||
"End of this section. Continue to the next.": "Τέλος αυτής της ενότητας. Συνεχίστε στην επόμενη.",
|
||||
"Auto-download": "Αυτόματη λήψη",
|
||||
"Auto-download new items": "Αυτόματη λήψη νέων στοιχείων",
|
||||
"Automatically download new publications when the app syncs": "Αυτόματη λήψη νέων δημοσιεύσεων κατά τον συγχρονισμό της εφαρμογής",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "Λήφθηκε {{count}} νέο στοιχείο από OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Λήφθηκαν {{count}} νέα στοιχεία από OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Αποτυχία συγχρονισμού {{count}} καταλόγου OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Αποτυχία συγχρονισμού {{count}} καταλόγων OPDS",
|
||||
"Last synced {{when}}": "Τελευταίος συγχρονισμός {{when}}",
|
||||
"Failed downloads": "Αποτυχημένες λήψεις",
|
||||
"No failed downloads": "Δεν υπάρχουν αποτυχημένες λήψεις",
|
||||
"Attempts: {{count}}_one": "Προσπάθειες: {{count}}",
|
||||
"Attempts: {{count}}_other": "Προσπάθειες: {{count}}",
|
||||
"Skip": "Παράλειψη",
|
||||
"Skip all": "Παράλειψη όλων",
|
||||
"Retry all": "Επανάληψη όλων",
|
||||
"{{count}} failed_one": "{{count}} απέτυχε",
|
||||
"{{count}} failed_other": "{{count}} απέτυχαν",
|
||||
"(none)": "(κανένα)",
|
||||
"Identifiers": "Αναγνωριστικά",
|
||||
"Read (Stream)": "Ανάγνωση (Ροή)",
|
||||
"Failed to start stream": "Αποτυχία έναρξης ροής",
|
||||
"No dictionaries enabled": "Δεν είναι ενεργοποιημένο κανένα λεξικό",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Ενεργοποιήστε ένα λεξικό από Ρυθμίσεις → Γλώσσα → Λεξικά.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Σύρετε για επαναταξινόμηση",
|
||||
"Built-in": "Ενσωματωμένο",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Το πακέτο λείπει από αυτή τη συσκευή. Επανεισαγάγετέ το για χρήση.",
|
||||
"This dictionary format is not supported.": "Αυτή η μορφή λεξικού δεν υποστηρίζεται.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "Εισήχθη {{count}} λεξικό",
|
||||
"Imported {{count}} dictionary_other": "Εισήχθησαν {{count}} λεξικά",
|
||||
"Skipped incomplete bundles: {{names}}": "Παραλείφθηκαν ημιτελή πακέτα: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Αποτυχία εισαγωγής λεξικού: {{message}}",
|
||||
"Dictionaries": "Λεξικά",
|
||||
"Delete Dictionary": "Διαγραφή λεξικού",
|
||||
"Importing…": "Εισαγωγή…",
|
||||
"Import Dictionary": "Εισαγωγή λεξικού",
|
||||
"No dictionaries available.": "Δεν υπάρχουν διαθέσιμα λεξικά.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Τα πακέτα StarDict χρειάζονται αρχεία .ifo, .idx και .dict.dz (το .syn είναι προαιρετικό).",
|
||||
"Select all the bundle files together when importing.": "Επιλέξτε όλα τα αρχεία του πακέτου μαζί κατά την εισαγωγή.",
|
||||
"Manage Dictionaries": "Διαχείριση λεξικών",
|
||||
"Select Dictionary Files": "Επιλογή αρχείων λεξικού",
|
||||
"Read on Wikipedia →": "Διάβασέ το στη Wikipedia →",
|
||||
"This link can't be opened": "Δεν είναι δυνατό το άνοιγμα αυτού του συνδέσμου",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Από τον σύνδεσμο σχολιασμού λείπουν οι απαιτούμενες πληροφορίες. Ο αρχικός σύνδεσμος ενδέχεται να έχει αποκοπεί.",
|
||||
"Go to Readest": "Μετάβαση στο Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Αναγνώστης ηλεκτρονικών βιβλίων ανοικτού κώδικα για όλους, σε κάθε συσκευή.",
|
||||
"Open in Readest": "Άνοιγμα στο Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Αν το Readest δεν άνοιξε αυτόματα, επιλέξτε μία από τις παρακάτω επιλογές:",
|
||||
"Continue reading where you left off.": "Συνεχίστε να διαβάζετε από εκεί που σταματήσατε.",
|
||||
"Readest logo": "Λογότυπο Readest",
|
||||
"Opening Readest...": "Γίνεται άνοιγμα του Readest…",
|
||||
"Open in Readest app": "Άνοιγμα στην εφαρμογή Readest",
|
||||
"Continue in browser": "Συνέχεια στο πρόγραμμα περιήγησης",
|
||||
"Don't have Readest?": "Δεν έχετε το Readest;",
|
||||
"Book not in your library": "Το βιβλίο δεν βρίσκεται στη βιβλιοθήκη σας",
|
||||
"Share Book": "Κοινή χρήση βιβλίου",
|
||||
"Could not create share link": "Δεν ήταν δυνατή η δημιουργία συνδέσμου κοινής χρήσης",
|
||||
"Link copied": "Ο σύνδεσμος αντιγράφηκε",
|
||||
"Could not copy link": "Δεν ήταν δυνατή η αντιγραφή του συνδέσμου",
|
||||
"Share revoked": "Η κοινή χρήση ανακλήθηκε",
|
||||
"Could not revoke share": "Δεν ήταν δυνατή η ανάκληση της κοινής χρήσης",
|
||||
"Uploading book…": "Μεταφόρτωση βιβλίου…",
|
||||
"Generating…": "Δημιουργία…",
|
||||
"Generate share link": "Δημιουργία συνδέσμου κοινής χρήσης",
|
||||
"Share URL": "URL κοινής χρήσης",
|
||||
"Copy link": "Αντιγραφή συνδέσμου",
|
||||
"Copied": "Αντιγράφηκε",
|
||||
"Share via…": "Κοινή χρήση μέσω…",
|
||||
"Expires {{date}}": "Λήγει στις {{date}}",
|
||||
"Revoking…": "Ανάκληση…",
|
||||
"Revoke share": "Ανάκληση κοινής χρήσης",
|
||||
"Sign in to share books": "Συνδεθείτε για να μοιραστείτε βιβλία",
|
||||
"Expiring soon": "Λήγει σύντομα",
|
||||
"Missing share token": "Λείπει το διακριτικό κοινής χρήσης",
|
||||
"Could not add to your library": "Δεν ήταν δυνατή η προσθήκη στη βιβλιοθήκη σας",
|
||||
"This share link is no longer available": "Αυτός ο σύνδεσμος κοινής χρήσης δεν είναι πλέον διαθέσιμος",
|
||||
"The original link may have expired or been revoked.": "Ο αρχικός σύνδεσμος ενδέχεται να έχει λήξει ή να έχει ανακληθεί.",
|
||||
"Get Readest": "Αποκτήστε το Readest",
|
||||
"Loading shared book…": "Φόρτωση κοινόχρηστου βιβλίου…",
|
||||
"Adding…": "Προσθήκη…",
|
||||
"Add to my library": "Προσθήκη στη βιβλιοθήκη μου",
|
||||
"Could not load your shares": "Δεν ήταν δυνατή η φόρτωση των κοινοποιήσεών σας",
|
||||
"Revoked": "Ανακλήθηκε",
|
||||
"Expired": "Έληξε",
|
||||
"Shared books": "Κοινόχρηστα βιβλία",
|
||||
"You haven't shared any books yet": "Δεν έχετε μοιραστεί κανένα βιβλίο ακόμη",
|
||||
"Open a book and tap Share to send it to a friend.": "Ανοίξτε ένα βιβλίο και πατήστε «Κοινή χρήση» για να το στείλετε σε έναν φίλο.",
|
||||
"{{count}} active_one": "{{count}} ενεργό",
|
||||
"{{count}} active_other": "{{count}} ενεργά",
|
||||
"{{count}} downloads_one": "{{count}} λήψη",
|
||||
"{{count}} downloads_other": "{{count}} λήψεις",
|
||||
"starts at saved page": "ξεκινά από την αποθηκευμένη σελίδα",
|
||||
"More actions": "Περισσότερες ενέργειες",
|
||||
"Loading…": "Φόρτωση…",
|
||||
"Load more": "Φόρτωση περισσότερων",
|
||||
"Could not load shared book": "Δεν ήταν δυνατή η φόρτωση του κοινόχρηστου βιβλίου",
|
||||
"The share link is missing required information.": "Από τον σύνδεσμο κοινής χρήσης λείπουν απαιτούμενες πληροφορίες.",
|
||||
"Please check your connection and try again.": "Ελέγξτε τη σύνδεσή σας και δοκιμάστε ξανά.",
|
||||
"Sign in to import shared books": "Συνδεθείτε για να εισαγάγετε κοινόχρηστα βιβλία",
|
||||
"Already in your library": "Υπάρχει ήδη στη βιβλιοθήκη σας",
|
||||
"Added to your library": "Προστέθηκε στη βιβλιοθήκη σας",
|
||||
"Could not import shared book": "Δεν ήταν δυνατή η εισαγωγή του κοινόχρηστου βιβλίου",
|
||||
"Manage Shared Links": "Διαχείριση συνδέσμων κοινής χρήσης",
|
||||
"Expires in": "Λήγει σε",
|
||||
"{{count}} days_one": "1 ημέρα",
|
||||
"{{count}} days_other": "{{count}} ημέρες",
|
||||
"Expires in {{count}} days_one": "Λήγει σε 1 ημέρα",
|
||||
"Expires in {{count}} days_other": "Λήγει σε {{count}} ημέρες",
|
||||
"Expires in {{count}} hours_one": "Λήγει σε 1 ώρα",
|
||||
"Expires in {{count}} hours_other": "Λήγει σε {{count}} ώρες",
|
||||
"Open in app": "Άνοιγμα στην εφαρμογή",
|
||||
"Shared with you": "Κοινοποιήθηκε σε εσάς",
|
||||
"Downloading… {{percent}}%": "Λήψη… {{percent}}%",
|
||||
"Import progress": "Πρόοδος εισαγωγής",
|
||||
"Share reading progress": "Κοινή χρήση προόδου ανάγνωσης",
|
||||
"Includes your reading progress": "Περιλαμβάνει την πρόοδο ανάγνωσής σας",
|
||||
"Synced {{time}}": "Συγχρονίστηκε {{time}}",
|
||||
"Sync Info": "Πληροφορίες συγχρονισμού",
|
||||
"Last Synced": "Τελευταίος συγχρονισμός",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Τα πακέτα DICT χρειάζονται ένα αρχείο .index και ένα αρχείο .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Τα πακέτα Slob χρειάζονται ένα αρχείο .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Το πρότυπο URL πρέπει να ξεκινά με http(s):// και να περιέχει %WORD%.",
|
||||
"Web": "Διαδίκτυο",
|
||||
"Add Web Search": "Προσθήκη αναζήτησης ιστού",
|
||||
"Edit Web Search": "Επεξεργασία αναζήτησης ιστού",
|
||||
"e.g. Google": "π.χ. Google",
|
||||
"URL Template": "Πρότυπο URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Χρησιμοποιήστε %WORD% όπου πρέπει να εμφανίζεται η λέξη αναζήτησης.",
|
||||
"Open the search result in your browser:": "Ανοίξτε το αποτέλεσμα αναζήτησης στο πρόγραμμα περιήγησής σας:",
|
||||
"Open in {{name}}": "Άνοιγμα σε {{name}}",
|
||||
"Book Fingerprint": "Δακτυλικό αποτύπωμα βιβλίου",
|
||||
"Search the web": "Αναζήτηση στον ιστό",
|
||||
"App deeplink (readest://)": "Σύνδεσμος εφαρμογής (readest://)",
|
||||
"Universal web link (https://)": "Γενικός σύνδεσμος ιστού (https://)",
|
||||
"Name cannot be empty.": "Το όνομα δεν μπορεί να είναι κενό.",
|
||||
"Replaced {{count}} existing dictionary_one": "Αντικαταστάθηκε {{count}} υπάρχον λεξικό",
|
||||
"Replaced {{count}} existing dictionary_other": "Αντικαταστάθηκαν {{count}} υπάρχοντα λεξικά",
|
||||
"Cancel Edit": "Ακύρωση επεξεργασίας",
|
||||
"Edit Dictionary": "Επεξεργασία λεξικού",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Τα πακέτα MDict χρησιμοποιούν αρχεία .mdx· τα συνοδευτικά αρχεία .mdd και .css είναι προαιρετικά.",
|
||||
"Dictionary name": "Όνομα λεξικού",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Αυτός ο ήχος δεν μπορεί να αναπαραχθεί εδώ — το λεξικό χρησιμοποιεί ξεπερασμένη μορφή. Δοκιμάστε ένα λεξικό με ήχο Opus, MP3 ή WAV.",
|
||||
"File uploaded: {{title}}": "Το αρχείο με τίτλο {{title}} ανέβηκε",
|
||||
"File downloaded: {{title}}": "Το αρχείο με τίτλο {{title}} κατέβηκε",
|
||||
"Deleted cloud copy of the file: {{title}}": "Διαγράφηκε το αντίγραφο του αρχείου: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Αποτυχία ανέβασμα αρχείου: {{title}}",
|
||||
"Failed to download file: {{title}}": "Αποτυχία λήψης αρχείου: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Αποτυχία διαγραφής του αντιγράφου του αρχείου: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% σε χρήση",
|
||||
"Set PIN…": "Ορισμός PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Απαιτείται 4ψήφιο PIN για το άνοιγμα του Readest",
|
||||
"Change PIN…": "Αλλαγή PIN…",
|
||||
"Disable PIN…": "Απενεργοποίηση PIN…",
|
||||
"Sync passphrase ready": "Η φράση πρόσβασης συγχρονισμού είναι έτοιμη",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Αυτό διαγράφει οριστικά τα κρυπτογραφημένα διαπιστευτήρια που συγχρονίζουμε (π.χ. κωδικούς καταλόγου OPDS) σε κάθε συσκευή. Τα τοπικά αντίγραφα διατηρούνται. Θα χρειαστεί να εισαγάγετε ξανά τη φράση πρόσβασης συγχρονισμού ή να ορίσετε μια νέα. Συνέχεια;",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Η φράση πρόσβασης συγχρονισμού ξεχάστηκε — όλα τα κρυπτογραφημένα πεδία διαγράφηκαν",
|
||||
"Sync passphrase": "Φράση πρόσβασης συγχρονισμού",
|
||||
"Set passphrase": "Ορισμός φράσης πρόσβασης",
|
||||
"Forgot passphrase": "Ξεχάσατε τη φράση πρόσβασης",
|
||||
"Incorrect PIN": "Λανθασμένο PIN",
|
||||
"App locked": "Η εφαρμογή είναι κλειδωμένη",
|
||||
"Enter your PIN": "Εισαγάγετε το PIN σας",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Το Readest είναι κλειδωμένο. Εισαγάγετε το 4ψήφιο PIN σας για να συνεχίσετε.",
|
||||
"PIN code": "Κωδικός PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Αν ξεχάσετε το PIN σας, θα κλειδωθείτε από αυτή τη συσκευή. Θα χρειαστεί να διαγράψετε τα δεδομένα της εφαρμογής για να το επαναφέρετε.",
|
||||
"Passphrase must be at least 8 characters": "Η φράση πρόσβασης πρέπει να έχει τουλάχιστον 8 χαρακτήρες",
|
||||
"Passphrases do not match": "Οι φράσεις πρόσβασης δεν ταιριάζουν",
|
||||
"Set sync passphrase": "Ορισμός φράσης πρόσβασης συγχρονισμού",
|
||||
"Enter sync passphrase": "Εισαγωγή φράσης πρόσβασης συγχρονισμού",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Μια φράση πρόσβασης συγχρονισμού κρυπτογραφεί τα ευαίσθητα πεδία σας (όπως διαπιστευτήρια καταλόγου OPDS) πριν συγχρονιστούν. Δεν βλέπουμε ποτέ αυτή τη φράση πρόσβασης. Επιλέξτε κάτι αξιομνημόνευτο — δεν υπάρχει ανάκτηση χωρίς αυτή.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Εισαγάγετε τη φράση πρόσβασης συγχρονισμού που ορίσατε σε άλλη συσκευή για να αποκρυπτογραφήσετε τα συγχρονισμένα διαπιστευτήριά σας.",
|
||||
"Confirm passphrase": "Επιβεβαίωση φράσης πρόσβασης",
|
||||
"Unlock": "Ξεκλείδωμα",
|
||||
"Set PIN": "Ορισμός PIN",
|
||||
"Change PIN": "Αλλαγή PIN",
|
||||
"Disable PIN": "Απενεργοποίηση PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Εισαγάγετε το τρέχον PIN σας και, στη συνέχεια, επιλέξτε ένα νέο 4ψήφιο PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Εισαγάγετε το τρέχον PIN σας για να απενεργοποιήσετε το κλείδωμα της εφαρμογής.",
|
||||
"PIN must be {{length}} digits": "Το PIN πρέπει να έχει {{length}} ψηφία",
|
||||
"PINs do not match": "Τα PIN δεν ταιριάζουν",
|
||||
"Current PIN": "Τρέχον PIN",
|
||||
"New PIN": "Νέο PIN",
|
||||
"Confirm new PIN": "Επιβεβαίωση νέου PIN",
|
||||
"Manage Sync": "Διαχείριση συγχρονισμού",
|
||||
"Imported book files and library metadata": "Εισηγμένα αρχεία βιβλίων και μεταδεδομένα βιβλιοθήκης",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Τελευταία θέση ανάγνωσης, σελιδοδείκτες και προτιμήσεις ανά βιβλίο",
|
||||
"Highlights and notes": "Επισημάνσεις και σημειώσεις",
|
||||
"Fonts": "Γραμματοσειρές",
|
||||
"Custom font files": "Προσαρμοσμένα αρχεία γραμματοσειρών",
|
||||
"Backgrounds": "Φόντα",
|
||||
"Custom background textures": "Προσαρμοσμένες υφές φόντου",
|
||||
"OPDS catalogs": "Κατάλογοι OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Αποθηκευμένες διευθύνσεις καταλόγων και (κρυπτογραφημένα) διαπιστευτήρια",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Λανθασμένη φράση πρόσβασης συγχρονισμού — δεν ήταν δυνατή η αποκρυπτογράφηση των συγχρονισμένων διαπιστευτηρίων",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Τα δεδομένα της φράσης πρόσβασης συγχρονισμού στον διακομιστή επαναφέρθηκαν. Επανακρυπτογράφηση των διαπιστευτηρίων σας με τη νέα φράση πρόσβασης…",
|
||||
"Failed to decrypt synced credentials": "Αποτυχία αποκρυπτογράφησης των συγχρονισμένων διαπιστευτηρίων",
|
||||
"Imported dictionary bundles and settings": "Εισηγμένα πακέτα λεξικών και ρυθμίσεις",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Επιλέξτε τι συγχρονίζεται μεταξύ των συσκευών σας. Η απενεργοποίηση μιας κατηγορίας σταματά αυτή τη συσκευή από το να στέλνει ή να λαμβάνει εγγραφές αυτού του τύπου. Ό,τι υπάρχει ήδη στον διακομιστή παραμένει ως έχει, η εκ νέου ενεργοποίηση συνεχίζει από εκεί που σταματήσατε.",
|
||||
"Data Sync": "Συγχρονισμός δεδομένων",
|
||||
"Manage Fonts": "Διαχείριση γραμματοσειρών",
|
||||
"App settings": "Ρυθμίσεις εφαρμογής",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Θέμα, χρώματα επισήμανσης, ενσωματώσεις (KOSync, Readwise, Hardcover) και σειρά λεξικών",
|
||||
"Required while Dictionaries sync is enabled": "Απαιτείται όσο είναι ενεργός ο συγχρονισμός Λεξικών",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Επαναφορά σε {{hours}} ώρ. {{minutes}} λεπ.",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Επιλέξτε ένα 4ψήφιο PIN. Θα πρέπει να το εισάγετε κάθε φορά που ανοίγετε το Readest. Δεν υπάρχει τρόπος ανάκτησης ενός ξεχασμένου PIN. Η εκκαθάριση των δεδομένων της εφαρμογής είναι ο μοναδικός τρόπος επαναφοράς του.",
|
||||
"Credentials": "Διαπιστευτήρια",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Διακριτικά, ονόματα χρήστη και κωδικοί πρόσβασης για OPDS, KOReader, Hardcover και Readwise. Όταν είναι απενεργοποιημένο, τα διαπιστευτήρια παραμένουν μόνο σε αυτή τη συσκευή και δεν αποστέλλονται ποτέ.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Τα ευαίσθητα συγχρονισμένα πεδία κρυπτογραφούνται πριν τη μεταφόρτωση. Ορίστε μια φράση πρόσβασης τώρα ή αργότερα, όταν χρειαστεί η κρυπτογράφηση.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Αποθηκεύτηκε σε αυτόν τον λογαριασμό. Θα σας ζητηθεί όταν χρειαστεί να αποκρυπτογραφηθούν διαπιστευτήρια.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Η πρόοδος ανάγνωσης σε αυτή τη συσκευή διαφέρει από το «{{deviceName}}».",
|
||||
"This device": "Αυτή η συσκευή",
|
||||
"Red": "Κόκκινο",
|
||||
"Yellow": "Κίτρινο",
|
||||
"Green": "Πράσινο",
|
||||
"Blue": "Μπλε",
|
||||
"Violet": "Βιολετί",
|
||||
"Edit color": "Επεξεργασία χρώματος",
|
||||
"Add custom color": "Προσθήκη προσαρμοσμένου χρώματος",
|
||||
"Add label": "Προσθήκη ετικέτας",
|
||||
"Choose color": "Επιλογή χρώματος",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Συνδέθηκε στο Hardcover. Τελευταίος συγχρονισμός {{time}}.",
|
||||
"Integrations": "Ενσωματώσεις",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Συνδέθηκε στο Readwise. Τελευταίος συγχρονισμός {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Περιηγηθείτε και κατεβάστε βιβλία από διαδικτυακούς καταλόγους.",
|
||||
"Connected as {{user}}": "Συνδέθηκε ως {{user}}",
|
||||
"Not connected": "Μη συνδεδεμένο",
|
||||
"{{count}} catalog_one": "{{count}} κατάλογος",
|
||||
"{{count}} catalog_other": "{{count}} κατάλογοι",
|
||||
"No catalogs": "Δεν υπάρχουν κατάλογοι",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Συνδέστε το Readest με εξωτερικές υπηρεσίες για συγχρονισμό, επισημάνσεις και καταλόγους.",
|
||||
"Reading Sync": "Συγχρονισμός ανάγνωσης",
|
||||
"Content Sources": "Πηγές περιεχομένου",
|
||||
"Scroll tabs": "Κύλιση καρτελών",
|
||||
"Catalog actions": "Ενέργειες καταλόγου",
|
||||
"File Content": "Περιεχόμενο αρχείου",
|
||||
"Start your library": "Ξεκινήστε τη βιβλιοθήκη σας",
|
||||
"Pick a book from your device to add it to your library.": "Επιλέξτε ένα βιβλίο από τη συσκευή σας για να το προσθέσετε στη βιβλιοθήκη σας.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Αφήστε ένα βιβλίο οπουδήποτε σε αυτό το παράθυρο ή επιλέξτε ένα από τον υπολογιστή σας.",
|
||||
"Sign in to sync your library": "Συνδεθείτε για να συγχρονίσετε τη βιβλιοθήκη σας"
|
||||
}
|
||||
|
||||
@@ -23,5 +23,35 @@
|
||||
"Set status for {{count}} book(s)_one": "Set status for {{count}} book",
|
||||
"Set status for {{count}} book(s)_other": "Set status for {{count}} books",
|
||||
"{{count}} book(s) synced_one": "{{count}} book synced",
|
||||
"{{count}} book(s) synced_other": "{{count}} books synced"
|
||||
"{{count}} book(s) synced_other": "{{count}} books synced",
|
||||
"{{count}} active_one": "{{count}} active",
|
||||
"{{count}} active_other": "{{count}} active",
|
||||
"{{count}} downloads_one": "{{count}} download",
|
||||
"{{count}} downloads_other": "{{count}} downloads",
|
||||
"{{count}} days_one": "{{count}} day",
|
||||
"{{count}} days_other": "{{count}} days",
|
||||
"Expires in {{count}} days_one": "Expires in {{count}} day",
|
||||
"Expires in {{count}} days_other": "Expires in {{count}} days",
|
||||
"Expires in {{count}} hours_one": "Expires in {{count}} hour",
|
||||
"Expires in {{count}} hours_other": "Expires in {{count}} hours",
|
||||
"Attempts: {{count}}_one": "Attempts: {{count}}",
|
||||
"Attempts: {{count}}_other": "Attempts: {{count}}",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Failed to sync {{count}} OPDS catalog",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Failed to sync {{count}} OPDS catalogs",
|
||||
"Imported {{count}} dictionary_one": "Imported {{count}} dictionary",
|
||||
"Imported {{count}} dictionary_other": "Imported {{count}} dictionaries",
|
||||
"{{count}} catalog_one": "{{count}} catalog",
|
||||
"{{count}} catalog_other": "{{count}} catalogs",
|
||||
"Replaced {{count}} existing dictionary_one": "Replaced {{count}} existing dictionary",
|
||||
"Replaced {{count}} existing dictionary_other": "Replaced {{count}} existing dictionaries",
|
||||
"{{count}} books refreshed_one": "{{count}} book refreshed",
|
||||
"{{count}} books refreshed_other": "{{count}} books refreshed",
|
||||
"{{count}} failed_one": "{{count}} failed",
|
||||
"{{count}} failed_other": "{{count}} failed",
|
||||
"{{count}} items_one": "{{count}} item",
|
||||
"{{count}} items_other": "{{count}} items",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} new item downloaded from OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} new items downloaded from OPDS",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: {{count}} voice",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} voices"
|
||||
}
|
||||
|
||||
@@ -69,7 +69,6 @@
|
||||
"Published": "Publicado",
|
||||
"Publisher": "Editorial",
|
||||
"KOReader Sync": "Sincronización con KOReader",
|
||||
"KOReader Sync Settings": "Ajustes de Sincronización con KOReader",
|
||||
"Your Username": "Tu nombre de usuario",
|
||||
"Connect to your KOReader Sync server.": "Conéctate a tu servidor de KOReader Sync.",
|
||||
"Server URL": "URL del Servidor",
|
||||
@@ -83,14 +82,10 @@
|
||||
"Send changes only": "Solo enviar cambios",
|
||||
"Receive changes only": "Solo recibir cambios",
|
||||
"Checksum Method": "Método de identificación",
|
||||
"File Content (recommended)": "Contenido del archivo (recomendado)",
|
||||
"File Name": "Nombre del archivo",
|
||||
"Device Name": "Nombre del dispositivo",
|
||||
"Reading Progress Synced": "Progreso de lectura sincronizado",
|
||||
"Sync Conflict": "Conflicto de sincronización",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "¿Quieres sincronizar el progreso de lectura desde el dispositivo \"{{deviceName}}\"?",
|
||||
"Local Progress": "Progreso local",
|
||||
"Remote Progress": "Progreso remoto",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Página {{page}} de {{total}} ({{percentage}}%)",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Aproximadamente página {{page}} de {{total}} ({{percentage}}%)",
|
||||
"Current position": "Posición actual",
|
||||
@@ -129,7 +124,6 @@
|
||||
"Updated": "Actualizado",
|
||||
"Version {{version}}": "Versión {{version}}",
|
||||
"Vertical Direction": "Dirección vertical",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Bienvenido a tu biblioteca. Puedes importar tus libros aquí y leerlos en cualquier momento.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Writing Mode": "Modo de escritura",
|
||||
"Your Library": "Tu biblioteca",
|
||||
@@ -328,7 +322,6 @@
|
||||
"No notes match your search": "No se encontraron notas",
|
||||
"Search notes and excerpts...": "Buscar notas...",
|
||||
"Sign in to Sync": "Inicia sesión para sincronizar",
|
||||
"Synced at {{time}}": "Sincronizado a las {{time}}",
|
||||
"Never synced": "Nunca sincronizado",
|
||||
"Show Remaining Time": "Mostrar tiempo restante",
|
||||
"{{time}} min left in chapter": "{{time}} min restantes en el capítulo",
|
||||
@@ -639,7 +632,6 @@
|
||||
"Strikethrough": "Tachado",
|
||||
"Squiggly": "Ondulado",
|
||||
"Outline": "Contorno",
|
||||
"Save Current Color": "Guardar Color Actual",
|
||||
"Quick Colors": "Colores Rápidos",
|
||||
"Highlighter": "Resaltador",
|
||||
"Save Book Cover": "Guardar Portada del Libro",
|
||||
@@ -801,7 +793,6 @@
|
||||
"Annotate text after selection": "Anotar texto después de la selección",
|
||||
"Search text after selection": "Buscar texto después de la selección",
|
||||
"Look up text in dictionary after selection": "Buscar texto en el diccionario después de la selección",
|
||||
"Look up text in Wikipedia after selection": "Buscar texto en Wikipedia después de la selección",
|
||||
"Translate text after selection": "Traducir texto después de la selección",
|
||||
"Read text aloud after selection": "Leer texto en voz alta después de la selección",
|
||||
"Proofread text after selection": "Corregir texto después de la selección",
|
||||
@@ -848,9 +839,6 @@
|
||||
"Failed to export the book.": "Error al exportar el libro.",
|
||||
"Export Book": "Exportar libro",
|
||||
"Whole word:": "Palabra completa:",
|
||||
"Error": "Error",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "No se puede cargar el artículo. Intenta buscar directamente en {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "No se puede cargar la palabra. Intenta buscar directamente en {{link}}.",
|
||||
"Date Published": "Fecha de publicación",
|
||||
"Only for TTS:": "Solo para TTS:",
|
||||
"Uploaded": "Subido",
|
||||
@@ -1051,16 +1039,12 @@
|
||||
"Invalid Readwise access token": "Token de acceso a Readwise no válido",
|
||||
"Disconnected from Readwise": "Desconectado de Readwise",
|
||||
"Never": "Nunca",
|
||||
"Readwise Settings": "Ajustes de Readwise",
|
||||
"Connected to Readwise": "Conectado a Readwise",
|
||||
"Last synced: {{time}}": "Última sincronización: {{time}}",
|
||||
"Sync Enabled": "Sincronización habilitada",
|
||||
"Disconnect": "Desconectar",
|
||||
"Connect your Readwise account to sync highlights.": "Conecta tu cuenta de Readwise para sincronizar los resaltados.",
|
||||
"Get your access token at": "Obtén tu token de acceso en",
|
||||
"Access Token": "Token de acceso",
|
||||
"Paste your Readwise access token": "Pega tu token de acceso de Readwise",
|
||||
"Config": "Configuración",
|
||||
"Readwise Sync": "Sincronización con Readwise",
|
||||
"Push Highlights": "Enviar resaltados",
|
||||
"Highlights synced to Readwise": "Resaltados sincronizados con Readwise",
|
||||
@@ -1132,7 +1116,6 @@
|
||||
"Copy Selection": "Copiar selección",
|
||||
"Translate Selection": "Traducir selección",
|
||||
"Dictionary Lookup": "Buscar en diccionario",
|
||||
"Wikipedia Lookup": "Buscar en Wikipedia",
|
||||
"Read Aloud Selection": "Leer selección en voz alta",
|
||||
"Proofread Selection": "Corregir selección",
|
||||
"Open Settings": "Abrir ajustes",
|
||||
@@ -1168,25 +1151,18 @@
|
||||
"Drag to seek": "Arrastra para buscar",
|
||||
"Punctuation Delay": "Retraso de puntuación",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Confirme que esta conexión OPDS se enrutará a través de los servidores de Readest en la aplicación web antes de continuar.",
|
||||
"Custom Headers": "Encabezados personalizados",
|
||||
"Custom Headers (optional)": "Encabezados personalizados (opcional)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Añada un encabezado por línea usando \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Entiendo que esta conexión OPDS se enrutará a través de los servidores de Readest en la aplicación web. Si no confío en Readest con estas credenciales o encabezados, debería usar la aplicación nativa.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "No se puede conectar a Hardcover. Compruebe su conexión de red.",
|
||||
"Invalid Hardcover API token": "Token de API de Hardcover no válido",
|
||||
"Disconnected from Hardcover": "Desconectado de Hardcover",
|
||||
"Hardcover Settings": "Ajustes de Hardcover",
|
||||
"Connected to Hardcover": "Conectado a Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Conecte su cuenta de Hardcover para sincronizar el progreso de lectura y las notas.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Obtenga su token de API en hardcover.app → Ajustes → API.",
|
||||
"API Token": "Token de API",
|
||||
"Paste your Hardcover API token": "Pegue su token de API de Hardcover",
|
||||
"Hardcover sync enabled for this book": "Sincronización de Hardcover activada para este libro",
|
||||
"Hardcover sync disabled for this book": "Sincronización de Hardcover desactivada para este libro",
|
||||
"Hardcover Sync": "Sincronización de Hardcover",
|
||||
"Enable for This Book": "Activar para este libro",
|
||||
"Push Notes": "Enviar notas",
|
||||
"Enable Hardcover sync for this book first.": "Active primero la sincronización de Hardcover para este libro.",
|
||||
"No annotations or excerpts to sync for this book.": "No hay anotaciones ni extractos para sincronizar en este libro.",
|
||||
"Configure Hardcover in Settings first.": "Configure Hardcover en los ajustes primero.",
|
||||
"No new Hardcover note changes to sync.": "No hay nuevos cambios en notas de Hardcover para sincronizar.",
|
||||
@@ -1200,9 +1176,266 @@
|
||||
"Split Hyphens": "Dividir guiones",
|
||||
"Apply Theme Colors to PDF": "Aplicar colores del tema al PDF",
|
||||
"Name": "Nombre",
|
||||
"Unavailable": "No disponible",
|
||||
"Remove": "Eliminar",
|
||||
"Edit OPDS Catalog": "Editar catálogo OPDS",
|
||||
"Save Changes": "Guardar cambios",
|
||||
"Use Book Layout": "Usar el diseño del libro"
|
||||
"Use Book Layout": "Usar el diseño del libro",
|
||||
"End of this section. Continue to the next.": "Fin de esta sección. Continuar a la siguiente.",
|
||||
"Auto-download": "Descarga automática",
|
||||
"Auto-download new items": "Descargar nuevos elementos automáticamente",
|
||||
"Automatically download new publications when the app syncs": "Descargar nuevas publicaciones automáticamente cuando la aplicación se sincroniza",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "Se descargó {{count}} nuevo elemento desde OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "Se descargaron {{count}} nuevos elementos desde OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Se descargaron {{count}} nuevos elementos desde OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "No se pudo sincronizar {{count}} catálogo OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "No se pudieron sincronizar {{count}} catálogos OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "No se pudieron sincronizar {{count}} catálogos OPDS",
|
||||
"Last synced {{when}}": "Última sincronización {{when}}",
|
||||
"Failed downloads": "Descargas fallidas",
|
||||
"No failed downloads": "No hay descargas fallidas",
|
||||
"Attempts: {{count}}_one": "Intentos: {{count}}",
|
||||
"Attempts: {{count}}_many": "Intentos: {{count}}",
|
||||
"Attempts: {{count}}_other": "Intentos: {{count}}",
|
||||
"Skip": "Omitir",
|
||||
"Skip all": "Omitir todos",
|
||||
"Retry all": "Reintentar todos",
|
||||
"{{count}} failed_one": "{{count}} fallida",
|
||||
"{{count}} failed_many": "{{count}} fallidas",
|
||||
"{{count}} failed_other": "{{count}} fallidas",
|
||||
"(none)": "(ninguno)",
|
||||
"Identifiers": "Identificadores",
|
||||
"Read (Stream)": "Leer (Streaming)",
|
||||
"Failed to start stream": "No se pudo iniciar el streaming",
|
||||
"No dictionaries enabled": "No hay diccionarios habilitados",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Habilita un diccionario en Ajustes → Idioma → Diccionarios.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Arrastrar para reordenar",
|
||||
"Built-in": "Integrado",
|
||||
"Bundle is missing on this device. Re-import to use it.": "El paquete falta en este dispositivo. Vuelve a importarlo para usarlo.",
|
||||
"This dictionary format is not supported.": "Este formato de diccionario no es compatible.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "Se importó {{count}} diccionario",
|
||||
"Imported {{count}} dictionary_many": "Se importaron {{count}} diccionarios",
|
||||
"Imported {{count}} dictionary_other": "Se importaron {{count}} diccionarios",
|
||||
"Skipped incomplete bundles: {{names}}": "Se omitieron paquetes incompletos: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Error al importar el diccionario: {{message}}",
|
||||
"Dictionaries": "Diccionarios",
|
||||
"Delete Dictionary": "Eliminar diccionario",
|
||||
"Importing…": "Importando…",
|
||||
"Import Dictionary": "Importar diccionario",
|
||||
"No dictionaries available.": "No hay diccionarios disponibles.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Los paquetes StarDict requieren archivos .ifo, .idx y .dict.dz (.syn opcional).",
|
||||
"Select all the bundle files together when importing.": "Selecciona todos los archivos del paquete juntos al importar.",
|
||||
"Manage Dictionaries": "Administrar diccionarios",
|
||||
"Select Dictionary Files": "Seleccionar archivos de diccionario",
|
||||
"Read on Wikipedia →": "Leer en Wikipedia →",
|
||||
"This link can't be opened": "No se puede abrir este enlace",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Al enlace de anotación le faltan datos necesarios. Es posible que el enlace original se haya truncado.",
|
||||
"Go to Readest": "Ir a Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Lector de libros electrónicos de código abierto para todos, en cualquier dispositivo.",
|
||||
"Open in Readest": "Abrir en Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Si Readest no se abrió automáticamente, elige una opción:",
|
||||
"Continue reading where you left off.": "Continúa leyendo donde lo dejaste.",
|
||||
"Readest logo": "Logotipo de Readest",
|
||||
"Opening Readest...": "Abriendo Readest…",
|
||||
"Open in Readest app": "Abrir en la app de Readest",
|
||||
"Continue in browser": "Continuar en el navegador",
|
||||
"Don't have Readest?": "¿No tienes Readest?",
|
||||
"Book not in your library": "El libro no está en tu biblioteca",
|
||||
"Share Book": "Compartir libro",
|
||||
"Could not create share link": "No se pudo crear el enlace de compartir",
|
||||
"Link copied": "Enlace copiado",
|
||||
"Could not copy link": "No se pudo copiar el enlace",
|
||||
"Share revoked": "Compartir revocado",
|
||||
"Could not revoke share": "No se pudo revocar el compartir",
|
||||
"Uploading book…": "Subiendo libro…",
|
||||
"Generating…": "Generando…",
|
||||
"Generate share link": "Generar enlace de compartir",
|
||||
"Share URL": "URL de compartir",
|
||||
"Copy link": "Copiar enlace",
|
||||
"Copied": "Copiado",
|
||||
"Share via…": "Compartir vía…",
|
||||
"Expires {{date}}": "Caduca el {{date}}",
|
||||
"Revoking…": "Revocando…",
|
||||
"Revoke share": "Revocar compartir",
|
||||
"Sign in to share books": "Inicia sesión para compartir libros",
|
||||
"Expiring soon": "Caduca pronto",
|
||||
"Missing share token": "Falta el token de compartir",
|
||||
"Could not add to your library": "No se pudo añadir a tu biblioteca",
|
||||
"This share link is no longer available": "Este enlace ya no está disponible",
|
||||
"The original link may have expired or been revoked.": "Es posible que el enlace original haya caducado o se haya revocado.",
|
||||
"Get Readest": "Obtener Readest",
|
||||
"Loading shared book…": "Cargando libro compartido…",
|
||||
"Adding…": "Añadiendo…",
|
||||
"Add to my library": "Añadir a mi biblioteca",
|
||||
"Could not load your shares": "No se pudieron cargar tus compartidos",
|
||||
"Revoked": "Revocado",
|
||||
"Expired": "Caducado",
|
||||
"Shared books": "Libros compartidos",
|
||||
"You haven't shared any books yet": "Aún no has compartido ningún libro",
|
||||
"Open a book and tap Share to send it to a friend.": "Abre un libro y pulsa Compartir para enviárselo a un amigo.",
|
||||
"{{count}} active_one": "{{count}} activo",
|
||||
"{{count}} active_many": "{{count}} activos",
|
||||
"{{count}} active_other": "{{count}} activos",
|
||||
"{{count}} downloads_one": "{{count}} descarga",
|
||||
"{{count}} downloads_many": "{{count}} descargas",
|
||||
"{{count}} downloads_other": "{{count}} descargas",
|
||||
"starts at saved page": "comienza en la página guardada",
|
||||
"More actions": "Más acciones",
|
||||
"Loading…": "Cargando…",
|
||||
"Load more": "Cargar más",
|
||||
"Could not load shared book": "No se pudo cargar el libro compartido",
|
||||
"The share link is missing required information.": "Al enlace de compartir le faltan datos necesarios.",
|
||||
"Please check your connection and try again.": "Comprueba tu conexión y vuelve a intentarlo.",
|
||||
"Sign in to import shared books": "Inicia sesión para importar libros compartidos",
|
||||
"Already in your library": "Ya está en tu biblioteca",
|
||||
"Added to your library": "Añadido a tu biblioteca",
|
||||
"Could not import shared book": "No se pudo importar el libro compartido",
|
||||
"Manage Shared Links": "Gestionar enlaces compartidos",
|
||||
"Expires in": "Caduca en",
|
||||
"{{count}} days_one": "1 día",
|
||||
"{{count}} days_many": "{{count}} días",
|
||||
"{{count}} days_other": "{{count}} días",
|
||||
"Expires in {{count}} days_one": "Caduca en 1 día",
|
||||
"Expires in {{count}} days_many": "Caduca en {{count}} días",
|
||||
"Expires in {{count}} days_other": "Caduca en {{count}} días",
|
||||
"Expires in {{count}} hours_one": "Caduca en 1 hora",
|
||||
"Expires in {{count}} hours_many": "Caduca en {{count}} horas",
|
||||
"Expires in {{count}} hours_other": "Caduca en {{count}} horas",
|
||||
"Open in app": "Abrir en la app",
|
||||
"Shared with you": "Compartido contigo",
|
||||
"Downloading… {{percent}}%": "Descargando… {{percent}}%",
|
||||
"Import progress": "Progreso de la importación",
|
||||
"Share reading progress": "Compartir el progreso de lectura",
|
||||
"Includes your reading progress": "Incluye tu progreso de lectura",
|
||||
"Synced {{time}}": "Sincronizado {{time}}",
|
||||
"Sync Info": "Información de sincronización",
|
||||
"Last Synced": "Última sincronización",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Los paquetes DICT necesitan un archivo .index y un archivo .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Los paquetes Slob necesitan un archivo .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "La plantilla de URL debe empezar con http(s):// y contener %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Añadir búsqueda web",
|
||||
"Edit Web Search": "Editar búsqueda web",
|
||||
"e.g. Google": "p. ej. Google",
|
||||
"URL Template": "Plantilla de URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Use %WORD% donde debe aparecer la palabra buscada.",
|
||||
"Open the search result in your browser:": "Abre el resultado de búsqueda en tu navegador:",
|
||||
"Open in {{name}}": "Abrir en {{name}}",
|
||||
"Book Fingerprint": "Huella del libro",
|
||||
"Search the web": "Buscar en la web",
|
||||
"App deeplink (readest://)": "Enlace profundo de la app (readest://)",
|
||||
"Universal web link (https://)": "Enlace web universal (https://)",
|
||||
"Name cannot be empty.": "El nombre no puede estar vacío.",
|
||||
"Replaced {{count}} existing dictionary_one": "Se reemplazó {{count}} diccionario existente",
|
||||
"Replaced {{count}} existing dictionary_many": "Se reemplazaron {{count}} diccionarios existentes",
|
||||
"Replaced {{count}} existing dictionary_other": "Se reemplazaron {{count}} diccionarios existentes",
|
||||
"Cancel Edit": "Cancelar edición",
|
||||
"Edit Dictionary": "Editar diccionario",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Los paquetes MDict usan archivos .mdx; los archivos .mdd y .css complementarios son opcionales.",
|
||||
"Dictionary name": "Nombre del diccionario",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Este audio no se puede reproducir aquí — el diccionario usa un formato obsoleto. Prueba uno con audio Opus, MP3 o WAV.",
|
||||
"File uploaded: {{title}}": "Archivo subido: {{title}}",
|
||||
"File downloaded: {{title}}": "Archivo descargado: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Copia en la nube del archivo eliminada: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Error al subir archivo: {{title}}",
|
||||
"Failed to download file: {{title}}": "Error al descargar archivo: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Error al eliminar la copia en la nube del archivo: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% usado",
|
||||
"Set PIN…": "Establecer PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Requerir un PIN de 4 dígitos para abrir Readest",
|
||||
"Change PIN…": "Cambiar PIN…",
|
||||
"Disable PIN…": "Desactivar PIN…",
|
||||
"Sync passphrase ready": "Frase de contraseña de sincronización lista",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Esto elimina permanentemente las credenciales cifradas que sincronizamos (p. ej., contraseñas del catálogo OPDS) en cada dispositivo. Se conservan las copias locales. Tendrás que volver a introducir la frase de contraseña de sincronización o establecer una nueva. ¿Continuar?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Frase de contraseña de sincronización olvidada — todos los campos cifrados se han borrado",
|
||||
"Sync passphrase": "Frase de contraseña de sincronización",
|
||||
"Set passphrase": "Establecer frase de contraseña",
|
||||
"Forgot passphrase": "Olvidé la frase de contraseña",
|
||||
"Incorrect PIN": "PIN incorrecto",
|
||||
"App locked": "Aplicación bloqueada",
|
||||
"Enter your PIN": "Ingresa tu PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest está bloqueado. Ingresa tu PIN de 4 dígitos para continuar.",
|
||||
"PIN code": "Código PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Si olvidas tu PIN, te bloquearás en este dispositivo. Tendrás que borrar los datos de la aplicación para restablecerlo.",
|
||||
"Passphrase must be at least 8 characters": "La frase de contraseña debe tener al menos 8 caracteres",
|
||||
"Passphrases do not match": "Las frases de contraseña no coinciden",
|
||||
"Set sync passphrase": "Establecer frase de contraseña de sincronización",
|
||||
"Enter sync passphrase": "Introduce la frase de contraseña de sincronización",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Una frase de contraseña de sincronización cifra tus campos sensibles (como las credenciales del catálogo OPDS) antes de sincronizarlos. Nunca vemos esta frase de contraseña. Elige algo memorable — no hay recuperación sin ella.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Introduce la frase de contraseña de sincronización que estableciste en otro dispositivo para descifrar tus credenciales sincronizadas.",
|
||||
"Confirm passphrase": "Confirmar frase de contraseña",
|
||||
"Unlock": "Desbloquear",
|
||||
"Set PIN": "Establecer PIN",
|
||||
"Change PIN": "Cambiar PIN",
|
||||
"Disable PIN": "Desactivar PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Ingresa tu PIN actual y, a continuación, elige un nuevo PIN de 4 dígitos.",
|
||||
"Enter your current PIN to disable the app lock.": "Ingresa tu PIN actual para desactivar el bloqueo de la aplicación.",
|
||||
"PIN must be {{length}} digits": "El PIN debe tener {{length}} dígitos",
|
||||
"PINs do not match": "Los PIN no coinciden",
|
||||
"Current PIN": "PIN actual",
|
||||
"New PIN": "Nuevo PIN",
|
||||
"Confirm new PIN": "Confirmar nuevo PIN",
|
||||
"Manage Sync": "Gestionar sincronización",
|
||||
"Imported book files and library metadata": "Archivos de libros importados y metadatos de la biblioteca",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Última posición de lectura, marcadores y preferencias por libro",
|
||||
"Highlights and notes": "Resaltados y notas",
|
||||
"Fonts": "Fuentes",
|
||||
"Custom font files": "Archivos de fuentes personalizadas",
|
||||
"Backgrounds": "Fondos",
|
||||
"Custom background textures": "Texturas de fondo personalizadas",
|
||||
"OPDS catalogs": "Catálogos OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URLs de catálogos guardadas y credenciales (cifradas)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Frase de contraseña de sincronización incorrecta — no se pudieron descifrar las credenciales sincronizadas",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Se restablecieron los datos de la frase de contraseña de sincronización en el servidor. Volviendo a cifrar tus credenciales con la nueva frase…",
|
||||
"Failed to decrypt synced credentials": "No se pudieron descifrar las credenciales sincronizadas",
|
||||
"Imported dictionary bundles and settings": "Paquetes de diccionarios importados y ajustes",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Elige qué se sincroniza entre tus dispositivos. Al desactivar una categoría, este dispositivo deja de enviar o recibir entradas de ese tipo. Lo que ya está en el servidor se mantiene intacto, y al reactivarla se reanuda desde donde lo dejaste.",
|
||||
"Data Sync": "Sincronización de datos",
|
||||
"Manage Fonts": "Administrar fuentes",
|
||||
"App settings": "Ajustes de la aplicación",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, colores de resaltado, integraciones (KOSync, Readwise, Hardcover) y orden de los diccionarios",
|
||||
"Required while Dictionaries sync is enabled": "Necesario mientras la sincronización de Diccionarios esté activada",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Se restablece en {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Elige un PIN de 4 dígitos. Tendrás que introducirlo cada vez que abras Readest. No hay forma de recuperar un PIN olvidado. Borrar los datos de la aplicación es la única forma de restablecerlo.",
|
||||
"Credentials": "Credenciales",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nombres de usuario y contraseñas de OPDS, KOReader, Hardcover y Readwise. Si está desactivado, las credenciales permanecen solo en este dispositivo y nunca se cargan.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Los campos sincronizados sensibles se cifran antes de subirlos. Establece una frase de contraseña ahora o más tarde, cuando se necesite el cifrado.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Guardada en esta cuenta. Se te pedirá cuando se necesite descifrar credenciales.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "El progreso de lectura en este dispositivo difiere del de «{{deviceName}}».",
|
||||
"This device": "Este dispositivo",
|
||||
"Red": "Rojo",
|
||||
"Yellow": "Amarillo",
|
||||
"Green": "Verde",
|
||||
"Blue": "Azul",
|
||||
"Violet": "Violeta",
|
||||
"Edit color": "Editar color",
|
||||
"Add custom color": "Añadir color personalizado",
|
||||
"Add label": "Añadir etiqueta",
|
||||
"Choose color": "Elegir color",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Conectado a Hardcover. Última sincronización {{time}}.",
|
||||
"Integrations": "Integraciones",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Conectado a Readwise. Última sincronización {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Explora y descarga libros desde catálogos en línea.",
|
||||
"Connected as {{user}}": "Conectado como {{user}}",
|
||||
"Not connected": "No conectado",
|
||||
"{{count}} catalog_one": "{{count}} catálogo",
|
||||
"{{count}} catalog_many": "{{count}} catálogos",
|
||||
"{{count}} catalog_other": "{{count}} catálogos",
|
||||
"No catalogs": "Sin catálogos",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Conecta Readest con servicios externos para sincronización, resaltados y catálogos.",
|
||||
"Reading Sync": "Sincronización de lectura",
|
||||
"Content Sources": "Fuentes de contenido",
|
||||
"Scroll tabs": "Desplazar pestañas",
|
||||
"Catalog actions": "Acciones del catálogo",
|
||||
"File Content": "Contenido del archivo",
|
||||
"Start your library": "Empieza tu biblioteca",
|
||||
"Pick a book from your device to add it to your library.": "Elige un libro de tu dispositivo para añadirlo a tu biblioteca.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Suelta un libro en cualquier parte de esta ventana o elige uno desde tu computadora.",
|
||||
"Sign in to sync your library": "Inicia sesión para sincronizar tu biblioteca"
|
||||
}
|
||||
|
||||
@@ -101,7 +101,6 @@
|
||||
"Updated": "بهروزرسانی شده",
|
||||
"Version {{version}}": "نسخهی {{version}}",
|
||||
"Vertical Direction": "جهت عمودی",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "به کتابخانهتان خوش آمدید. میتوانید کتابهایتان را اینجا وارد کنید و هر زمان خواستید آنها را بخوانید.",
|
||||
"Wikipedia": "ویکیپدیا",
|
||||
"Writing Mode": "حالت نوشتن",
|
||||
"Your Library": "کتابخانهی شما",
|
||||
@@ -298,7 +297,6 @@
|
||||
"No notes match your search": "هیچ یادداشتی با جستجوی شما مطابقت ندارد",
|
||||
"Search notes and excerpts...": "جستجوی یادداشتها و گزیدهها...",
|
||||
"Sign in to Sync": "برای همگامسازی وارد شوید",
|
||||
"Synced at {{time}}": "همگامسازی شده در {{time}}",
|
||||
"Never synced": "هرگز همگامسازی نشده",
|
||||
"Show Remaining Time": "نمایش زمان باقیمانده",
|
||||
"{{time}} min left in chapter": "{{time}} دقیقه تا انتهای فصل",
|
||||
@@ -461,14 +459,12 @@
|
||||
"Remove from Cloud Only": "حذف فقط از فضای ابری",
|
||||
"Remove from Device Only": "حذف فقط از دستگاه",
|
||||
"Disconnected": "قطع اتصال",
|
||||
"KOReader Sync Settings": "تنظیمات همگامسازی KOReader",
|
||||
"Sync Strategy": "استراتژی همگامسازی",
|
||||
"Ask on conflict": "پرسش هنگام تداخل",
|
||||
"Always use latest": "همیشه از آخرین استفاده شود",
|
||||
"Send changes only": "فقط ارسال تغییرات",
|
||||
"Receive changes only": "فقط دریافت تغییرات",
|
||||
"Checksum Method": "روش Checksum",
|
||||
"File Content (recommended)": "محتوای فایل (توصیهشده)",
|
||||
"File Name": "نام فایل",
|
||||
"Device Name": "نام دستگاه",
|
||||
"Connect to your KOReader Sync server.": "به سرور همگامسازی KOReader خود متصل شوید.",
|
||||
@@ -479,10 +475,7 @@
|
||||
"Connect": "اتصال",
|
||||
"KOReader Sync": "همگامسازی KOReader",
|
||||
"Sync Conflict": "تداخل همگامسازی",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "همگامسازی وضعیت مطالعه از «{{deviceName}}»؟",
|
||||
"another device": "دستگاه دیگر",
|
||||
"Local Progress": "وضعیت مطالعه محلی",
|
||||
"Remote Progress": "وضعیت مطالعه از راه دور",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "صفحهی {{page}} از {{total}} ({{percentage}}%)",
|
||||
"Current position": "موقعیت فعلی",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "تقریباً صفحهی {{page}} از {{total}} ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "خطخورده",
|
||||
"Squiggly": "خطموجدار",
|
||||
"Outline": "خطکشی",
|
||||
"Save Current Color": "ذخیره رنگ فعلی",
|
||||
"Quick Colors": "رنگهای سریع",
|
||||
"Highlighter": "ماژیک هایلایت",
|
||||
"Save Book Cover": "ذخیره جلد کتاب",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "یادداشتگذاری متن پس از انتخاب",
|
||||
"Search text after selection": "جستجوی متن پس از انتخاب",
|
||||
"Look up text in dictionary after selection": "جستجوی متن در فرهنگ لغت پس از انتخاب",
|
||||
"Look up text in Wikipedia after selection": "جستجوی متن در ویکیپدیا پس از انتخاب",
|
||||
"Translate text after selection": "ترجمه متن پس از انتخاب",
|
||||
"Read text aloud after selection": "خواندن متن با صدای بلند پس از انتخاب",
|
||||
"Proofread text after selection": "بازبینی متن پس از انتخاب",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "صادر کردن کتاب ناموفق بود.",
|
||||
"Export Book": "صادر کردن کتاب",
|
||||
"Whole word:": "کلمه کامل:",
|
||||
"Error": "خطا",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "بارگذاری مقاله امکانپذیر نیست. سعی کنید مستقیماً در {{link}} جستجو کنید.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "بارگذاری کلمه امکانپذیر نیست. سعی کنید مستقیماً در {{link}} جستجو کنید.",
|
||||
"Date Published": "تاریخ انتشار",
|
||||
"Only for TTS:": "فقط برای TTS:",
|
||||
"Uploaded": "بارگذاری شد",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "توکن دسترسی Readwise نامعتبر است",
|
||||
"Disconnected from Readwise": "اتصال از Readwise قطع شد",
|
||||
"Never": "هرگز",
|
||||
"Readwise Settings": "تنظیمات Readwise",
|
||||
"Connected to Readwise": "به Readwise متصل شد",
|
||||
"Last synced: {{time}}": "آخرین همگامسازی: {{time}}",
|
||||
"Sync Enabled": "همگامسازی فعال شد",
|
||||
"Disconnect": "قطع اتصال",
|
||||
"Connect your Readwise account to sync highlights.": "برای همگامسازی هایلایتها، حساب Readwise خود را متصل کنید.",
|
||||
"Get your access token at": "توکن دسترسی خود را از اینجا دریافت کنید:",
|
||||
"Access Token": "توکن دسترسی",
|
||||
"Paste your Readwise access token": "توکن دسترسی Readwise خود را جایگذاری کنید",
|
||||
"Config": "پیکربندی",
|
||||
"Readwise Sync": "همگامسازی Readwise",
|
||||
"Push Highlights": "ارسال هایلایتها",
|
||||
"Highlights synced to Readwise": "هایلایتها با Readwise همگامسازی شدند",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "کپی انتخاب",
|
||||
"Translate Selection": "ترجمه انتخاب",
|
||||
"Dictionary Lookup": "جستجو در فرهنگ لغت",
|
||||
"Wikipedia Lookup": "جستجو در ویکیپدیا",
|
||||
"Read Aloud Selection": "خواندن بلند انتخاب",
|
||||
"Proofread Selection": "بازبینی انتخاب",
|
||||
"Open Settings": "باز کردن تنظیمات",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "بکشید برای جستجو",
|
||||
"Punctuation Delay": "تأخیر نشانهگذاری",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "لطفاً تأیید کنید که این اتصال OPDS از طریق سرورهای Readest در برنامه وب پروکسی خواهد شد.",
|
||||
"Custom Headers": "سرآیندهای سفارشی",
|
||||
"Custom Headers (optional)": "سرآیندهای سفارشی (اختیاری)",
|
||||
"Add one header per line using \"Header-Name: value\".": "در هر خط یک سرآیند با استفاده از \"Header-Name: value\" اضافه کنید.",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "متوجه هستم که این اتصال OPDS از طریق سرورهای Readest در برنامه وب پروکسی خواهد شد. اگر به Readest برای این اعتبارنامهها یا سرآیندها اعتماد ندارم، باید از برنامه بومی استفاده کنم.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "اتصال به Hardcover ممکن نیست. لطفاً اتصال شبکه خود را بررسی کنید.",
|
||||
"Invalid Hardcover API token": "توکن API نامعتبر Hardcover",
|
||||
"Disconnected from Hardcover": "قطع اتصال از Hardcover",
|
||||
"Hardcover Settings": "تنظیمات Hardcover",
|
||||
"Connected to Hardcover": "متصل به Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "حساب Hardcover خود را برای همگامسازی پیشرفت مطالعه و یادداشتها متصل کنید.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "توکن API خود را از hardcover.app ← تنظیمات ← API دریافت کنید.",
|
||||
"API Token": "توکن API",
|
||||
"Paste your Hardcover API token": "توکن API Hardcover خود را جایگذاری کنید",
|
||||
"Hardcover sync enabled for this book": "همگامسازی Hardcover برای این کتاب فعال شد",
|
||||
"Hardcover sync disabled for this book": "همگامسازی Hardcover برای این کتاب غیرفعال شد",
|
||||
"Hardcover Sync": "همگامسازی Hardcover",
|
||||
"Enable for This Book": "فعالسازی برای این کتاب",
|
||||
"Push Notes": "ارسال یادداشتها",
|
||||
"Enable Hardcover sync for this book first.": "ابتدا همگامسازی Hardcover را برای این کتاب فعال کنید.",
|
||||
"No annotations or excerpts to sync for this book.": "هیچ حاشیهنویسی یا گزیدهای برای همگامسازی این کتاب وجود ندارد.",
|
||||
"Configure Hardcover in Settings first.": "ابتدا Hardcover را در تنظیمات پیکربندی کنید.",
|
||||
"No new Hardcover note changes to sync.": "تغییرات جدیدی در یادداشتهای Hardcover برای همگامسازی وجود ندارد.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "تقسیم خطتیرهها",
|
||||
"Apply Theme Colors to PDF": "اعمال رنگهای پوسته روی PDF",
|
||||
"Name": "نام",
|
||||
"Unavailable": "ناموجود",
|
||||
"Remove": "حذف",
|
||||
"Edit OPDS Catalog": "ویرایش کاتالوگ OPDS",
|
||||
"Save Changes": "ذخیره تغییرات",
|
||||
"Use Book Layout": "استفاده از چیدمان کتاب"
|
||||
"Use Book Layout": "استفاده از چیدمان کتاب",
|
||||
"End of this section. Continue to the next.": "پایان این بخش. به بخش بعدی ادامه دهید.",
|
||||
"Auto-download": "دانلود خودکار",
|
||||
"Auto-download new items": "دانلود خودکار موارد جدید",
|
||||
"Automatically download new publications when the app syncs": "دانلود خودکار انتشارات جدید هنگام همگامسازی برنامه",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} مورد جدید از OPDS دانلود شد",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} مورد جدید از OPDS دانلود شدند",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "همگامسازی {{count}} کاتالوگ OPDS ناموفق بود",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "همگامسازی {{count}} کاتالوگ OPDS ناموفق بود",
|
||||
"Last synced {{when}}": "آخرین همگامسازی {{when}}",
|
||||
"Failed downloads": "دانلودهای ناموفق",
|
||||
"No failed downloads": "هیچ دانلود ناموفقی وجود ندارد",
|
||||
"Attempts: {{count}}_one": "تلاشها: {{count}}",
|
||||
"Attempts: {{count}}_other": "تلاشها: {{count}}",
|
||||
"Skip": "رد کردن",
|
||||
"Skip all": "رد کردن همه",
|
||||
"Retry all": "تلاش مجدد همه",
|
||||
"{{count}} failed_one": "{{count}} ناموفق",
|
||||
"{{count}} failed_other": "{{count}} ناموفق",
|
||||
"(none)": "(هیچکدام)",
|
||||
"Identifiers": "شناسهها",
|
||||
"Read (Stream)": "خواندن (پخش)",
|
||||
"Failed to start stream": "شروع پخش ناموفق بود",
|
||||
"No dictionaries enabled": "هیچ فرهنگلغتی فعال نیست",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "فرهنگلغتی را از تنظیمات ← زبان ← فرهنگلغتها فعال کنید.",
|
||||
"Wiktionary": "ویکیواژه",
|
||||
"Drag to reorder": "برای تغییر ترتیب بکشید",
|
||||
"Built-in": "داخلی",
|
||||
"Bundle is missing on this device. Re-import to use it.": "بسته در این دستگاه موجود نیست. برای استفاده دوباره وارد کنید.",
|
||||
"This dictionary format is not supported.": "این قالب فرهنگلغت پشتیبانی نمیشود.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} فرهنگلغت وارد شد",
|
||||
"Imported {{count}} dictionary_other": "{{count}} فرهنگلغت وارد شد",
|
||||
"Skipped incomplete bundles: {{names}}": "بستههای ناقص رد شدند: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "وارد کردن فرهنگلغت ناموفق بود: {{message}}",
|
||||
"Dictionaries": "فرهنگلغتها",
|
||||
"Delete Dictionary": "حذف فرهنگلغت",
|
||||
"Importing…": "در حال وارد کردن…",
|
||||
"Import Dictionary": "وارد کردن فرهنگلغت",
|
||||
"No dictionaries available.": "هیچ فرهنگلغتی در دسترس نیست.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "بستههای StarDict به فایلهای .ifo، .idx و .dict.dz نیاز دارند (.syn اختیاری).",
|
||||
"Select all the bundle files together when importing.": "هنگام وارد کردن، همه فایلهای بسته را با هم انتخاب کنید.",
|
||||
"Manage Dictionaries": "مدیریت فرهنگلغتها",
|
||||
"Select Dictionary Files": "انتخاب فایلهای فرهنگلغت",
|
||||
"Read on Wikipedia →": "در ویکیپدیا بخوانید →",
|
||||
"This link can't be opened": "این پیوند باز نمیشود",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "اطلاعات مورد نیاز در پیوند یادداشت وجود ندارد. ممکن است پیوند اصلی کوتاه شده باشد.",
|
||||
"Go to Readest": "رفتن به Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "کتابخوان الکترونیکی متنباز برای همه، روی هر دستگاهی.",
|
||||
"Open in Readest": "باز کردن در Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "اگر Readest بهطور خودکار باز نشد، یکی از گزینههای زیر را انتخاب کنید:",
|
||||
"Continue reading where you left off.": "از همانجا که رها کردید ادامه بدهید.",
|
||||
"Readest logo": "نشان Readest",
|
||||
"Opening Readest...": "در حال باز کردن Readest…",
|
||||
"Open in Readest app": "باز کردن در برنامهٔ Readest",
|
||||
"Continue in browser": "ادامه در مرورگر",
|
||||
"Don't have Readest?": "Readest ندارید؟",
|
||||
"Book not in your library": "این کتاب در کتابخانهٔ شما نیست",
|
||||
"Share Book": "اشتراکگذاری کتاب",
|
||||
"Could not create share link": "ایجاد لینک اشتراکگذاری امکانپذیر نبود",
|
||||
"Link copied": "لینک کپی شد",
|
||||
"Could not copy link": "کپی کردن لینک امکانپذیر نبود",
|
||||
"Share revoked": "اشتراکگذاری لغو شد",
|
||||
"Could not revoke share": "لغو اشتراکگذاری امکانپذیر نبود",
|
||||
"Uploading book…": "در حال آپلود کتاب…",
|
||||
"Generating…": "در حال ایجاد…",
|
||||
"Generate share link": "ایجاد لینک اشتراکگذاری",
|
||||
"Share URL": "آدرس اشتراکگذاری",
|
||||
"Copy link": "کپی لینک",
|
||||
"Copied": "کپی شد",
|
||||
"Share via…": "اشتراکگذاری از طریق…",
|
||||
"Expires {{date}}": "منقضی میشود در {{date}}",
|
||||
"Revoking…": "در حال لغو…",
|
||||
"Revoke share": "لغو اشتراکگذاری",
|
||||
"Sign in to share books": "برای اشتراکگذاری کتابها وارد شوید",
|
||||
"Expiring soon": "به زودی منقضی میشود",
|
||||
"Missing share token": "توکن اشتراکگذاری وجود ندارد",
|
||||
"Could not add to your library": "افزودن به کتابخانه شما امکانپذیر نبود",
|
||||
"This share link is no longer available": "این لینک اشتراکگذاری دیگر در دسترس نیست",
|
||||
"The original link may have expired or been revoked.": "لینک اصلی ممکن است منقضی شده یا لغو شده باشد.",
|
||||
"Get Readest": "دریافت Readest",
|
||||
"Loading shared book…": "در حال بارگذاری کتاب اشتراکگذاری شده…",
|
||||
"Adding…": "در حال افزودن…",
|
||||
"Add to my library": "افزودن به کتابخانه من",
|
||||
"Could not load your shares": "بارگذاری اشتراکگذاریهای شما امکانپذیر نبود",
|
||||
"Revoked": "لغو شده",
|
||||
"Expired": "منقضی شده",
|
||||
"Shared books": "کتابهای اشتراکگذاری شده",
|
||||
"You haven't shared any books yet": "هنوز کتابی به اشتراک نگذاشتهاید",
|
||||
"Open a book and tap Share to send it to a friend.": "یک کتاب باز کنید و روی اشتراکگذاری ضربه بزنید تا برای دوستتان بفرستید.",
|
||||
"{{count}} active_one": "{{count}} فعال",
|
||||
"{{count}} active_other": "{{count}} فعال",
|
||||
"{{count}} downloads_one": "{{count}} دانلود",
|
||||
"{{count}} downloads_other": "{{count}} دانلود",
|
||||
"starts at saved page": "از صفحه ذخیرهشده شروع میشود",
|
||||
"More actions": "اقدامات بیشتر",
|
||||
"Loading…": "در حال بارگذاری…",
|
||||
"Load more": "بارگذاری بیشتر",
|
||||
"Could not load shared book": "بارگذاری کتاب اشتراکگذاری شده امکانپذیر نبود",
|
||||
"The share link is missing required information.": "لینک اشتراکگذاری اطلاعات لازم را ندارد.",
|
||||
"Please check your connection and try again.": "لطفاً اتصال خود را بررسی کرده و دوباره تلاش کنید.",
|
||||
"Sign in to import shared books": "برای وارد کردن کتابهای اشتراکگذاری شده وارد شوید",
|
||||
"Already in your library": "از قبل در کتابخانه شما موجود است",
|
||||
"Added to your library": "به کتابخانه شما افزوده شد",
|
||||
"Could not import shared book": "وارد کردن کتاب اشتراکگذاری شده امکانپذیر نبود",
|
||||
"Manage Shared Links": "مدیریت لینکهای اشتراکگذاری",
|
||||
"Expires in": "منقضی میشود در",
|
||||
"{{count}} days_one": "۱ روز",
|
||||
"{{count}} days_other": "{{count}} روز",
|
||||
"Expires in {{count}} days_one": "در ۱ روز منقضی میشود",
|
||||
"Expires in {{count}} days_other": "در {{count}} روز منقضی میشود",
|
||||
"Expires in {{count}} hours_one": "در ۱ ساعت منقضی میشود",
|
||||
"Expires in {{count}} hours_other": "در {{count}} ساعت منقضی میشود",
|
||||
"Open in app": "باز کردن در برنامه",
|
||||
"Shared with you": "با شما به اشتراک گذاشته شده",
|
||||
"Downloading… {{percent}}%": "در حال دانلود… {{percent}}٪",
|
||||
"Import progress": "پیشرفت وارد کردن",
|
||||
"Share reading progress": "اشتراکگذاری پیشرفت مطالعه",
|
||||
"Includes your reading progress": "شامل پیشرفت مطالعهٔ شماست",
|
||||
"Synced {{time}}": "{{time}} همگامسازی شد",
|
||||
"Sync Info": "اطلاعات همگامسازی",
|
||||
"Last Synced": "آخرین همگامسازی",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "بستههای DICT به یک فایل .index و یک فایل .dict.dz نیاز دارند.",
|
||||
"Slob bundles need a .slob file.": "بستههای Slob به یک فایل .slob نیاز دارند.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "الگوی URL باید با http(s):// شروع شود و حاوی %WORD% باشد.",
|
||||
"Web": "وب",
|
||||
"Add Web Search": "افزودن جستوجوی وب",
|
||||
"Edit Web Search": "ویرایش جستوجوی وب",
|
||||
"e.g. Google": "مثلاً Google",
|
||||
"URL Template": "الگوی URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "از %WORD% در جایی که کلمهی مورد جستوجو باید ظاهر شود، استفاده کنید.",
|
||||
"Open the search result in your browser:": "نتیجهی جستوجو را در مرورگر باز کنید:",
|
||||
"Open in {{name}}": "بازکردن در {{name}}",
|
||||
"Book Fingerprint": "اثر انگشت کتاب",
|
||||
"Search the web": "جستجو در وب",
|
||||
"App deeplink (readest://)": "پیوند درونبرنامهای (readest://)",
|
||||
"Universal web link (https://)": "پیوند وب جهانی (https://)",
|
||||
"Name cannot be empty.": "نام نمیتواند خالی باشد.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} فرهنگنامه موجود جایگزین شد",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} فرهنگنامه موجود جایگزین شدند",
|
||||
"Cancel Edit": "لغو ویرایش",
|
||||
"Edit Dictionary": "ویرایش فرهنگنامه",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "بستههای MDict از فایلهای .mdx استفاده میکنند؛ فایلهای همراه .mdd و .css اختیاری هستند.",
|
||||
"Dictionary name": "نام فرهنگنامه",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "این صدا اینجا قابل پخش نیست — فرهنگنامه از قالبی قدیمی استفاده میکند. فرهنگنامهای با صدای Opus، MP3 یا WAV را امتحان کنید.",
|
||||
"File uploaded: {{title}}": "فایل «{{title}}» آپلود شد.",
|
||||
"File downloaded: {{title}}": "فایل «{{title}}» دانلود شد.",
|
||||
"Deleted cloud copy of the file: {{title}}": "نسخهی ابری فایل «{{title}}» حذف شد.",
|
||||
"Failed to upload file: {{title}}": "آپلود فایل «{{title}}» ناموفق بود.",
|
||||
"Failed to download file: {{title}}": "دانلود فایل «{{title}}» ناموفق بود.",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "حذف نسخهی ابری فایل «{{title}}» ناموفق بود.",
|
||||
"{{percentage}}% used": "{{percentage}}٪ استفاده شده",
|
||||
"Set PIN…": "تنظیم PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "برای باز کردن Readest یک PIN چهار رقمی الزامی شود",
|
||||
"Change PIN…": "تغییر PIN…",
|
||||
"Disable PIN…": "غیرفعال کردن PIN…",
|
||||
"Sync passphrase ready": "عبارت عبور همگامسازی آماده است",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "این به طور دائم اعتبارنامههای رمزگذاریشدهای را که همگامسازی میکنیم (مانند رمزهای کاتالوگ OPDS) در همه دستگاهها حذف میکند. نسخههای محلی حفظ میشوند. باید عبارت عبور همگامسازی را دوباره وارد کنید یا یک عبارت جدید تنظیم کنید. ادامه میدهید؟",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "عبارت عبور همگامسازی فراموش شد — تمام فیلدهای رمزگذاریشده پاک شدند",
|
||||
"Sync passphrase": "عبارت عبور همگامسازی",
|
||||
"Set passphrase": "تنظیم عبارت عبور",
|
||||
"Forgot passphrase": "عبارت عبور را فراموش کردهاید",
|
||||
"Incorrect PIN": "PIN نادرست",
|
||||
"App locked": "برنامه قفل است",
|
||||
"Enter your PIN": "PIN خود را وارد کنید",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest قفل است. برای ادامه، PIN چهار رقمی خود را وارد کنید.",
|
||||
"PIN code": "کد PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "فراموش کردن PIN باعث میشود از این دستگاه خارج شوید. برای بازنشانی آن باید دادههای برنامه را پاک کنید.",
|
||||
"Passphrase must be at least 8 characters": "عبارت عبور باید حداقل ۸ نویسه باشد",
|
||||
"Passphrases do not match": "عبارتهای عبور مطابقت ندارند",
|
||||
"Set sync passphrase": "تنظیم عبارت عبور همگامسازی",
|
||||
"Enter sync passphrase": "عبارت عبور همگامسازی را وارد کنید",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "عبارت عبور همگامسازی، فیلدهای حساس شما (مانند اعتبارنامههای کاتالوگ OPDS) را قبل از همگامسازی رمزگذاری میکند. ما هرگز این عبارت عبور را نمیبینیم. چیزی بهیادماندنی انتخاب کنید — بدون آن هیچ راه بازیابی وجود ندارد.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "برای رمزگشایی اعتبارنامههای همگامسازیشده، عبارت عبور همگامسازی که در دستگاه دیگری تنظیم کردهاید را وارد کنید.",
|
||||
"Confirm passphrase": "تأیید عبارت عبور",
|
||||
"Unlock": "باز کردن",
|
||||
"Set PIN": "تنظیم PIN",
|
||||
"Change PIN": "تغییر PIN",
|
||||
"Disable PIN": "غیرفعال کردن PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "PIN فعلی خود را وارد کنید و سپس یک PIN چهار رقمی جدید انتخاب کنید.",
|
||||
"Enter your current PIN to disable the app lock.": "برای غیرفعال کردن قفل برنامه، PIN فعلی خود را وارد کنید.",
|
||||
"PIN must be {{length}} digits": "PIN باید {{length}} رقم باشد",
|
||||
"PINs do not match": "PINها مطابقت ندارند",
|
||||
"Current PIN": "PIN فعلی",
|
||||
"New PIN": "PIN جدید",
|
||||
"Confirm new PIN": "تأیید PIN جدید",
|
||||
"Manage Sync": "مدیریت همگامسازی",
|
||||
"Imported book files and library metadata": "فایلهای کتاب وارد شده و فراداده کتابخانه",
|
||||
"Last-read position, bookmarks, and per-book preferences": "آخرین موقعیت مطالعه، نشانکها و تنظیمات هر کتاب",
|
||||
"Highlights and notes": "هایلایتها و یادداشتها",
|
||||
"Fonts": "قلمها",
|
||||
"Custom font files": "فایلهای قلم سفارشی",
|
||||
"Backgrounds": "پسزمینهها",
|
||||
"Custom background textures": "بافتهای پسزمینه سفارشی",
|
||||
"OPDS catalogs": "کاتالوگهای OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "نشانیهای ذخیرهشده کاتالوگ و اعتبارنامههای (رمزنگاریشده)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "عبارت عبور همگامسازی نادرست است — رمزگشایی اعتبارنامههای همگامشده ممکن نیست",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "دادههای عبارت عبور همگامسازی روی سرور بازنشانی شد. در حال رمزنگاری مجدد اعتبارنامهها با عبارت عبور جدید…",
|
||||
"Failed to decrypt synced credentials": "رمزگشایی اعتبارنامههای همگامشده ناموفق بود",
|
||||
"Imported dictionary bundles and settings": "بستههای فرهنگلغت وارد شده و تنظیمات",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "انتخاب کنید چه چیزی بین دستگاههای شما همگامسازی شود. غیرفعال کردن یک دسته باعث میشود این دستگاه ارسال یا دریافت ردیفهای آن نوع را متوقف کند. آنچه از قبل روی سرور است دستنخورده باقی میماند، و با فعالسازی مجدد، از همان جایی که متوقف شدهاید ادامه مییابد.",
|
||||
"Data Sync": "همگامسازی دادهها",
|
||||
"Manage Fonts": "مدیریت قلمها",
|
||||
"App settings": "تنظیمات برنامه",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "پوسته، رنگهای هایلایت، یکپارچهسازیها (KOSync، Readwise، Hardcover) و ترتیب فرهنگلغتها",
|
||||
"Required while Dictionaries sync is enabled": "هنگام فعالبودن همگامسازی فرهنگلغتها لازم است",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "تنظیم مجدد در {{hours}} ساعت {{minutes}} دقیقه",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "یک پین ۴ رقمی انتخاب کنید. هر بار که Readest را باز میکنید باید آن را وارد کنید. راهی برای بازیابی پین فراموششده وجود ندارد. پاک کردن دادههای برنامه تنها راه بازنشانی آن است.",
|
||||
"Credentials": "اعتبارنامهها",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "توکنها، نامهای کاربری و رمزهای عبور OPDS، KOReader، Hardcover و Readwise. هنگام غیرفعال بودن، اعتبارنامهها فقط روی این دستگاه باقی میمانند و هرگز بارگذاری نمیشوند.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "فیلدهای حساسِ همگامسازیشده پیش از بارگذاری رمزگذاری میشوند. اکنون یا بعداً، هنگامی که به رمزگذاری نیاز شد، یک عبارت عبور تنظیم کنید.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "در این حساب ذخیره شد. هنگام رمزگشایی اعتبارنامهها از شما خواسته میشود.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "پیشرفت مطالعه در این دستگاه با «{{deviceName}}» تفاوت دارد.",
|
||||
"This device": "این دستگاه",
|
||||
"Red": "قرمز",
|
||||
"Yellow": "زرد",
|
||||
"Green": "سبز",
|
||||
"Blue": "آبی",
|
||||
"Violet": "بنفش",
|
||||
"Edit color": "ویرایش رنگ",
|
||||
"Add custom color": "افزودن رنگ سفارشی",
|
||||
"Add label": "افزودن برچسب",
|
||||
"Choose color": "انتخاب رنگ",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "متصل به Hardcover. آخرین همگامسازی {{time}}.",
|
||||
"Integrations": "یکپارچهسازیها",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "متصل به Readwise. آخرین همگامسازی {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "کتابها را از کاتالوگهای آنلاین مرور و دانلود کنید.",
|
||||
"Connected as {{user}}": "متصل به عنوان {{user}}",
|
||||
"Not connected": "متصل نیست",
|
||||
"{{count}} catalog_one": "{{count}} کاتالوگ",
|
||||
"{{count}} catalog_other": "{{count}} کاتالوگ",
|
||||
"No catalogs": "بدون کاتالوگ",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Readest را برای همگامسازی، هایلایتها و کاتالوگها به سرویسهای خارجی متصل کنید.",
|
||||
"Reading Sync": "همگامسازی مطالعه",
|
||||
"Content Sources": "منابع محتوا",
|
||||
"Scroll tabs": "پیمایش زبانهها",
|
||||
"Catalog actions": "اقدامات فهرست",
|
||||
"File Content": "محتوای فایل",
|
||||
"Start your library": "کتابخانهی خود را آغاز کنید",
|
||||
"Pick a book from your device to add it to your library.": "از دستگاه خود کتابی انتخاب کنید تا به کتابخانهتان افزوده شود.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "کتابی را در هر جای این پنجره رها کنید، یا یکی را از رایانهی خود انتخاب کنید.",
|
||||
"Sign in to sync your library": "برای همگامسازی کتابخانهی خود وارد شوید"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Mis à jour",
|
||||
"Version {{version}}": "Version {{version}}",
|
||||
"Vertical Direction": "Direction verticale",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Bienvenue dans votre bibliothèque. Vous pouvez importer vos livres ici et les lire à tout moment.",
|
||||
"Wikipedia": "Wikipédia",
|
||||
"Writing Mode": "Mode écriture",
|
||||
"Your Library": "Votre bibliothèque",
|
||||
@@ -300,7 +299,6 @@
|
||||
"No notes match your search": "Aucune note trouvée",
|
||||
"Search notes and excerpts...": "Rechercher des notes...",
|
||||
"Sign in to Sync": "Connectez-vous pour synchroniser",
|
||||
"Synced at {{time}}": "Synchronisé à {{time}}",
|
||||
"Never synced": "Jamais synchronisé",
|
||||
"Show Remaining Time": "Afficher le temps restant",
|
||||
"{{time}} min left in chapter": "{{time}} min restant dans le chapitre",
|
||||
@@ -465,14 +463,12 @@
|
||||
"Remove from Cloud Only": "Supprimer uniquement du Cloud",
|
||||
"Remove from Device Only": "Supprimer uniquement de l'appareil",
|
||||
"Disconnected": "Déconnecté",
|
||||
"KOReader Sync Settings": "Paramètres de synchronisation KOReader",
|
||||
"Sync Strategy": "Stratégie de synchronisation",
|
||||
"Ask on conflict": "Demander en cas de conflit",
|
||||
"Always use latest": "Toujours utiliser la dernière version",
|
||||
"Send changes only": "Envoyer uniquement les modifications",
|
||||
"Receive changes only": "Recevoir uniquement les modifications",
|
||||
"Checksum Method": "Méthode de somme de contrôle",
|
||||
"File Content (recommended)": "Contenu du fichier (recommandé)",
|
||||
"File Name": "Nom du fichier",
|
||||
"Device Name": "Nom de l'appareil",
|
||||
"Connect to your KOReader Sync server.": "Connectez-vous à votre serveur de synchronisation KOReader.",
|
||||
@@ -483,10 +479,7 @@
|
||||
"Connect": "Connecter",
|
||||
"KOReader Sync": "Synchronisation KOReader",
|
||||
"Sync Conflict": "Conflit de synchronisation",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Synchroniser la progression de lecture depuis \"{{deviceName}}\"?",
|
||||
"another device": "un autre appareil",
|
||||
"Local Progress": "Progression locale",
|
||||
"Remote Progress": "Progression distante",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Page {{page}} sur {{total}} ({{percentage}}%)",
|
||||
"Current position": "Position actuelle",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Environ page {{page}} sur {{total}} ({{percentage}}%)",
|
||||
@@ -639,7 +632,6 @@
|
||||
"Strikethrough": "Barré",
|
||||
"Squiggly": "Ondulé",
|
||||
"Outline": "Contour",
|
||||
"Save Current Color": "Enregistrer la Couleur Actuelle",
|
||||
"Quick Colors": "Couleurs Rapides",
|
||||
"Highlighter": "Surligneur",
|
||||
"Save Book Cover": "Enregistrer la Couverture du Livre",
|
||||
@@ -801,7 +793,6 @@
|
||||
"Annotate text after selection": "Annoter le texte après la sélection",
|
||||
"Search text after selection": "Rechercher le texte après la sélection",
|
||||
"Look up text in dictionary after selection": "Chercher le texte dans le dictionnaire après la sélection",
|
||||
"Look up text in Wikipedia after selection": "Chercher le texte dans Wikipédia après la sélection",
|
||||
"Translate text after selection": "Traduire le texte après la sélection",
|
||||
"Read text aloud after selection": "Lire le texte à haute voix après la sélection",
|
||||
"Proofread text after selection": "Relire le texte après la sélection",
|
||||
@@ -848,9 +839,6 @@
|
||||
"Failed to export the book.": "Échec de l'exportation du livre.",
|
||||
"Export Book": "Exporter le livre",
|
||||
"Whole word:": "Mot entier :",
|
||||
"Error": "Erreur",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Impossible de charger l'article. Essayez de rechercher directement sur {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Impossible de charger le mot. Essayez de rechercher directement sur {{link}}.",
|
||||
"Date Published": "Date de publication",
|
||||
"Only for TTS:": "Uniquement pour TTS :",
|
||||
"Uploaded": "Téléversé",
|
||||
@@ -1051,16 +1039,12 @@
|
||||
"Invalid Readwise access token": "Jeton d'accès Readwise invalide",
|
||||
"Disconnected from Readwise": "Déconnecté de Readwise",
|
||||
"Never": "Jamais",
|
||||
"Readwise Settings": "Paramètres Readwise",
|
||||
"Connected to Readwise": "Connecté à Readwise",
|
||||
"Last synced: {{time}}": "Dernière synchronisation : {{time}}",
|
||||
"Sync Enabled": "Synchronisation activée",
|
||||
"Disconnect": "Déconnecter",
|
||||
"Connect your Readwise account to sync highlights.": "Connectez votre compte Readwise pour synchroniser les surlignages.",
|
||||
"Get your access token at": "Obtenez votre jeton d'accès sur",
|
||||
"Access Token": "Jeton d'accès",
|
||||
"Paste your Readwise access token": "Collez votre jeton d'accès Readwise",
|
||||
"Config": "Configuration",
|
||||
"Readwise Sync": "Synchronisation Readwise",
|
||||
"Push Highlights": "Pousser les surlignages",
|
||||
"Highlights synced to Readwise": "Surlignages synchronisés avec Readwise",
|
||||
@@ -1132,7 +1116,6 @@
|
||||
"Copy Selection": "Copier la sélection",
|
||||
"Translate Selection": "Traduire la sélection",
|
||||
"Dictionary Lookup": "Recherche dans le dictionnaire",
|
||||
"Wikipedia Lookup": "Recherche sur Wikipédia",
|
||||
"Read Aloud Selection": "Lire la sélection à voix haute",
|
||||
"Proofread Selection": "Relire la sélection",
|
||||
"Open Settings": "Ouvrir les paramètres",
|
||||
@@ -1168,25 +1151,18 @@
|
||||
"Drag to seek": "Glisser pour chercher",
|
||||
"Punctuation Delay": "Délai de ponctuation",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Veuillez confirmer que cette connexion OPDS sera acheminée via les serveurs Readest sur l'application web avant de continuer.",
|
||||
"Custom Headers": "En-têtes personnalisés",
|
||||
"Custom Headers (optional)": "En-têtes personnalisés (facultatif)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Ajoutez un en-tête par ligne en utilisant \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Je comprends que cette connexion OPDS sera acheminée via les serveurs Readest sur l'application web. Si je ne fais pas confiance à Readest pour ces identifiants ou en-têtes, je devrais utiliser l'application native.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Impossible de se connecter à Hardcover. Veuillez vérifier votre connexion réseau.",
|
||||
"Invalid Hardcover API token": "Jeton API Hardcover invalide",
|
||||
"Disconnected from Hardcover": "Déconnecté de Hardcover",
|
||||
"Hardcover Settings": "Paramètres Hardcover",
|
||||
"Connected to Hardcover": "Connecté à Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Connectez votre compte Hardcover pour synchroniser la progression de lecture et les notes.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Obtenez votre jeton API depuis hardcover.app → Paramètres → API.",
|
||||
"API Token": "Jeton API",
|
||||
"Paste your Hardcover API token": "Collez votre jeton API Hardcover",
|
||||
"Hardcover sync enabled for this book": "Synchronisation Hardcover activée pour ce livre",
|
||||
"Hardcover sync disabled for this book": "Synchronisation Hardcover désactivée pour ce livre",
|
||||
"Hardcover Sync": "Synchronisation Hardcover",
|
||||
"Enable for This Book": "Activer pour ce livre",
|
||||
"Push Notes": "Envoyer les notes",
|
||||
"Enable Hardcover sync for this book first.": "Activez d'abord la synchronisation Hardcover pour ce livre.",
|
||||
"No annotations or excerpts to sync for this book.": "Aucune annotation ni extrait à synchroniser pour ce livre.",
|
||||
"Configure Hardcover in Settings first.": "Configurez d'abord Hardcover dans les paramètres.",
|
||||
"No new Hardcover note changes to sync.": "Aucun nouveau changement de notes Hardcover à synchroniser.",
|
||||
@@ -1200,9 +1176,266 @@
|
||||
"Split Hyphens": "Séparer les traits d'union",
|
||||
"Apply Theme Colors to PDF": "Appliquer les couleurs du thème au PDF",
|
||||
"Name": "Nom",
|
||||
"Unavailable": "Indisponible",
|
||||
"Remove": "Supprimer",
|
||||
"Edit OPDS Catalog": "Modifier le catalogue OPDS",
|
||||
"Save Changes": "Enregistrer les modifications",
|
||||
"Use Book Layout": "Utiliser la mise en page du livre"
|
||||
"Use Book Layout": "Utiliser la mise en page du livre",
|
||||
"End of this section. Continue to the next.": "Fin de cette section. Continuer à la suivante.",
|
||||
"Auto-download": "Téléchargement automatique",
|
||||
"Auto-download new items": "Télécharger automatiquement les nouveaux éléments",
|
||||
"Automatically download new publications when the app syncs": "Télécharger automatiquement les nouvelles publications lors de la synchronisation de l'application",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} nouvel élément téléchargé depuis OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "{{count}} nouveaux éléments téléchargés depuis OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} nouveaux éléments téléchargés depuis OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Échec de la synchronisation de {{count}} catalogue OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "Échec de la synchronisation de {{count}} catalogues OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Échec de la synchronisation de {{count}} catalogues OPDS",
|
||||
"Last synced {{when}}": "Dernière synchronisation {{when}}",
|
||||
"Failed downloads": "Téléchargements échoués",
|
||||
"No failed downloads": "Aucun téléchargement échoué",
|
||||
"Attempts: {{count}}_one": "Tentatives : {{count}}",
|
||||
"Attempts: {{count}}_many": "Tentatives : {{count}}",
|
||||
"Attempts: {{count}}_other": "Tentatives : {{count}}",
|
||||
"Skip": "Ignorer",
|
||||
"Skip all": "Tout ignorer",
|
||||
"Retry all": "Tout réessayer",
|
||||
"{{count}} failed_one": "{{count}} échec",
|
||||
"{{count}} failed_many": "{{count}} échecs",
|
||||
"{{count}} failed_other": "{{count}} échecs",
|
||||
"(none)": "(aucun)",
|
||||
"Identifiers": "Identifiants",
|
||||
"Read (Stream)": "Lire (Flux)",
|
||||
"Failed to start stream": "Échec du démarrage du flux",
|
||||
"No dictionaries enabled": "Aucun dictionnaire activé",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Activez un dictionnaire dans Paramètres → Langue → Dictionnaires.",
|
||||
"Wiktionary": "Wiktionnaire",
|
||||
"Drag to reorder": "Glisser pour réorganiser",
|
||||
"Built-in": "Intégré",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Le paquet est absent sur cet appareil. Ré-importez-le pour l’utiliser.",
|
||||
"This dictionary format is not supported.": "Ce format de dictionnaire n’est pas pris en charge.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} dictionnaire importé",
|
||||
"Imported {{count}} dictionary_many": "{{count}} dictionnaires importés",
|
||||
"Imported {{count}} dictionary_other": "{{count}} dictionnaires importés",
|
||||
"Skipped incomplete bundles: {{names}}": "Paquets incomplets ignorés : {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Échec de l’import du dictionnaire : {{message}}",
|
||||
"Dictionaries": "Dictionnaires",
|
||||
"Delete Dictionary": "Supprimer le dictionnaire",
|
||||
"Importing…": "Importation…",
|
||||
"Import Dictionary": "Importer un dictionnaire",
|
||||
"No dictionaries available.": "Aucun dictionnaire disponible.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Les paquets StarDict nécessitent des fichiers .ifo, .idx et .dict.dz (.syn optionnel).",
|
||||
"Select all the bundle files together when importing.": "Sélectionnez tous les fichiers du paquet ensemble lors de l’import.",
|
||||
"Manage Dictionaries": "Gérer les dictionnaires",
|
||||
"Select Dictionary Files": "Sélectionner les fichiers du dictionnaire",
|
||||
"Read on Wikipedia →": "Lire sur Wikipédia →",
|
||||
"This link can't be opened": "Impossible d'ouvrir ce lien",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Le lien d'annotation manque d'informations requises. Le lien d'origine a peut-être été tronqué.",
|
||||
"Go to Readest": "Aller sur Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Lecteur d'e-books open source pour tout le monde, sur tous les appareils.",
|
||||
"Open in Readest": "Ouvrir dans Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Si Readest ne s'est pas ouvert automatiquement, choisissez une option ci-dessous :",
|
||||
"Continue reading where you left off.": "Reprenez votre lecture là où vous l'aviez laissée.",
|
||||
"Readest logo": "Logo Readest",
|
||||
"Opening Readest...": "Ouverture de Readest…",
|
||||
"Open in Readest app": "Ouvrir dans l'application Readest",
|
||||
"Continue in browser": "Continuer dans le navigateur",
|
||||
"Don't have Readest?": "Vous n'avez pas Readest ?",
|
||||
"Book not in your library": "Livre absent de votre bibliothèque",
|
||||
"Share Book": "Partager le livre",
|
||||
"Could not create share link": "Impossible de créer le lien de partage",
|
||||
"Link copied": "Lien copié",
|
||||
"Could not copy link": "Impossible de copier le lien",
|
||||
"Share revoked": "Partage révoqué",
|
||||
"Could not revoke share": "Impossible de révoquer le partage",
|
||||
"Uploading book…": "Téléchargement du livre…",
|
||||
"Generating…": "Génération…",
|
||||
"Generate share link": "Créer un lien de partage",
|
||||
"Share URL": "URL de partage",
|
||||
"Copy link": "Copier le lien",
|
||||
"Copied": "Copié",
|
||||
"Share via…": "Partager via…",
|
||||
"Expires {{date}}": "Expire le {{date}}",
|
||||
"Revoking…": "Révocation…",
|
||||
"Revoke share": "Révoquer le partage",
|
||||
"Sign in to share books": "Connectez-vous pour partager des livres",
|
||||
"Expiring soon": "Expire bientôt",
|
||||
"Missing share token": "Jeton de partage manquant",
|
||||
"Could not add to your library": "Impossible d'ajouter à votre bibliothèque",
|
||||
"This share link is no longer available": "Ce lien de partage n'est plus disponible",
|
||||
"The original link may have expired or been revoked.": "Le lien original a peut-être expiré ou été révoqué.",
|
||||
"Get Readest": "Obtenir Readest",
|
||||
"Loading shared book…": "Chargement du livre partagé…",
|
||||
"Adding…": "Ajout…",
|
||||
"Add to my library": "Ajouter à ma bibliothèque",
|
||||
"Could not load your shares": "Impossible de charger vos partages",
|
||||
"Revoked": "Révoqué",
|
||||
"Expired": "Expiré",
|
||||
"Shared books": "Livres partagés",
|
||||
"You haven't shared any books yet": "Vous n’avez encore partagé aucun livre",
|
||||
"Open a book and tap Share to send it to a friend.": "Ouvrez un livre et appuyez sur Partager pour l’envoyer à un ami.",
|
||||
"{{count}} active_one": "{{count}} actif",
|
||||
"{{count}} active_many": "{{count}} actifs",
|
||||
"{{count}} active_other": "{{count}} actifs",
|
||||
"{{count}} downloads_one": "{{count}} téléchargement",
|
||||
"{{count}} downloads_many": "{{count}} téléchargements",
|
||||
"{{count}} downloads_other": "{{count}} téléchargements",
|
||||
"starts at saved page": "commence à la page enregistrée",
|
||||
"More actions": "Plus d’actions",
|
||||
"Loading…": "Chargement…",
|
||||
"Load more": "Charger plus",
|
||||
"Could not load shared book": "Impossible de charger le livre partagé",
|
||||
"The share link is missing required information.": "Il manque des informations nécessaires au lien de partage.",
|
||||
"Please check your connection and try again.": "Vérifiez votre connexion et réessayez.",
|
||||
"Sign in to import shared books": "Connectez-vous pour importer des livres partagés",
|
||||
"Already in your library": "Déjà dans votre bibliothèque",
|
||||
"Added to your library": "Ajouté à votre bibliothèque",
|
||||
"Could not import shared book": "Impossible d'importer le livre partagé",
|
||||
"Manage Shared Links": "Gérer les liens de partage",
|
||||
"Expires in": "Expire dans",
|
||||
"{{count}} days_one": "1 jour",
|
||||
"{{count}} days_many": "{{count}} jours",
|
||||
"{{count}} days_other": "{{count}} jours",
|
||||
"Expires in {{count}} days_one": "Expire dans 1 jour",
|
||||
"Expires in {{count}} days_many": "Expire dans {{count}} jours",
|
||||
"Expires in {{count}} days_other": "Expire dans {{count}} jours",
|
||||
"Expires in {{count}} hours_one": "Expire dans 1 heure",
|
||||
"Expires in {{count}} hours_many": "Expire dans {{count}} heures",
|
||||
"Expires in {{count}} hours_other": "Expire dans {{count}} heures",
|
||||
"Open in app": "Ouvrir dans l'app",
|
||||
"Shared with you": "Partagé avec vous",
|
||||
"Downloading… {{percent}}%": "Téléchargement… {{percent}} %",
|
||||
"Import progress": "Progression de l’importation",
|
||||
"Share reading progress": "Partager la progression de lecture",
|
||||
"Includes your reading progress": "Inclut votre progression de lecture",
|
||||
"Synced {{time}}": "Synchronisé {{time}}",
|
||||
"Sync Info": "Infos de synchronisation",
|
||||
"Last Synced": "Dernière synchronisation",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Les paquets DICT nécessitent un fichier .index et un fichier .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Les paquets Slob nécessitent un fichier .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Le modèle d'URL doit commencer par http(s):// et contenir %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Ajouter une recherche web",
|
||||
"Edit Web Search": "Modifier la recherche web",
|
||||
"e.g. Google": "ex. Google",
|
||||
"URL Template": "Modèle d'URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Utilisez %WORD% à l'endroit où le mot recherché doit apparaître.",
|
||||
"Open the search result in your browser:": "Ouvrir le résultat de la recherche dans votre navigateur :",
|
||||
"Open in {{name}}": "Ouvrir dans {{name}}",
|
||||
"Book Fingerprint": "Empreinte du livre",
|
||||
"Search the web": "Rechercher sur le web",
|
||||
"App deeplink (readest://)": "Lien profond de l’application (readest://)",
|
||||
"Universal web link (https://)": "Lien web universel (https://)",
|
||||
"Name cannot be empty.": "Le nom ne peut pas être vide.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} dictionnaire existant remplacé",
|
||||
"Replaced {{count}} existing dictionary_many": "{{count}} dictionnaires existants remplacés",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} dictionnaires existants remplacés",
|
||||
"Cancel Edit": "Annuler la modification",
|
||||
"Edit Dictionary": "Modifier le dictionnaire",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Les bundles MDict utilisent des fichiers .mdx ; les fichiers .mdd et .css associés sont facultatifs.",
|
||||
"Dictionary name": "Nom du dictionnaire",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Cet audio ne peut pas être lu ici — le dictionnaire utilise un format obsolète. Essayez-en un avec un audio Opus, MP3 ou WAV.",
|
||||
"File uploaded: {{title}}": "Fichier téléchargé : {{title}}",
|
||||
"File downloaded: {{title}}": "Fichier téléchargé : {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Suppression de la copie cloud du fichier : {{title}}",
|
||||
"Failed to upload file: {{title}}": "Échec du téléchargement du fichier : {{title}}",
|
||||
"Failed to download file: {{title}}": "Échec du téléchargement du fichier : {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Échec de la suppression de la copie cloud du fichier : {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}} % utilisés",
|
||||
"Set PIN…": "Définir le PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Exiger un PIN à 4 chiffres pour ouvrir Readest",
|
||||
"Change PIN…": "Modifier le PIN…",
|
||||
"Disable PIN…": "Désactiver le PIN…",
|
||||
"Sync passphrase ready": "Phrase secrète de synchronisation prête",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Cela supprime définitivement les identifiants chiffrés que nous synchronisons (par exemple, les mots de passe du catalogue OPDS) sur chaque appareil. Les copies locales sont conservées. Vous devrez ressaisir la phrase secrète de synchronisation ou en définir une nouvelle. Continuer ?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Phrase secrète de synchronisation oubliée — tous les champs chiffrés ont été effacés",
|
||||
"Sync passphrase": "Phrase secrète de synchronisation",
|
||||
"Set passphrase": "Définir la phrase secrète",
|
||||
"Forgot passphrase": "Phrase secrète oubliée",
|
||||
"Incorrect PIN": "PIN incorrect",
|
||||
"App locked": "Application verrouillée",
|
||||
"Enter your PIN": "Saisissez votre PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest est verrouillé. Saisissez votre PIN à 4 chiffres pour continuer.",
|
||||
"PIN code": "Code PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Si vous oubliez votre PIN, vous serez verrouillé hors de cet appareil. Vous devrez effacer les données de l'application pour le réinitialiser.",
|
||||
"Passphrase must be at least 8 characters": "La phrase secrète doit comporter au moins 8 caractères",
|
||||
"Passphrases do not match": "Les phrases secrètes ne correspondent pas",
|
||||
"Set sync passphrase": "Définir la phrase secrète de synchronisation",
|
||||
"Enter sync passphrase": "Saisir la phrase secrète de synchronisation",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Une phrase secrète de synchronisation chiffre vos champs sensibles (comme les identifiants du catalogue OPDS) avant qu'ils ne soient synchronisés. Nous ne voyons jamais cette phrase secrète. Choisissez quelque chose de mémorable — il n'y a pas de récupération sans elle.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Saisissez la phrase secrète de synchronisation que vous avez définie sur un autre appareil pour déchiffrer vos identifiants synchronisés.",
|
||||
"Confirm passphrase": "Confirmer la phrase secrète",
|
||||
"Unlock": "Déverrouiller",
|
||||
"Set PIN": "Définir le PIN",
|
||||
"Change PIN": "Modifier le PIN",
|
||||
"Disable PIN": "Désactiver le PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Saisissez votre PIN actuel, puis choisissez un nouveau PIN à 4 chiffres.",
|
||||
"Enter your current PIN to disable the app lock.": "Saisissez votre PIN actuel pour désactiver le verrouillage de l'application.",
|
||||
"PIN must be {{length}} digits": "Le PIN doit comporter {{length}} chiffres",
|
||||
"PINs do not match": "Les PIN ne correspondent pas",
|
||||
"Current PIN": "PIN actuel",
|
||||
"New PIN": "Nouveau PIN",
|
||||
"Confirm new PIN": "Confirmer le nouveau PIN",
|
||||
"Manage Sync": "Gérer la synchronisation",
|
||||
"Imported book files and library metadata": "Fichiers de livres importés et métadonnées de la bibliothèque",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Dernière position de lecture, signets et préférences par livre",
|
||||
"Highlights and notes": "Surlignages et notes",
|
||||
"Fonts": "Polices",
|
||||
"Custom font files": "Fichiers de polices personnalisées",
|
||||
"Backgrounds": "Arrière-plans",
|
||||
"Custom background textures": "Textures d'arrière-plan personnalisées",
|
||||
"OPDS catalogs": "Catalogues OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URLs de catalogues enregistrées et identifiants (chiffrés)",
|
||||
"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",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Les données de phrase secrète de synchronisation sur le serveur ont été réinitialisées. Rechiffrement de vos identifiants avec la nouvelle phrase secrète…",
|
||||
"Failed to decrypt synced credentials": "Impossible de déchiffrer les identifiants synchronisés",
|
||||
"Imported dictionary bundles and settings": "Paquets de dictionnaires importés et paramètres",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Choisissez ce qui est synchronisé entre vos appareils. Désactiver une catégorie empêche cet appareil d'envoyer ou de recevoir des entrées de ce type. Ce qui est déjà sur le serveur reste intact, la réactivation reprend là où vous vous étiez arrêté.",
|
||||
"Data Sync": "Synchronisation des données",
|
||||
"Manage Fonts": "Gérer les polices",
|
||||
"App settings": "Paramètres de l’application",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Thème, couleurs de surlignage, intégrations (KOSync, Readwise, Hardcover) et ordre des dictionnaires",
|
||||
"Required while Dictionaries sync is enabled": "Requis tant que la synchronisation des dictionnaires est activée",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Réinitialisation dans {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Choisissez un code PIN à 4 chiffres. Vous devrez le saisir chaque fois que vous ouvrirez Readest. Il n'existe aucun moyen de récupérer un code PIN oublié. Effacer les données de l'application est le seul moyen de le réinitialiser.",
|
||||
"Credentials": "Identifiants",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Jetons, noms d'utilisateur et mots de passe pour OPDS, KOReader, Hardcover et Readwise. Lorsqu'ils sont désactivés, les identifiants restent uniquement sur cet appareil et ne sont jamais téléversés.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Les champs sensibles synchronisés sont chiffrés avant l'envoi. Définissez une phrase de passe maintenant ou plus tard, lorsque le chiffrement sera nécessaire.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Enregistrée sur ce compte. Elle vous sera demandée lors du déchiffrement des identifiants.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "La progression de lecture sur cet appareil diffère de « {{deviceName}} ».",
|
||||
"This device": "Cet appareil",
|
||||
"Red": "Rouge",
|
||||
"Yellow": "Jaune",
|
||||
"Green": "Vert",
|
||||
"Blue": "Bleu",
|
||||
"Violet": "Violet",
|
||||
"Edit color": "Modifier la couleur",
|
||||
"Add custom color": "Ajouter une couleur personnalisée",
|
||||
"Add label": "Ajouter une étiquette",
|
||||
"Choose color": "Choisir une couleur",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Connecté à Hardcover. Dernière synchronisation {{time}}.",
|
||||
"Integrations": "Intégrations",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Connecté à Readwise. Dernière synchronisation {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Parcourez et téléchargez des livres depuis des catalogues en ligne.",
|
||||
"Connected as {{user}}": "Connecté en tant que {{user}}",
|
||||
"Not connected": "Non connecté",
|
||||
"{{count}} catalog_one": "{{count}} catalogue",
|
||||
"{{count}} catalog_many": "{{count}} catalogues",
|
||||
"{{count}} catalog_other": "{{count}} catalogues",
|
||||
"No catalogs": "Aucun catalogue",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Connectez Readest à des services externes pour la synchronisation, les surlignages et les catalogues.",
|
||||
"Reading Sync": "Synchronisation de lecture",
|
||||
"Content Sources": "Sources de contenu",
|
||||
"Scroll tabs": "Faire défiler les onglets",
|
||||
"Catalog actions": "Actions du catalogue",
|
||||
"File Content": "Contenu du fichier",
|
||||
"Start your library": "Commencez votre bibliothèque",
|
||||
"Pick a book from your device to add it to your library.": "Choisissez un livre depuis votre appareil à ajouter à votre bibliothèque.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Déposez un livre n'importe où sur cette fenêtre, ou choisissez-en un depuis votre ordinateur.",
|
||||
"Sign in to sync your library": "Connectez-vous pour synchroniser votre bibliothèque"
|
||||
}
|
||||
|
||||
@@ -130,7 +130,6 @@
|
||||
"Cloud File Transfers": "העברות קבצים בענן",
|
||||
"{{activeCount}} active, {{pendingCount}} pending": "{{activeCount}} פעילים, {{pendingCount}} בהמתנה",
|
||||
"{{failedCount}} failed": "{{failedCount}} נכשלו",
|
||||
"Synced at {{time}}": "סונכרן ב-{{time}}",
|
||||
"Never synced": "מעולם לא סונכרן",
|
||||
"Account": "חשבון",
|
||||
"Sign In": "התחבר",
|
||||
@@ -218,7 +217,6 @@
|
||||
"Failed to delete local copy of the book: {{title}}": "מחיקת העעותק המקומי של הספר נכשלה: {{title}}",
|
||||
"Library Header": "כותרת הספרייה",
|
||||
"Library Sync Progress": "התקדמות סנכרון הספרייה",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "ברוכים הבאים לספרייה שלכם. כאן תוכלו לייבא את הספרים שלכם ולקרוא אותם בכל עת.",
|
||||
"URL must start with http:// or https://": "הכתובת חייבת להתחיל ב-http:// או https://",
|
||||
"Adding LAN addresses is not supported in the web app version.": "הוספת כתובות LAN אינה נתמכת בגרסת אפליקציית האינטרנט.",
|
||||
"Invalid OPDS catalog. Please check the URL.": "קטלוג OPDS לא תקין. אנא בדוק את הכתובת.",
|
||||
@@ -291,7 +289,6 @@
|
||||
"Dictionary": "מילון",
|
||||
"Look up text in dictionary after selection": "חפש טקסט במילון לאחר הבחירה",
|
||||
"Wikipedia": "ויקיפדיה",
|
||||
"Look up text in Wikipedia after selection": "חפש טקסט בוויקיפדיה לאחר הבחירה",
|
||||
"Translate": "תרגם",
|
||||
"Translate text after selection": "תרגם טקסט לאחר הבחירה",
|
||||
"Speak": "הקרא",
|
||||
@@ -389,9 +386,6 @@
|
||||
"System Language": "שפת המערכת",
|
||||
"No translation available.": "אין תרגום זמין.",
|
||||
"Translated by {{provider}}.": "תורגם על ידי {{provider}}.",
|
||||
"Error": "שגיאה",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "לא ניתן לטעון את המאמר. נסה לחפש ישירות ב-{{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "לא ניתן לטעון את המילה. נסה לחפש ישירות ב-{{link}}.",
|
||||
"Remove Bookmark": "הסר סימנייה",
|
||||
"Add Bookmark": "הוסף סימנייה",
|
||||
"Books Content": "תוכן ספרים",
|
||||
@@ -419,13 +413,9 @@
|
||||
"View Options": "אפשרויות תצוגה",
|
||||
"Close Book": "סגור ספר",
|
||||
"Sync Conflict": "קונפליקט סנכרון",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "האם לסנכרן התקדמות קריאה מ-{{deviceName}}?",
|
||||
"another device": "מכשיר אחר",
|
||||
"Local Progress": "התקדמות מקומית",
|
||||
"Remote Progress": "התקדמות מרחוק",
|
||||
"Failed to connect": "החיבור נכשל",
|
||||
"Disconnected": "מנותק",
|
||||
"KOReader Sync Settings": "הגדרות סנכרון KOReader",
|
||||
"Sync as {{userDisplayName}}": "סנכרן כ-{{userDisplayName}}",
|
||||
"Sync Server Connected": "שרת הסנכרון מחובר",
|
||||
"Sync Strategy": "אסטרטגיית סנכרון",
|
||||
@@ -434,7 +424,6 @@
|
||||
"Send changes only": "שלח שינויים בלבד",
|
||||
"Receive changes only": "קבל שינויים בלבד",
|
||||
"Checksum Method": "שיטת סיכום ביקורת (Checksum)",
|
||||
"File Content (recommended)": "תוכן קובץ (מומלץ)",
|
||||
"File Name": "שם קובץ",
|
||||
"Device Name": "שם מכשיר",
|
||||
"Connect to your KOReader Sync server.": "התחבר לשרת סנכרון KOReader שלך.",
|
||||
@@ -847,7 +836,6 @@
|
||||
"Strikethrough": "קו חוצה",
|
||||
"Squiggly": "קו גלי",
|
||||
"Outline": "מתאר (Outline)",
|
||||
"Save Current Color": "שמור צבע נוכחי",
|
||||
"Quick Colors": "צבעים מהירים",
|
||||
"Override Book Color": "דרוס צבע ספר",
|
||||
"None": "ללא",
|
||||
@@ -1051,16 +1039,12 @@
|
||||
"Invalid Readwise access token": "אסימون גישה של Readwise לא חוקי",
|
||||
"Disconnected from Readwise": "נותק מ-Readwise",
|
||||
"Never": "לעולם לא",
|
||||
"Readwise Settings": "הגדרות Readwise",
|
||||
"Connected to Readwise": "מחובר ל-Readwise",
|
||||
"Last synced: {{time}}": "סונכרן לאחרונה: {{time}}",
|
||||
"Sync Enabled": "סנכרון מופעל",
|
||||
"Disconnect": "נתק",
|
||||
"Connect your Readwise account to sync highlights.": "חבר את חשבון Readwise שלך כדי לסנכרן את ההדגשות.",
|
||||
"Get your access token at": "קבל את אסימון הגישה שלך ב-",
|
||||
"Access Token": "אסימון גישה",
|
||||
"Paste your Readwise access token": "הדבק את אסימון הגישה של Readwise שלך",
|
||||
"Config": "תצורה",
|
||||
"Readwise Sync": "סנכרון Readwise",
|
||||
"Push Highlights": "שלח הדגשות",
|
||||
"Highlights synced to Readwise": "ההדגשות סונכרנו ל-Readwise",
|
||||
@@ -1132,7 +1116,6 @@
|
||||
"Copy Selection": "העתק בחירה",
|
||||
"Translate Selection": "תרגם בחירה",
|
||||
"Dictionary Lookup": "חיפוש במילון",
|
||||
"Wikipedia Lookup": "חיפוש בוויקיפדיה",
|
||||
"Read Aloud Selection": "קרא בקול את הבחירה",
|
||||
"Proofread Selection": "הגה בחירה",
|
||||
"Open Settings": "פתח הגדרות",
|
||||
@@ -1168,25 +1151,18 @@
|
||||
"Drag to seek": "גרור לחיפוש",
|
||||
"Punctuation Delay": "השהיית פיסוק",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "אנא אשר שחיבור OPDS זה יועבר דרך שרתי Readest באפליקציית האינטרנט לפני שתמשיך.",
|
||||
"Custom Headers": "כותרות מותאמות אישית",
|
||||
"Custom Headers (optional)": "כותרות מותאמות אישית (אופציונלי)",
|
||||
"Add one header per line using \"Header-Name: value\".": "הוסף כותרת אחת לכל שורה בפורמט \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "אני מבין שחיבור OPDS זה יועבר דרך שרתי Readest באפליקציית האינטרנט. אם אינני סומך על Readest עם פרטי ההתחברות או הכותרות האלה, עליי להשתמש באפליקציה המקורית.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "לא ניתן להתחבר ל-Hardcover. אנא בדוק את חיבור הרשת שלך.",
|
||||
"Invalid Hardcover API token": "טוקן API של Hardcover לא חוקי",
|
||||
"Disconnected from Hardcover": "מנותק מ-Hardcover",
|
||||
"Hardcover Settings": "הגדרות Hardcover",
|
||||
"Connected to Hardcover": "מחובר ל-Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "חבר את חשבון ה-Hardcover שלך לסנכרון התקדמות קריאה והערות.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "קבל את טוקן ה-API שלך מ-hardcover.app ← הגדרות ← API.",
|
||||
"API Token": "טוקן API",
|
||||
"Paste your Hardcover API token": "הדבק את טוקן ה-API של Hardcover שלך",
|
||||
"Hardcover sync enabled for this book": "סנכרון Hardcover הופעל לספר זה",
|
||||
"Hardcover sync disabled for this book": "סנכרון Hardcover הושבת לספר זה",
|
||||
"Hardcover Sync": "סנכרון Hardcover",
|
||||
"Enable for This Book": "הפעל לספר זה",
|
||||
"Push Notes": "שלח הערות",
|
||||
"Enable Hardcover sync for this book first.": "הפעל תחילה סנכרון Hardcover לספר זה.",
|
||||
"No annotations or excerpts to sync for this book.": "אין הערות או ציטוטים לסנכרון עבור ספר זה.",
|
||||
"Configure Hardcover in Settings first.": "הגדר תחילה את Hardcover בהגדרות.",
|
||||
"No new Hardcover note changes to sync.": "אין שינויים חדשים בהערות Hardcover לסנכרון.",
|
||||
@@ -1200,9 +1176,266 @@
|
||||
"Split Hyphens": "פיצול מקפים",
|
||||
"Apply Theme Colors to PDF": "החל צבעי ערכת נושא על PDF",
|
||||
"Name": "שם",
|
||||
"Unavailable": "לא זמין",
|
||||
"Remove": "הסר",
|
||||
"Edit OPDS Catalog": "עריכת קטלוג OPDS",
|
||||
"Save Changes": "שמור שינויים",
|
||||
"Use Book Layout": "השתמש בפריסת הספר"
|
||||
"Use Book Layout": "השתמש בפריסת הספר",
|
||||
"End of this section. Continue to the next.": "סוף הסעיף הזה. המשך לסעיף הבא.",
|
||||
"Auto-download": "הורדה אוטומטית",
|
||||
"Auto-download new items": "הורד פריטים חדשים באופן אוטומטי",
|
||||
"Automatically download new publications when the app syncs": "הורדה אוטומטית של פרסומים חדשים כאשר האפליקציה מסתנכרנת",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "פריט חדש אחד הורד מ-OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_two": "{{count}} פריטים חדשים הורדו מ-OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} פריטים חדשים הורדו מ-OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "סנכרון קטלוג OPDS אחד נכשל",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_two": "סנכרון {{count}} קטלוגי OPDS נכשל",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "סנכרון {{count}} קטלוגי OPDS נכשל",
|
||||
"Last synced {{when}}": "סנכרון אחרון {{when}}",
|
||||
"Failed downloads": "הורדות שנכשלו",
|
||||
"No failed downloads": "אין הורדות שנכשלו",
|
||||
"Attempts: {{count}}_one": "ניסיונות: {{count}}",
|
||||
"Attempts: {{count}}_two": "ניסיונות: {{count}}",
|
||||
"Attempts: {{count}}_other": "ניסיונות: {{count}}",
|
||||
"Skip": "דלג",
|
||||
"Skip all": "דלג על הכל",
|
||||
"Retry all": "נסה שוב את הכל",
|
||||
"{{count}} failed_one": "{{count}} נכשל",
|
||||
"{{count}} failed_two": "{{count}} נכשלו",
|
||||
"{{count}} failed_other": "{{count}} נכשלו",
|
||||
"(none)": "(אין)",
|
||||
"Identifiers": "מזהים",
|
||||
"Read (Stream)": "קרא (זרם)",
|
||||
"Failed to start stream": "הפעלת הזרם נכשלה",
|
||||
"No dictionaries enabled": "לא הופעלו מילונים",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "הפעילו מילון מההגדרות ← שפה ← מילונים.",
|
||||
"Wiktionary": "ויקימילון",
|
||||
"Drag to reorder": "גררו כדי לסדר מחדש",
|
||||
"Built-in": "מובנה",
|
||||
"Bundle is missing on this device. Re-import to use it.": "החבילה חסרה במכשיר הזה. ייבאו מחדש כדי להשתמש בה.",
|
||||
"This dictionary format is not supported.": "תבנית המילון הזו אינה נתמכת.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "יובא {{count}} מילון",
|
||||
"Imported {{count}} dictionary_two": "יובאו שני מילונים",
|
||||
"Imported {{count}} dictionary_other": "יובאו {{count}} מילונים",
|
||||
"Skipped incomplete bundles: {{names}}": "דולגו על חבילות לא שלמות: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "ייבוא המילון נכשל: {{message}}",
|
||||
"Dictionaries": "מילונים",
|
||||
"Delete Dictionary": "מחק מילון",
|
||||
"Importing…": "מייבא…",
|
||||
"Import Dictionary": "ייבא מילון",
|
||||
"No dictionaries available.": "אין מילונים זמינים.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "חבילות StarDict דורשות קבצי .ifo, .idx ו-.dict.dz (.syn אופציונלי).",
|
||||
"Select all the bundle files together when importing.": "בחרו את כל קבצי החבילה יחד בעת הייבוא.",
|
||||
"Manage Dictionaries": "ניהול מילונים",
|
||||
"Select Dictionary Files": "בחירת קבצי מילון",
|
||||
"Read on Wikipedia →": "קראו בוויקיפדיה →",
|
||||
"This link can't be opened": "לא ניתן לפתוח את הקישור",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "בקישור ההערה חסר מידע נדרש. ייתכן שהקישור המקורי נקטע.",
|
||||
"Go to Readest": "מעבר אל Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "קורא ספרים אלקטרוניים בקוד פתוח לכולם, בכל מכשיר.",
|
||||
"Open in Readest": "פתיחה ב-Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "אם Readest לא נפתח אוטומטית, בחרו אפשרות מהאפשרויות שלמטה:",
|
||||
"Continue reading where you left off.": "המשיכו לקרוא מהמקום שעצרתם.",
|
||||
"Readest logo": "הסמל של Readest",
|
||||
"Opening Readest...": "פותח את Readest…",
|
||||
"Open in Readest app": "פתיחה באפליקציית Readest",
|
||||
"Continue in browser": "המשך בדפדפן",
|
||||
"Don't have Readest?": "אין לך את Readest?",
|
||||
"Book not in your library": "הספר אינו בספרייה שלך",
|
||||
"Share Book": "שיתוף ספר",
|
||||
"Could not create share link": "לא ניתן היה ליצור קישור שיתוף",
|
||||
"Link copied": "הקישור הועתק",
|
||||
"Could not copy link": "לא ניתן היה להעתיק את הקישור",
|
||||
"Share revoked": "השיתוף בוטל",
|
||||
"Could not revoke share": "לא ניתן היה לבטל את השיתוף",
|
||||
"Uploading book…": "מעלה ספר…",
|
||||
"Generating…": "יוצר…",
|
||||
"Generate share link": "צור קישור שיתוף",
|
||||
"Share URL": "כתובת שיתוף",
|
||||
"Copy link": "העתק קישור",
|
||||
"Copied": "הועתק",
|
||||
"Share via…": "שתף באמצעות…",
|
||||
"Expires {{date}}": "יפוג ב-{{date}}",
|
||||
"Revoking…": "מבטל…",
|
||||
"Revoke share": "בטל שיתוף",
|
||||
"Sign in to share books": "היכנס כדי לשתף ספרים",
|
||||
"Expiring soon": "יפוג בקרוב",
|
||||
"Missing share token": "אסימון שיתוף חסר",
|
||||
"Could not add to your library": "לא ניתן היה להוסיף לספרייה שלך",
|
||||
"This share link is no longer available": "קישור השיתוף הזה כבר אינו זמין",
|
||||
"The original link may have expired or been revoked.": "הקישור המקורי אולי פג תוקפו או בוטל.",
|
||||
"Get Readest": "הורד את Readest",
|
||||
"Loading shared book…": "טוען ספר משותף…",
|
||||
"Adding…": "מוסיף…",
|
||||
"Add to my library": "הוסף לספרייה שלי",
|
||||
"Could not load your shares": "לא ניתן היה לטעון את השיתופים שלך",
|
||||
"Revoked": "בוטל",
|
||||
"Expired": "פג תוקף",
|
||||
"Shared books": "ספרים משותפים",
|
||||
"You haven't shared any books yet": "עדיין לא שיתפת ספרים",
|
||||
"Open a book and tap Share to send it to a friend.": "פתח ספר והקש על שיתוף כדי לשלוח אותו לחבר.",
|
||||
"{{count}} active_one": "{{count}} פעיל",
|
||||
"{{count}} active_two": "{{count}} פעילים",
|
||||
"{{count}} active_other": "{{count}} פעילים",
|
||||
"{{count}} downloads_one": "הורדה אחת",
|
||||
"{{count}} downloads_two": "{{count}} הורדות",
|
||||
"{{count}} downloads_other": "{{count}} הורדות",
|
||||
"starts at saved page": "מתחיל בעמוד השמור",
|
||||
"More actions": "פעולות נוספות",
|
||||
"Loading…": "טוען…",
|
||||
"Load more": "טען עוד",
|
||||
"Could not load shared book": "לא ניתן היה לטעון את הספר המשותף",
|
||||
"The share link is missing required information.": "בקישור השיתוף חסר מידע נדרש.",
|
||||
"Please check your connection and try again.": "בדוק את החיבור שלך ונסה שוב.",
|
||||
"Sign in to import shared books": "היכנס כדי לייבא ספרים משותפים",
|
||||
"Already in your library": "כבר בספרייה שלך",
|
||||
"Added to your library": "נוסף לספרייה שלך",
|
||||
"Could not import shared book": "לא ניתן היה לייבא את הספר המשותף",
|
||||
"Manage Shared Links": "ניהול קישורי שיתוף",
|
||||
"Expires in": "יפוג בעוד",
|
||||
"{{count}} days_one": "יום אחד",
|
||||
"{{count}} days_two": "יומיים",
|
||||
"{{count}} days_other": "{{count}} ימים",
|
||||
"Expires in {{count}} days_one": "יפוג בעוד יום",
|
||||
"Expires in {{count}} days_two": "יפוג בעוד יומיים",
|
||||
"Expires in {{count}} days_other": "יפוג בעוד {{count}} ימים",
|
||||
"Expires in {{count}} hours_one": "יפוג בעוד שעה",
|
||||
"Expires in {{count}} hours_two": "יפוג בעוד שעתיים",
|
||||
"Expires in {{count}} hours_other": "יפוג בעוד {{count}} שעות",
|
||||
"Open in app": "פתח באפליקציה",
|
||||
"Shared with you": "שותף איתך",
|
||||
"Downloading… {{percent}}%": "מוריד… {{percent}}%",
|
||||
"Import progress": "התקדמות הייבוא",
|
||||
"Share reading progress": "שיתוף התקדמות הקריאה",
|
||||
"Includes your reading progress": "כולל את התקדמות הקריאה שלך",
|
||||
"Synced {{time}}": "סונכרן {{time}}",
|
||||
"Sync Info": "פרטי סנכרון",
|
||||
"Last Synced": "סונכרן לאחרונה",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "חבילות DICT דורשות קובץ .index וקובץ .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "חבילות Slob דורשות קובץ .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "תבנית כתובת ה-URL חייבת להתחיל ב-http(s):// ולהכיל %WORD%.",
|
||||
"Web": "אינטרנט",
|
||||
"Add Web Search": "הוסף חיפוש באינטרנט",
|
||||
"Edit Web Search": "ערוך חיפוש באינטרנט",
|
||||
"e.g. Google": "לדוגמה: Google",
|
||||
"URL Template": "תבנית URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "השתמש ב-%WORD% היכן שהמילה המבוקשת צריכה להופיע.",
|
||||
"Open the search result in your browser:": "פתח את תוצאת החיפוש בדפדפן שלך:",
|
||||
"Open in {{name}}": "פתח ב-{{name}}",
|
||||
"Book Fingerprint": "טביעת אצבע של הספר",
|
||||
"Search the web": "חיפוש באינטרנט",
|
||||
"App deeplink (readest://)": "קישור עמוק לאפליקציה (readest://)",
|
||||
"Universal web link (https://)": "קישור אינטרנט אוניברסלי (https://)",
|
||||
"Name cannot be empty.": "השם אינו יכול להיות ריק.",
|
||||
"Replaced {{count}} existing dictionary_one": "הוחלף {{count}} מילון קיים",
|
||||
"Replaced {{count}} existing dictionary_two": "הוחלפו {{count}} מילונים קיימים",
|
||||
"Replaced {{count}} existing dictionary_other": "הוחלפו {{count}} מילונים קיימים",
|
||||
"Cancel Edit": "בטל עריכה",
|
||||
"Edit Dictionary": "ערוך מילון",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "חבילות MDict משתמשות בקובצי .mdx; קובצי .mdd ו‑.css נלווים הם אופציונליים.",
|
||||
"Dictionary name": "שם המילון",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "לא ניתן להשמיע את השמע הזה כאן — המילון משתמש בפורמט מיושן. נסה מילון עם שמע Opus, MP3 או WAV.",
|
||||
"File uploaded: {{title}}": "הקובץ הועלה: {{title}}",
|
||||
"File downloaded: {{title}}": "קובץ הורד: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "עותק הענן של הקובץ נמחק: {{title}}",
|
||||
"Failed to upload file: {{title}}": "העלאת הקובץ נכשלה: {{title}}",
|
||||
"Failed to download file: {{title}}": "הורדת הקובץ נכשלה: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "מחיקת עותק הענן של הקובץ נכשלה: {{title}}",
|
||||
"{{percentage}}% used": "נוצלו {{percentage}}%",
|
||||
"Set PIN…": "הגדר PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "דרוש PIN בן 4 ספרות כדי לפתוח את Readest",
|
||||
"Change PIN…": "שנה PIN…",
|
||||
"Disable PIN…": "השבת PIN…",
|
||||
"Sync passphrase ready": "ביטוי הסיסמה לסנכרון מוכן",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "פעולה זו מוחקת לצמיתות את פרטי ההתחברות המוצפנים שאנו מסנכרנים (למשל, סיסמאות קטלוג OPDS) בכל מכשיר. עותקים מקומיים נשמרים. תצטרך להזין מחדש את ביטוי הסיסמה לסנכרון או להגדיר אחד חדש. להמשיך?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "ביטוי הסיסמה לסנכרון נשכח — כל השדות המוצפנים נמחקו",
|
||||
"Sync passphrase": "ביטוי סיסמה לסנכרון",
|
||||
"Set passphrase": "הגדרת ביטוי סיסמה",
|
||||
"Forgot passphrase": "שכחת את ביטוי הסיסמה",
|
||||
"Incorrect PIN": "PIN שגוי",
|
||||
"App locked": "האפליקציה נעולה",
|
||||
"Enter your PIN": "הזן את ה-PIN שלך",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest נעול. הזן את ה-PIN בן 4 הספרות שלך כדי להמשיך.",
|
||||
"PIN code": "קוד PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "שכחת ה-PIN תנעל אותך מחוץ למכשיר זה. תצטרך לנקות את נתוני האפליקציה כדי לאפס אותו.",
|
||||
"Passphrase must be at least 8 characters": "ביטוי הסיסמה חייב להכיל לפחות 8 תווים",
|
||||
"Passphrases do not match": "ביטויי הסיסמה אינם תואמים",
|
||||
"Set sync passphrase": "הגדרת ביטוי סיסמה לסנכרון",
|
||||
"Enter sync passphrase": "הזן ביטוי סיסמה לסנכרון",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "ביטוי סיסמה לסנכרון מצפין את השדות הרגישים שלך (כמו פרטי התחברות לקטלוג OPDS) לפני שהם מסונכרנים. אנו לעולם לא רואים את ביטוי הסיסמה הזה. בחר משהו זכיר — אין שחזור בלעדיו.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "הזן את ביטוי הסיסמה לסנכרון שהגדרת במכשיר אחר כדי לפענח את פרטי ההתחברות המסונכרנים שלך.",
|
||||
"Confirm passphrase": "אישור ביטוי הסיסמה",
|
||||
"Unlock": "פתח",
|
||||
"Set PIN": "הגדר PIN",
|
||||
"Change PIN": "שנה PIN",
|
||||
"Disable PIN": "השבת PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "הזן את ה-PIN הנוכחי שלך, ולאחר מכן בחר PIN חדש בן 4 ספרות.",
|
||||
"Enter your current PIN to disable the app lock.": "הזן את ה-PIN הנוכחי שלך כדי להשבית את נעילת האפליקציה.",
|
||||
"PIN must be {{length}} digits": "ה-PIN חייב להיות בן {{length}} ספרות",
|
||||
"PINs do not match": "ה-PINs אינם תואמים",
|
||||
"Current PIN": "PIN נוכחי",
|
||||
"New PIN": "PIN חדש",
|
||||
"Confirm new PIN": "אשר PIN חדש",
|
||||
"Manage Sync": "ניהול סנכרון",
|
||||
"Imported book files and library metadata": "קובצי ספרים מיובאים ומטא-נתוני הספרייה",
|
||||
"Last-read position, bookmarks, and per-book preferences": "מיקום קריאה אחרון, סימניות והעדפות לכל ספר",
|
||||
"Highlights and notes": "הדגשות והערות",
|
||||
"Fonts": "גופנים",
|
||||
"Custom font files": "קובצי גופנים מותאמים אישית",
|
||||
"Backgrounds": "רקעים",
|
||||
"Custom background textures": "טקסטורות רקע מותאמות אישית",
|
||||
"OPDS catalogs": "קטלוגי OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "כתובות קטלוגים שמורות ופרטי גישה (מוצפנים)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "סיסמת סנכרון שגויה — לא ניתן לפענח את פרטי הגישה המסונכרנים",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "נתוני סיסמת הסנכרון בשרת אופסו. מצפין מחדש את פרטי הגישה עם הסיסמה החדשה…",
|
||||
"Failed to decrypt synced credentials": "פענוח פרטי הגישה המסונכרנים נכשל",
|
||||
"Imported dictionary bundles and settings": "חבילות מילונים מיובאות והגדרות",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "בחר מה מסונכרן בין המכשירים שלך. השבתת קטגוריה גורמת למכשיר זה להפסיק לשלוח או לקבל רשומות מהסוג הזה. מה שכבר נמצא בשרת נשאר כפי שהוא, והפעלה מחדש ממשיכה מהמקום שבו עצרת.",
|
||||
"Data Sync": "סנכרון נתונים",
|
||||
"Manage Fonts": "ניהול גופנים",
|
||||
"App settings": "הגדרות אפליקציה",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "ערכת נושא, צבעי הדגשה, שילובים (KOSync, Readwise, Hardcover) וסדר המילונים",
|
||||
"Required while Dictionaries sync is enabled": "נדרש כל עוד סנכרון המילונים מופעל",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "מתאפס בעוד {{hours}} ש׳ {{minutes}} ד׳",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "בחר PIN בן 4 ספרות. תצטרך להזין אותו בכל פעם שתפתח את Readest. אין דרך לשחזר PIN שנשכח. ניקוי נתוני האפליקציה הוא הדרך היחידה לאפס אותו.",
|
||||
"Credentials": "אישורים",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "אסימונים, שמות משתמש וסיסמאות עבור OPDS, KOReader, Hardcover ו-Readwise. כאשר מבוטל, האישורים נשמרים רק במכשיר זה ולעולם אינם מועלים.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "שדות מסונכרנים רגישים מוצפנים לפני העלאה. הגדר ביטוי סיסמה עכשיו או מאוחר יותר, כאשר תידרש הצפנה.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "נשמר בחשבון זה. תתבקש להזינו בעת פענוח אישורים.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "התקדמות הקריאה במכשיר זה שונה מ-\"{{deviceName}}\".",
|
||||
"This device": "מכשיר זה",
|
||||
"Red": "אדום",
|
||||
"Yellow": "צהוב",
|
||||
"Green": "ירוק",
|
||||
"Blue": "כחול",
|
||||
"Violet": "סגול",
|
||||
"Edit color": "עריכת צבע",
|
||||
"Add custom color": "הוספת צבע מותאם אישית",
|
||||
"Add label": "הוספת תווית",
|
||||
"Choose color": "בחירת צבע",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "מחובר ל-Hardcover. סנכרון אחרון {{time}}.",
|
||||
"Integrations": "שילובים",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "מחובר ל-Readwise. סנכרון אחרון {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "עיון והורדת ספרים מקטלוגים מקוונים.",
|
||||
"Connected as {{user}}": "מחובר בתור {{user}}",
|
||||
"Not connected": "לא מחובר",
|
||||
"{{count}} catalog_one": "קטלוג אחד",
|
||||
"{{count}} catalog_two": "{{count}} קטלוגים",
|
||||
"{{count}} catalog_other": "{{count}} קטלוגים",
|
||||
"No catalogs": "אין קטלוגים",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "חבר את Readest לשירותים חיצוניים לסנכרון, הדגשות וקטלוגים.",
|
||||
"Reading Sync": "סנכרון קריאה",
|
||||
"Content Sources": "מקורות תוכן",
|
||||
"Scroll tabs": "גלילת לשוניות",
|
||||
"Catalog actions": "פעולות קטלוג",
|
||||
"File Content": "תוכן הקובץ",
|
||||
"Start your library": "התחילו את הספרייה שלכם",
|
||||
"Pick a book from your device to add it to your library.": "בחרו ספר מהמכשיר שלכם כדי להוסיף אותו לספרייה.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "שחררו ספר בכל מקום בחלון הזה, או בחרו אחד מהמחשב שלכם.",
|
||||
"Sign in to sync your library": "התחברו לסנכרון הספרייה שלכם"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "अपडेट किया गया",
|
||||
"Version {{version}}": "संस्करण {{version}}",
|
||||
"Vertical Direction": "ऊर्ध्वाधर दिशा",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "आपकी लाइब्रेरी में आपका स्वागत है। आप यहां अपनी पुस्तकें आयात कर सकते हैं और कभी भी पढ़ सकते हैं।",
|
||||
"Wikipedia": "विकिपीडिया",
|
||||
"Writing Mode": "लेखन मोड",
|
||||
"Your Library": "आपकी लाइब्रेरी",
|
||||
@@ -299,7 +298,6 @@
|
||||
"No notes match your search": "कोई नोट्स नहीं मिले",
|
||||
"Search notes and excerpts...": "नोट्स खोजें...",
|
||||
"Sign in to Sync": "सिंक करने के लिए साइन इन करें",
|
||||
"Synced at {{time}}": "{{time}} पर सिंक किया गया",
|
||||
"Never synced": "कभी सिंक नहीं किया गया",
|
||||
"Show Remaining Time": "शेष समय दिखाएं",
|
||||
"{{time}} min left in chapter": "{{time}} मिनट शेष अध्याय में",
|
||||
@@ -461,14 +459,12 @@
|
||||
"Remove from Cloud Only": "केवल क्लाउड से हटाएँ",
|
||||
"Remove from Device Only": "केवल डिवाइस से हटाएँ",
|
||||
"Disconnected": "अविचलित",
|
||||
"KOReader Sync Settings": "KOReader सिंक सेटिंग्स",
|
||||
"Sync Strategy": "सिंक रणनीति",
|
||||
"Ask on conflict": "संघर्ष पर पूछें",
|
||||
"Always use latest": "हमेशा नवीनतम का उपयोग करें",
|
||||
"Send changes only": "केवल परिवर्तन भेजें",
|
||||
"Receive changes only": "केवल परिवर्तन प्राप्त करें",
|
||||
"Checksum Method": "चेकसम विधि",
|
||||
"File Content (recommended)": "फाइल सामग्री (अनुशंसित)",
|
||||
"File Name": "फाइल नाम",
|
||||
"Device Name": "डिवाइस नाम",
|
||||
"Connect to your KOReader Sync server.": "अपने KOReader सिंक सर्वर से कनेक्ट करें।",
|
||||
@@ -479,10 +475,7 @@
|
||||
"Connect": "कनेक्ट करें",
|
||||
"KOReader Sync": "KOReader सिंक",
|
||||
"Sync Conflict": "सिंक संघर्ष",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "क्या आप \"{{deviceName}}\" से पढ़ने की प्रगति को सिंक करना चाहते हैं?",
|
||||
"another device": "दूसरा डिवाइस",
|
||||
"Local Progress": "स्थानीय प्रगति",
|
||||
"Remote Progress": "दूरस्थ प्रगति",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "पृष्ठ {{page}} कुल {{total}} ({{percentage}}%)",
|
||||
"Current position": "वर्तमान स्थिति",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "लगभग पृष्ठ {{page}} कुल {{total}} ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "रेखांकित करें",
|
||||
"Squiggly": "स्क्विगली",
|
||||
"Outline": "आउटलाइन",
|
||||
"Save Current Color": "वर्तमान रंग सहेजें",
|
||||
"Quick Colors": "त्वरित रंग",
|
||||
"Highlighter": "हाइलाइटर",
|
||||
"Save Book Cover": "बुक कवर सहेजें",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "चयन के बाद पाठ पर टिप्पणी करें",
|
||||
"Search text after selection": "चयन के बाद पाठ खोजें",
|
||||
"Look up text in dictionary after selection": "चयन के बाद शब्दकोश में पाठ देखें",
|
||||
"Look up text in Wikipedia after selection": "चयन के बाद विकिपीडिया में पाठ देखें",
|
||||
"Translate text after selection": "चयन के बाद पाठ का अनुवाद करें",
|
||||
"Read text aloud after selection": "चयन के बाद पाठ को जोर से पढ़ें",
|
||||
"Proofread text after selection": "चयन के बाद पाठ को प्रूफरीड करें",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "पुस्तक निर्यात करने में विफल।",
|
||||
"Export Book": "पुस्तक निर्यात करें",
|
||||
"Whole word:": "पूरा शब्द:",
|
||||
"Error": "त्रुटि",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "लेख लोड करने में असमर्थ। सीधे {{link}} पर खोजने का प्रयास करें।",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "शब्द लोड करने में असमर्थ। सीधे {{link}} पर खोजने का प्रयास करें।",
|
||||
"Date Published": "प्रकाशन तिथि",
|
||||
"Only for TTS:": "केवल TTS के लिए:",
|
||||
"Uploaded": "अपलोड किया गया",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "अमान्य Readwise एक्सेस टोकन",
|
||||
"Disconnected from Readwise": "Readwise से डिस्कनेक्ट हो गया",
|
||||
"Never": "कभी नहीं",
|
||||
"Readwise Settings": "Readwise सेटिंग्स",
|
||||
"Connected to Readwise": "Readwise से जुड़ा हुआ",
|
||||
"Last synced: {{time}}": "पिछला सिंक: {{time}}",
|
||||
"Sync Enabled": "सिंक सक्षम",
|
||||
"Disconnect": "डिस्कनेक्ट करें",
|
||||
"Connect your Readwise account to sync highlights.": "हाइलाइट्स सिंक करने के लिए अपना Readwise खाता कनेक्ट करें।",
|
||||
"Get your access token at": "अपना एक्सेस टोकन यहाँ प्राप्त करें",
|
||||
"Access Token": "एक्सेस टोकन",
|
||||
"Paste your Readwise access token": "अपना Readwise एक्सेस टोकन पेस्ट करें",
|
||||
"Config": "कॉन्फिग",
|
||||
"Readwise Sync": "Readwise सिंक",
|
||||
"Push Highlights": "हाइलाइट्स भेजें",
|
||||
"Highlights synced to Readwise": "हाइलाइट्स Readwise में सिंक हो गए",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "चयन कॉपी करें",
|
||||
"Translate Selection": "चयन का अनुवाद करें",
|
||||
"Dictionary Lookup": "शब्दकोश में खोजें",
|
||||
"Wikipedia Lookup": "विकिपीडिया पर खोजें",
|
||||
"Read Aloud Selection": "चयन को ज़ोर से पढ़ें",
|
||||
"Proofread Selection": "चयन की प्रूफरीडिंग करें",
|
||||
"Open Settings": "सेटिंग्स खोलें",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "खोजने के लिए खींचें",
|
||||
"Punctuation Delay": "विराम चिह्न विलंब",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "कृपया जारी रखने से पहले पुष्टि करें कि यह OPDS कनेक्शन वेब ऐप पर Readest सर्वर के माध्यम से प्रॉक्सी किया जाएगा।",
|
||||
"Custom Headers": "कस्टम हेडर",
|
||||
"Custom Headers (optional)": "कस्टम हेडर (वैकल्पिक)",
|
||||
"Add one header per line using \"Header-Name: value\".": "\"Header-Name: value\" का उपयोग करके प्रति पंक्ति एक हेडर जोड़ें।",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "मैं समझता/समझती हूँ कि यह OPDS कनेक्शन वेब ऐप पर Readest सर्वर के माध्यम से प्रॉक्सी किया जाएगा। यदि मुझे इन क्रेडेंशियल या हेडर के साथ Readest पर भरोसा नहीं है, तो मुझे नेटिव ऐप का उपयोग करना चाहिए।",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcover से कनेक्ट करने में असमर्थ। कृपया अपना नेटवर्क कनेक्शन जाँचें।",
|
||||
"Invalid Hardcover API token": "अमान्य Hardcover API टोकन",
|
||||
"Disconnected from Hardcover": "Hardcover से डिस्कनेक्ट हो गया",
|
||||
"Hardcover Settings": "Hardcover सेटिंग्स",
|
||||
"Connected to Hardcover": "Hardcover से कनेक्टेड",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "पढ़ने की प्रगति और नोट्स सिंक करने के लिए अपना Hardcover खाता कनेक्ट करें।",
|
||||
"Get your API token from hardcover.app → Settings → API.": "hardcover.app → सेटिंग्स → API से अपना API टोकन प्राप्त करें।",
|
||||
"API Token": "API टोकन",
|
||||
"Paste your Hardcover API token": "अपना Hardcover API टोकन पेस्ट करें",
|
||||
"Hardcover sync enabled for this book": "इस पुस्तक के लिए Hardcover सिंक सक्षम",
|
||||
"Hardcover sync disabled for this book": "इस पुस्तक के लिए Hardcover सिंक अक्षम",
|
||||
"Hardcover Sync": "Hardcover सिंक",
|
||||
"Enable for This Book": "इस पुस्तक के लिए सक्षम करें",
|
||||
"Push Notes": "नोट्स भेजें",
|
||||
"Enable Hardcover sync for this book first.": "पहले इस पुस्तक के लिए Hardcover सिंक सक्षम करें।",
|
||||
"No annotations or excerpts to sync for this book.": "इस पुस्तक के लिए सिंक करने हेतु कोई एनोटेशन या अंश नहीं हैं।",
|
||||
"Configure Hardcover in Settings first.": "पहले सेटिंग्स में Hardcover कॉन्फ़िगर करें।",
|
||||
"No new Hardcover note changes to sync.": "सिंक करने के लिए कोई नया Hardcover नोट परिवर्तन नहीं है।",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "हाइफ़न विभाजित करें",
|
||||
"Apply Theme Colors to PDF": "PDF पर थीम रंग लागू करें",
|
||||
"Name": "नाम",
|
||||
"Unavailable": "अनुपलब्ध",
|
||||
"Remove": "हटाएँ",
|
||||
"Edit OPDS Catalog": "OPDS कैटलॉग संपादित करें",
|
||||
"Save Changes": "परिवर्तन सहेजें",
|
||||
"Use Book Layout": "पुस्तक का लेआउट उपयोग करें"
|
||||
"Use Book Layout": "पुस्तक का लेआउट उपयोग करें",
|
||||
"End of this section. Continue to the next.": "इस अनुभाग का अंत। अगले पर जारी रखें।",
|
||||
"Auto-download": "स्वचालित डाउनलोड",
|
||||
"Auto-download new items": "नई आइटम स्वचालित रूप से डाउनलोड करें",
|
||||
"Automatically download new publications when the app syncs": "ऐप सिंक होने पर नए प्रकाशन स्वचालित रूप से डाउनलोड करें",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "OPDS से {{count}} नया आइटम डाउनलोड किया गया",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDS से {{count}} नई आइटम डाउनलोड की गईं",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "{{count}} OPDS कैटलॉग सिंक करने में विफल",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "{{count}} OPDS कैटलॉग सिंक करने में विफल",
|
||||
"Last synced {{when}}": "अंतिम सिंक्रनाइज़ेशन {{when}}",
|
||||
"Failed downloads": "असफल डाउनलोड",
|
||||
"No failed downloads": "कोई असफल डाउनलोड नहीं",
|
||||
"Attempts: {{count}}_one": "प्रयास: {{count}}",
|
||||
"Attempts: {{count}}_other": "प्रयास: {{count}}",
|
||||
"Skip": "छोड़ें",
|
||||
"Skip all": "सब छोड़ें",
|
||||
"Retry all": "सब पुनः प्रयास करें",
|
||||
"{{count}} failed_one": "{{count}} असफल",
|
||||
"{{count}} failed_other": "{{count}} असफल",
|
||||
"(none)": "(कोई नहीं)",
|
||||
"Identifiers": "पहचानकर्ता",
|
||||
"Read (Stream)": "पढ़ें (स्ट्रीम)",
|
||||
"Failed to start stream": "स्ट्रीम प्रारंभ करने में विफल",
|
||||
"No dictionaries enabled": "कोई शब्दकोश सक्षम नहीं है",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "सेटिंग्स → भाषा → शब्दकोश में जाकर शब्दकोश सक्षम करें।",
|
||||
"Wiktionary": "विक्षनरी",
|
||||
"Drag to reorder": "पुनः क्रमित करने के लिए खींचें",
|
||||
"Built-in": "अंतर्निर्मित",
|
||||
"Bundle is missing on this device. Re-import to use it.": "इस डिवाइस पर बंडल मौजूद नहीं है। उपयोग के लिए पुनः आयात करें।",
|
||||
"This dictionary format is not supported.": "यह शब्दकोश प्रारूप समर्थित नहीं है।",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} शब्दकोश आयात किया गया",
|
||||
"Imported {{count}} dictionary_other": "{{count}} शब्दकोश आयात किए गए",
|
||||
"Skipped incomplete bundles: {{names}}": "अधूरे बंडल छोड़े गए: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "शब्दकोश आयात विफल: {{message}}",
|
||||
"Dictionaries": "शब्दकोश",
|
||||
"Delete Dictionary": "शब्दकोश हटाएँ",
|
||||
"Importing…": "आयात हो रहा है…",
|
||||
"Import Dictionary": "शब्दकोश आयात करें",
|
||||
"No dictionaries available.": "कोई शब्दकोश उपलब्ध नहीं है।",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict बंडल को .ifo, .idx और .dict.dz फ़ाइलें चाहिए (.syn वैकल्पिक)।",
|
||||
"Select all the bundle files together when importing.": "आयात करते समय बंडल की सभी फ़ाइलें एक साथ चुनें।",
|
||||
"Manage Dictionaries": "शब्दकोश प्रबंधित करें",
|
||||
"Select Dictionary Files": "शब्दकोश फ़ाइलें चुनें",
|
||||
"Read on Wikipedia →": "विकिपीडिया पर पढ़ें →",
|
||||
"This link can't be opened": "यह लिंक नहीं खोला जा सकता",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "एनोटेशन लिंक में आवश्यक जानकारी नहीं है। मूल लिंक छोटा हो गया हो सकता है।",
|
||||
"Go to Readest": "Readest पर जाएँ",
|
||||
"Open-source ebook reader for everyone, on every device.": "हर किसी के लिए, हर डिवाइस पर — ओपन-सोर्स ईबुक रीडर।",
|
||||
"Open in Readest": "Readest में खोलें",
|
||||
"If Readest didn't open automatically, choose an option below:": "अगर Readest स्वतः नहीं खुला, तो नीचे से कोई विकल्प चुनें:",
|
||||
"Continue reading where you left off.": "जहाँ छोड़ा था, वहीं से पढ़ना जारी रखें।",
|
||||
"Readest logo": "Readest का लोगो",
|
||||
"Opening Readest...": "Readest खुल रहा है…",
|
||||
"Open in Readest app": "Readest ऐप में खोलें",
|
||||
"Continue in browser": "ब्राउज़र में जारी रखें",
|
||||
"Don't have Readest?": "Readest नहीं है?",
|
||||
"Book not in your library": "यह किताब आपकी लाइब्रेरी में नहीं है",
|
||||
"Share Book": "पुस्तक साझा करें",
|
||||
"Could not create share link": "साझा लिंक नहीं बनाया जा सका",
|
||||
"Link copied": "लिंक कॉपी किया गया",
|
||||
"Could not copy link": "लिंक कॉपी नहीं किया जा सका",
|
||||
"Share revoked": "साझा रद्द किया गया",
|
||||
"Could not revoke share": "साझा रद्द नहीं किया जा सका",
|
||||
"Uploading book…": "पुस्तक अपलोड हो रही है…",
|
||||
"Generating…": "बना रहा है…",
|
||||
"Generate share link": "साझा लिंक बनाएँ",
|
||||
"Share URL": "साझा URL",
|
||||
"Copy link": "लिंक कॉपी करें",
|
||||
"Copied": "कॉपी किया गया",
|
||||
"Share via…": "के माध्यम से साझा करें…",
|
||||
"Expires {{date}}": "{{date}} को समाप्त",
|
||||
"Revoking…": "रद्द कर रहा है…",
|
||||
"Revoke share": "साझा रद्द करें",
|
||||
"Sign in to share books": "पुस्तकें साझा करने के लिए साइन इन करें",
|
||||
"Expiring soon": "जल्द ही समाप्त होगा",
|
||||
"Missing share token": "साझा टोकन गायब है",
|
||||
"Could not add to your library": "आपकी लाइब्रेरी में जोड़ा नहीं जा सका",
|
||||
"This share link is no longer available": "यह साझा लिंक अब उपलब्ध नहीं है",
|
||||
"The original link may have expired or been revoked.": "मूल लिंक समाप्त हो गया हो सकता है या रद्द कर दिया गया हो।",
|
||||
"Get Readest": "Readest प्राप्त करें",
|
||||
"Loading shared book…": "साझा पुस्तक लोड हो रही है…",
|
||||
"Adding…": "जोड़ रहा है…",
|
||||
"Add to my library": "मेरी लाइब्रेरी में जोड़ें",
|
||||
"Could not load your shares": "आपके साझा लोड नहीं किए जा सके",
|
||||
"Revoked": "रद्द",
|
||||
"Expired": "समाप्त",
|
||||
"Shared books": "साझा पुस्तकें",
|
||||
"You haven't shared any books yet": "आपने अभी तक कोई पुस्तक साझा नहीं की है",
|
||||
"Open a book and tap Share to send it to a friend.": "किसी पुस्तक को खोलें और मित्र को भेजने के लिए साझा पर टैप करें।",
|
||||
"{{count}} active_one": "{{count}} सक्रिय",
|
||||
"{{count}} active_other": "{{count}} सक्रिय",
|
||||
"{{count}} downloads_one": "{{count}} डाउनलोड",
|
||||
"{{count}} downloads_other": "{{count}} डाउनलोड",
|
||||
"starts at saved page": "सहेजे गए पृष्ठ से शुरू",
|
||||
"More actions": "अधिक क्रियाएँ",
|
||||
"Loading…": "लोड हो रहा है…",
|
||||
"Load more": "और लोड करें",
|
||||
"Could not load shared book": "साझा पुस्तक लोड नहीं की जा सकी",
|
||||
"The share link is missing required information.": "साझा लिंक में आवश्यक जानकारी नहीं है।",
|
||||
"Please check your connection and try again.": "कृपया अपना कनेक्शन जांचें और पुनः प्रयास करें।",
|
||||
"Sign in to import shared books": "साझा पुस्तकें आयात करने के लिए साइन इन करें",
|
||||
"Already in your library": "पहले से ही आपकी लाइब्रेरी में है",
|
||||
"Added to your library": "आपकी लाइब्रेरी में जोड़ा गया",
|
||||
"Could not import shared book": "साझा पुस्तक आयात नहीं की जा सकी",
|
||||
"Manage Shared Links": "साझा लिंक प्रबंधित करें",
|
||||
"Expires in": "समाप्त होगा",
|
||||
"{{count}} days_one": "1 दिन",
|
||||
"{{count}} days_other": "{{count}} दिन",
|
||||
"Expires in {{count}} days_one": "1 दिन में समाप्त",
|
||||
"Expires in {{count}} days_other": "{{count}} दिनों में समाप्त",
|
||||
"Expires in {{count}} hours_one": "1 घंटे में समाप्त",
|
||||
"Expires in {{count}} hours_other": "{{count}} घंटों में समाप्त",
|
||||
"Open in app": "ऐप में खोलें",
|
||||
"Shared with you": "आपके साथ साझा किया गया",
|
||||
"Downloading… {{percent}}%": "डाउनलोड हो रहा है… {{percent}}%",
|
||||
"Import progress": "आयात प्रगति",
|
||||
"Share reading progress": "पढ़ने की प्रगति साझा करें",
|
||||
"Includes your reading progress": "आपकी पढ़ने की प्रगति शामिल है",
|
||||
"Synced {{time}}": "{{time}} सिंक हुआ",
|
||||
"Sync Info": "सिंक जानकारी",
|
||||
"Last Synced": "अंतिम सिंक",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT बंडल को एक .index फ़ाइल और एक .dict.dz फ़ाइल की आवश्यकता होती है।",
|
||||
"Slob bundles need a .slob file.": "Slob बंडल को एक .slob फ़ाइल की आवश्यकता होती है।",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL टेम्पलेट http(s):// से शुरू होना चाहिए और उसमें %WORD% होना चाहिए।",
|
||||
"Web": "वेब",
|
||||
"Add Web Search": "वेब खोज जोड़ें",
|
||||
"Edit Web Search": "वेब खोज संपादित करें",
|
||||
"e.g. Google": "उदा. Google",
|
||||
"URL Template": "URL टेम्पलेट",
|
||||
"Use %WORD% where the looked-up word should appear.": "%WORD% का उपयोग वहां करें जहां खोजा गया शब्द दिखाई देना चाहिए।",
|
||||
"Open the search result in your browser:": "अपने ब्राउज़र में खोज परिणाम खोलें:",
|
||||
"Open in {{name}}": "{{name}} में खोलें",
|
||||
"Book Fingerprint": "पुस्तक फिंगरप्रिंट",
|
||||
"Search the web": "वेब पर खोजें",
|
||||
"App deeplink (readest://)": "ऐप डीप लिंक (readest://)",
|
||||
"Universal web link (https://)": "सार्वभौमिक वेब लिंक (https://)",
|
||||
"Name cannot be empty.": "नाम खाली नहीं हो सकता।",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} मौजूदा शब्दकोश बदला गया",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} मौजूदा शब्दकोश बदले गए",
|
||||
"Cancel Edit": "संपादन रद्द करें",
|
||||
"Edit Dictionary": "शब्दकोश संपादित करें",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict बंडल .mdx फ़ाइलों का उपयोग करते हैं; साथ की .mdd और .css फ़ाइलें वैकल्पिक हैं।",
|
||||
"Dictionary name": "शब्दकोश का नाम",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "यह ऑडियो यहाँ नहीं चलाया जा सकता — शब्दकोश पुराने प्रारूप का उपयोग करता है। Opus, MP3 या WAV ऑडियो वाला कोई आज़माएँ।",
|
||||
"File uploaded: {{title}}": "फ़ाइल अपलोड की गई: {{title}}",
|
||||
"File downloaded: {{title}}": "फ़ाइल डाउनलोड की गई: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "फ़ाइल की क्लाउड प्रति हटाई गई: {{title}}",
|
||||
"Failed to upload file: {{title}}": "फ़ाइल अपलोड करने में विफल: {{title}}",
|
||||
"Failed to download file: {{title}}": "फ़ाइल डाउनलोड करने में विफल: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "फ़ाइल की क्लाउड प्रति हटाने में विफल: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% उपयोग किया गया",
|
||||
"Set PIN…": "PIN सेट करें…",
|
||||
"Require a 4-digit PIN to open Readest": "Readest खोलने के लिए 4-अंकों का PIN आवश्यक करें",
|
||||
"Change PIN…": "PIN बदलें…",
|
||||
"Disable PIN…": "PIN अक्षम करें…",
|
||||
"Sync passphrase ready": "सिंक पासफ़्रेज़ तैयार",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "यह हर डिवाइस पर हमारे सिंक किए गए एन्क्रिप्टेड क्रेडेंशियल (जैसे, OPDS कैटलॉग पासवर्ड) को स्थायी रूप से हटा देता है। स्थानीय प्रतियां सुरक्षित रहती हैं। आपको सिंक पासफ़्रेज़ फिर से दर्ज करना होगा या एक नया सेट करना होगा। जारी रखें?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "सिंक पासफ़्रेज़ भूल गए — सभी एन्क्रिप्टेड फ़ील्ड हटा दिए गए",
|
||||
"Sync passphrase": "सिंक पासफ़्रेज़",
|
||||
"Set passphrase": "पासफ़्रेज़ सेट करें",
|
||||
"Forgot passphrase": "पासफ़्रेज़ भूल गए",
|
||||
"Incorrect PIN": "गलत PIN",
|
||||
"App locked": "ऐप लॉक है",
|
||||
"Enter your PIN": "अपना PIN दर्ज करें",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest लॉक है। जारी रखने के लिए अपना 4-अंकों का PIN दर्ज करें।",
|
||||
"PIN code": "PIN कोड",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PIN भूलने पर आप इस डिवाइस से बाहर हो जाएंगे। इसे रीसेट करने के लिए आपको ऐप का डेटा मिटाना होगा।",
|
||||
"Passphrase must be at least 8 characters": "पासफ़्रेज़ कम से कम 8 वर्णों का होना चाहिए",
|
||||
"Passphrases do not match": "पासफ़्रेज़ मेल नहीं खाते",
|
||||
"Set sync passphrase": "सिंक पासफ़्रेज़ सेट करें",
|
||||
"Enter sync passphrase": "सिंक पासफ़्रेज़ दर्ज करें",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "एक सिंक पासफ़्रेज़ आपके संवेदनशील फ़ील्ड (जैसे OPDS कैटलॉग क्रेडेंशियल) को सिंक होने से पहले एन्क्रिप्ट करता है। हम यह पासफ़्रेज़ कभी नहीं देखते। ऐसा कुछ चुनें जो याद रहे — इसके बिना कोई पुनर्प्राप्ति नहीं है।",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "अपने सिंक किए गए क्रेडेंशियल को डिक्रिप्ट करने के लिए वह सिंक पासफ़्रेज़ दर्ज करें जो आपने किसी अन्य डिवाइस पर सेट किया था।",
|
||||
"Confirm passphrase": "पासफ़्रेज़ की पुष्टि करें",
|
||||
"Unlock": "अनलॉक करें",
|
||||
"Set PIN": "PIN सेट करें",
|
||||
"Change PIN": "PIN बदलें",
|
||||
"Disable PIN": "PIN अक्षम करें",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "अपना वर्तमान PIN दर्ज करें, फिर एक नया 4-अंकों का PIN चुनें।",
|
||||
"Enter your current PIN to disable the app lock.": "ऐप लॉक अक्षम करने के लिए अपना वर्तमान PIN दर्ज करें।",
|
||||
"PIN must be {{length}} digits": "PIN {{length}} अंकों का होना चाहिए",
|
||||
"PINs do not match": "PIN मेल नहीं खाते",
|
||||
"Current PIN": "वर्तमान PIN",
|
||||
"New PIN": "नया PIN",
|
||||
"Confirm new PIN": "नए PIN की पुष्टि करें",
|
||||
"Manage Sync": "सिंक प्रबंधित करें",
|
||||
"Imported book files and library metadata": "आयातित पुस्तक फ़ाइलें और लाइब्रेरी मेटाडेटा",
|
||||
"Last-read position, bookmarks, and per-book preferences": "अंतिम पठन स्थिति, बुकमार्क और प्रति-पुस्तक प्राथमिकताएँ",
|
||||
"Highlights and notes": "हाइलाइट और नोट्स",
|
||||
"Fonts": "फ़ॉन्ट",
|
||||
"Custom font files": "कस्टम फ़ॉन्ट फ़ाइलें",
|
||||
"Backgrounds": "पृष्ठभूमियाँ",
|
||||
"Custom background textures": "कस्टम पृष्ठभूमि बनावट",
|
||||
"OPDS catalogs": "OPDS कैटलॉग",
|
||||
"Saved catalog URLs and (encrypted) credentials": "सहेजे गए कैटलॉग URL और (एन्क्रिप्टेड) क्रेडेंशियल्स",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "गलत सिंक पासफ़्रेज़ — सिंक की गई क्रेडेंशियल्स को डिक्रिप्ट नहीं किया जा सका",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "सर्वर पर सिंक पासफ़्रेज़ डेटा रीसेट कर दिया गया। आपकी क्रेडेंशियल्स को नए पासफ़्रेज़ से पुनः एन्क्रिप्ट किया जा रहा है…",
|
||||
"Failed to decrypt synced credentials": "सिंक की गई क्रेडेंशियल्स को डिक्रिप्ट करने में विफल",
|
||||
"Imported dictionary bundles and settings": "आयातित शब्दकोश बंडल और सेटिंग्स",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "चुनें कि आपके डिवाइसों के बीच क्या सिंक हो। किसी श्रेणी को अक्षम करने पर यह डिवाइस उस प्रकार की प्रविष्टियाँ भेजना या प्राप्त करना बंद कर देता है। सर्वर पर पहले से मौजूद कुछ भी नहीं बदलता, फिर से सक्षम करने पर वहीं से जारी होता है जहाँ आपने रोका था।",
|
||||
"Data Sync": "डेटा सिंक",
|
||||
"Manage Fonts": "फ़ॉन्ट प्रबंधित करें",
|
||||
"App settings": "ऐप सेटिंग्स",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "थीम, हाइलाइट रंग, एकीकरण (KOSync, Readwise, Hardcover) और शब्दकोश क्रम",
|
||||
"Required while Dictionaries sync is enabled": "शब्दकोश सिंक सक्षम होने पर आवश्यक",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} घं {{minutes}} मि में रीसेट",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "एक 4-अंकों का पिन चुनें। Readest खोलने पर आपको हर बार इसे दर्ज करना होगा। भूले हुए पिन को पुनः प्राप्त करने का कोई तरीका नहीं है। ऐप डेटा मिटाना इसे रीसेट करने का एकमात्र तरीका है।",
|
||||
"Credentials": "क्रेडेंशियल",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover और Readwise के लिए टोकन, उपयोगकर्ता नाम और पासवर्ड। अक्षम होने पर, क्रेडेंशियल केवल इसी डिवाइस पर रहते हैं और कभी अपलोड नहीं किए जाते।",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "संवेदनशील सिंक किए गए फ़ील्ड अपलोड से पहले एन्क्रिप्ट किए जाते हैं। अभी पासफ़्रेज़ सेट करें या बाद में जब एन्क्रिप्शन की आवश्यकता हो।",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "इस खाते में सहेजा गया। क्रेडेंशियल डिक्रिप्ट करते समय आपसे पूछा जाएगा।",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "इस डिवाइस पर पढ़ने की प्रगति \"{{deviceName}}\" से भिन्न है।",
|
||||
"This device": "यह डिवाइस",
|
||||
"Red": "लाल",
|
||||
"Yellow": "पीला",
|
||||
"Green": "हरा",
|
||||
"Blue": "नीला",
|
||||
"Violet": "बैंगनी",
|
||||
"Edit color": "रंग संपादित करें",
|
||||
"Add custom color": "कस्टम रंग जोड़ें",
|
||||
"Add label": "लेबल जोड़ें",
|
||||
"Choose color": "रंग चुनें",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcover से कनेक्ट किया गया। अंतिम सिंक {{time}}।",
|
||||
"Integrations": "एकीकरण",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwise से कनेक्ट किया गया। अंतिम सिंक {{time}}।",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "ऑनलाइन कैटलॉग से पुस्तकें ब्राउज़ करें और डाउनलोड करें।",
|
||||
"Connected as {{user}}": "{{user}} के रूप में कनेक्ट किया गया",
|
||||
"Not connected": "कनेक्ट नहीं है",
|
||||
"{{count}} catalog_one": "{{count}} कैटलॉग",
|
||||
"{{count}} catalog_other": "{{count}} कैटलॉग",
|
||||
"No catalogs": "कोई कैटलॉग नहीं",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "सिंक, हाइलाइट और कैटलॉग के लिए Readest को बाहरी सेवाओं से कनेक्ट करें।",
|
||||
"Reading Sync": "रीडिंग सिंक",
|
||||
"Content Sources": "सामग्री स्रोत",
|
||||
"Scroll tabs": "टैब स्क्रॉल करें",
|
||||
"Catalog actions": "कैटलॉग क्रियाएँ",
|
||||
"File Content": "फ़ाइल सामग्री",
|
||||
"Start your library": "अपनी लाइब्रेरी शुरू करें",
|
||||
"Pick a book from your device to add it to your library.": "अपनी लाइब्रेरी में जोड़ने के लिए अपने डिवाइस से एक किताब चुनें।",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "इस विंडो में कहीं भी एक किताब छोड़ें, या अपने कंप्यूटर से कोई एक चुनें।",
|
||||
"Sign in to sync your library": "अपनी लाइब्रेरी सिंक करने के लिए साइन इन करें"
|
||||
}
|
||||
|
||||
@@ -146,7 +146,6 @@
|
||||
"Cloud File Transfers": "Felhő fájlátvitelek",
|
||||
"{{activeCount}} active, {{pendingCount}} pending": "{{activeCount}} aktív, {{pendingCount}} függőben",
|
||||
"{{failedCount}} failed": "{{failedCount}} sikertelen",
|
||||
"Synced at {{time}}": "Szinkronizálva: {{time}}",
|
||||
"Never synced": "Még nem szinkronizált",
|
||||
"Account": "Fiók",
|
||||
"Sign In": "Bejelentkezés",
|
||||
@@ -228,7 +227,6 @@
|
||||
"Library Header": "Könyvtár fejléc",
|
||||
"Library Sync Progress": "Könyvtár szinkronizálási állapot",
|
||||
"Your Bookshelf": "Az Ön könyvespolca",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Üdvözöljük a könyvtárában. Importálhatja könyveit és bármikor olvashatja őket.",
|
||||
"URL must start with http:// or https://": "Az URL-nek http:// vagy https:// előtaggal kell kezdődnie",
|
||||
"Adding LAN addresses is not supported in the web app version.": "A LAN-címek hozzáadása nem támogatott a webes alkalmazásban.",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Kérjük, erősítse meg, hogy ez az OPDS-kapcsolat a Readest szerverein keresztül lesz továbbítva a webalkalmazásban.",
|
||||
@@ -240,7 +238,6 @@
|
||||
"Add your first OPDS catalog to start browsing books": "Adja hozzá első OPDS-katalógusát a böngészés megkezdéséhez",
|
||||
"Add Your First Catalog": "Első katalógus hozzáadása",
|
||||
"Username": "Felhasználónév",
|
||||
"Custom Headers": "Egyéni fejlécek",
|
||||
"Browse": "Böngészés",
|
||||
"Popular Catalogs": "Népszerű katalógusok",
|
||||
"Add": "Hozzáadás",
|
||||
@@ -306,7 +303,6 @@
|
||||
"Dictionary": "Szótár",
|
||||
"Look up text in dictionary after selection": "Szöveg kikeresése szótárban kijelölés után",
|
||||
"Wikipedia": "Wikipédia",
|
||||
"Look up text in Wikipedia after selection": "Szöveg kikeresése a Wikipédián kijelölés után",
|
||||
"Translate": "Fordítás",
|
||||
"Translate text after selection": "Szöveg fordítása kijelölés után",
|
||||
"Speak": "Felolvasás",
|
||||
@@ -420,9 +416,6 @@
|
||||
"System Language": "Rendszernyelv",
|
||||
"No translation available.": "Nem érhető el fordítás.",
|
||||
"Translated by {{provider}}.": "Fordította: {{provider}}.",
|
||||
"Error": "Hiba",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "A cikk nem tölthető be. Próbáljon közvetlenül keresni a {{link}} oldalon.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "A szó nem tölthető be. Próbáljon közvetlenül keresni a {{link}} oldalon.",
|
||||
"Remove Bookmark": "Könyvjelző eltávolítása",
|
||||
"Add Bookmark": "Könyvjelző hozzáadása",
|
||||
"Books Content": "Könyvek tartalma",
|
||||
@@ -449,9 +442,6 @@
|
||||
"Invalid Hardcover API token": "Érvénytelen Hardcover API token",
|
||||
"Disconnected from Hardcover": "Leválasztva a Hardcover szolgáltatásról",
|
||||
"Never": "Soha",
|
||||
"Hardcover Settings": "Hardcover beállítások",
|
||||
"Connected to Hardcover": "Csatlakozva a Hardcover szolgáltatáshoz",
|
||||
"Last synced: {{time}}": "Utolsó szinkronizálás: {{time}}",
|
||||
"Sync Enabled": "Szinkronizálás engedélyezve",
|
||||
"Disconnect": "Leválasztás",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Csatlakoztassa Hardcover fiókját az olvasási haladás és jegyzetek szinkronizálásához.",
|
||||
@@ -471,13 +461,9 @@
|
||||
"Zoomed": "Nagyított",
|
||||
"Zoom level": "Nagyítási szint",
|
||||
"Sync Conflict": "Szinkronizálási ütközés",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Olvasási haladás szinkronizálása a(z) \"{{deviceName}}\" eszközről?",
|
||||
"another device": "másik eszköz",
|
||||
"Local Progress": "Helyi haladás",
|
||||
"Remote Progress": "Távoli haladás",
|
||||
"Failed to connect": "A csatlakozás nem sikerült",
|
||||
"Disconnected": "Leválasztva",
|
||||
"KOReader Sync Settings": "KOReader szinkronizálási beállítások",
|
||||
"Sync as {{userDisplayName}}": "Szinkronizálás mint {{userDisplayName}}",
|
||||
"Sync Server Connected": "Szinkronizálási szerver csatlakoztatva",
|
||||
"Sync Strategy": "Szinkronizálási stratégia",
|
||||
@@ -486,7 +472,6 @@
|
||||
"Send changes only": "Csak módosítások küldése",
|
||||
"Receive changes only": "Csak módosítások fogadása",
|
||||
"Checksum Method": "Ellenőrzőösszeg-módszer",
|
||||
"File Content (recommended)": "Fájl tartalom (ajánlott)",
|
||||
"File Name": "Fájlnév",
|
||||
"Device Name": "Eszköznév",
|
||||
"Connect to your KOReader Sync server.": "Csatlakozzon a KOReader Sync szerveréhez.",
|
||||
@@ -535,8 +520,6 @@
|
||||
"Unable to connect to Readwise. Please check your network connection.": "Nem sikerült csatlakozni a Readwise szolgáltatáshoz. Kérjük, ellenőrizze a hálózati kapcsolatot.",
|
||||
"Invalid Readwise access token": "Érvénytelen Readwise hozzáférési token",
|
||||
"Disconnected from Readwise": "Leválasztva a Readwise szolgáltatásról",
|
||||
"Readwise Settings": "Readwise beállítások",
|
||||
"Connected to Readwise": "Csatlakozva a Readwise szolgáltatáshoz",
|
||||
"Connect your Readwise account to sync highlights.": "Csatlakoztassa Readwise fiókját a kiemelések szinkronizálásához.",
|
||||
"Get your access token at": "Szerezze be hozzáférési tokenjét itt:",
|
||||
"Access Token": "Hozzáférési token",
|
||||
@@ -585,21 +568,17 @@
|
||||
"From Selection": "Kijelöléstől",
|
||||
"Section Title": "Szakasz címe",
|
||||
"More Info": "További információ",
|
||||
"Hardcover sync enabled for this book": "Hardcover szinkronizálás engedélyezve ehhez a könyvhöz",
|
||||
"Hardcover sync disabled for this book": "Hardcover szinkronizálás letiltva ehhez a könyvhöz",
|
||||
"Parallel Read": "Párhuzamos olvasás",
|
||||
"Disable": "Letiltás",
|
||||
"Enable": "Engedélyezés",
|
||||
"Exit Parallel Read": "Kilépés a párhuzamos olvasásból",
|
||||
"Enter Parallel Read": "Párhuzamos olvasás indítása",
|
||||
"KOReader Sync": "KOReader szinkronizálás",
|
||||
"Config": "Beállítás",
|
||||
"Push Progress": "Haladás küldése",
|
||||
"Pull Progress": "Haladás letöltése",
|
||||
"Readwise Sync": "Readwise szinkronizálás",
|
||||
"Push Highlights": "Kiemelések küldése",
|
||||
"Hardcover Sync": "Hardcover szinkronizálás",
|
||||
"Enable for This Book": "Engedélyezés ehhez a könyvhöz",
|
||||
"Push Notes": "Jegyzetek küldése",
|
||||
"Show on Discord": "Megjelenítés a Discordon",
|
||||
"Display what I'm reading on Discord": "Mutassa, mit olvasok a Discordon",
|
||||
@@ -671,7 +650,6 @@
|
||||
"Sign in to Sync": "Jelentkezzen be a szinkronizáláshoz",
|
||||
"Invert Image In Dark Mode": "Kép invertálása sötét módban",
|
||||
"Failed to auto-save book cover for lock screen: {{error}}": "A könyvborító automatikus mentése a zárolási képernyőhöz sikertelen: {{error}}",
|
||||
"Enable Hardcover sync for this book first.": "Először engedélyezze a Hardcover szinkronizálást ehhez a könyvhöz.",
|
||||
"No annotations or excerpts to sync for this book.": "Nincsenek szinkronizálható megjegyzések vagy kivonatok ehhez a könyvhöz.",
|
||||
"Configure Hardcover in Settings first.": "Először konfigurálja a Hardcovert a Beállításokban.",
|
||||
"No new Hardcover note changes to sync.": "Nincsenek új Hardcover-jegyzetváltozások a szinkronizáláshoz.",
|
||||
@@ -936,7 +914,6 @@
|
||||
"Strikethrough": "Áthúzás",
|
||||
"Squiggly": "Hullámos",
|
||||
"Outline": "Körvonal",
|
||||
"Save Current Color": "Jelenlegi szín mentése",
|
||||
"Quick Colors": "Gyors színek",
|
||||
"Override Book Color": "Könyv színeinek felülírása",
|
||||
"None": "Nincs",
|
||||
@@ -1105,7 +1082,6 @@
|
||||
"Copy Selection": "Kijelölés másolása",
|
||||
"Translate Selection": "Kijelölés fordítása",
|
||||
"Dictionary Lookup": "Szótári keresés",
|
||||
"Wikipedia Lookup": "Wikipedia keresés",
|
||||
"Read Aloud Selection": "Kijelölés felolvasása",
|
||||
"Proofread Selection": "Kijelölés lektorálása",
|
||||
"Open Settings": "Beállítások megnyitása",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "Kötőjelek felosztása",
|
||||
"Apply Theme Colors to PDF": "Téma színeinek alkalmazása PDF-re",
|
||||
"Name": "Név",
|
||||
"Unavailable": "Nem elérhető",
|
||||
"Remove": "Eltávolítás",
|
||||
"Edit OPDS Catalog": "OPDS katalógus szerkesztése",
|
||||
"Save Changes": "Módosítások mentése",
|
||||
"Use Book Layout": "Könyv elrendezésének használata"
|
||||
"Use Book Layout": "Könyv elrendezésének használata",
|
||||
"End of this section. Continue to the next.": "Ennek a szakasznak a vége. Folytatás a következővel.",
|
||||
"Auto-download": "Automatikus letöltés",
|
||||
"Auto-download new items": "Új elemek automatikus letöltése",
|
||||
"Automatically download new publications when the app syncs": "Új kiadványok automatikus letöltése, amikor az alkalmazás szinkronizál",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} új elem letöltve az OPDS-ből",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} új elem letöltve az OPDS-ből",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "{{count}} OPDS-katalógus szinkronizálása sikertelen",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "{{count}} OPDS-katalógus szinkronizálása sikertelen",
|
||||
"Last synced {{when}}": "Utoljára szinkronizálva {{when}}",
|
||||
"Failed downloads": "Sikertelen letöltések",
|
||||
"No failed downloads": "Nincsenek sikertelen letöltések",
|
||||
"Attempts: {{count}}_one": "Próbálkozások: {{count}}",
|
||||
"Attempts: {{count}}_other": "Próbálkozások: {{count}}",
|
||||
"Skip": "Kihagyás",
|
||||
"Skip all": "Összes kihagyása",
|
||||
"Retry all": "Összes újrapróbálása",
|
||||
"{{count}} failed_one": "{{count}} sikertelen",
|
||||
"{{count}} failed_other": "{{count}} sikertelen",
|
||||
"(none)": "(nincs)",
|
||||
"Identifiers": "Azonosítók",
|
||||
"Read (Stream)": "Olvasás (Stream)",
|
||||
"Failed to start stream": "Nem sikerült elindítani a streamet",
|
||||
"No dictionaries enabled": "Nincs engedélyezett szótár",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Engedélyezz egy szótárt a Beállítások → Nyelv → Szótárak menüben.",
|
||||
"Wiktionary": "Wikiszótár",
|
||||
"Drag to reorder": "Húzd az átrendezéshez",
|
||||
"Built-in": "Beépített",
|
||||
"Bundle is missing on this device. Re-import to use it.": "A csomag hiányzik erről az eszközről. Importáld újra a használatához.",
|
||||
"This dictionary format is not supported.": "Ez a szótárformátum nem támogatott.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} szótár importálva",
|
||||
"Imported {{count}} dictionary_other": "{{count}} szótár importálva",
|
||||
"Skipped incomplete bundles: {{names}}": "Hiányos csomagok kihagyva: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "A szótár importálása sikertelen: {{message}}",
|
||||
"Dictionaries": "Szótárak",
|
||||
"Delete Dictionary": "Szótár törlése",
|
||||
"Importing…": "Importálás…",
|
||||
"Import Dictionary": "Szótár importálása",
|
||||
"No dictionaries available.": "Nincsenek elérhető szótárak.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "A StarDict csomagokhoz .ifo, .idx és .dict.dz fájlok szükségesek (.syn opcionális).",
|
||||
"Select all the bundle files together when importing.": "Importáláskor jelöld ki egyszerre a csomag összes fájlját.",
|
||||
"Manage Dictionaries": "Szótárak kezelése",
|
||||
"Select Dictionary Files": "Válassz szótárfájlokat",
|
||||
"Read on Wikipedia →": "Olvasd el a Wikipédián →",
|
||||
"This link can't be opened": "A hivatkozás nem nyitható meg",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "A jegyzet hivatkozásából hiányzik a szükséges információ. Az eredeti hivatkozás csonkolva lehetett.",
|
||||
"Go to Readest": "Ugrás a Readesthez",
|
||||
"Open-source ebook reader for everyone, on every device.": "Nyílt forráskódú e-könyvolvasó mindenkinek, minden eszközre.",
|
||||
"Open in Readest": "Megnyitás Readestben",
|
||||
"If Readest didn't open automatically, choose an option below:": "Ha a Readest nem nyílt meg magától, válassz az alábbiak közül:",
|
||||
"Continue reading where you left off.": "Folytasd ott, ahol abbahagytad.",
|
||||
"Readest logo": "Readest logó",
|
||||
"Opening Readest...": "Readest megnyitása…",
|
||||
"Open in Readest app": "Megnyitás a Readest alkalmazásban",
|
||||
"Continue in browser": "Folytatás a böngészőben",
|
||||
"Don't have Readest?": "Még nincs Readested?",
|
||||
"Book not in your library": "A könyv nincs a könyvtáradban",
|
||||
"Share Book": "Könyv megosztása",
|
||||
"Could not create share link": "A megosztási link létrehozása nem sikerült",
|
||||
"Link copied": "Link másolva",
|
||||
"Could not copy link": "A link másolása nem sikerült",
|
||||
"Share revoked": "Megosztás visszavonva",
|
||||
"Could not revoke share": "A megosztás visszavonása nem sikerült",
|
||||
"Uploading book…": "Könyv feltöltése…",
|
||||
"Generating…": "Létrehozás…",
|
||||
"Generate share link": "Megosztási link létrehozása",
|
||||
"Share URL": "Megosztási URL",
|
||||
"Copy link": "Link másolása",
|
||||
"Copied": "Másolva",
|
||||
"Share via…": "Megosztás ezzel…",
|
||||
"Expires {{date}}": "Lejár: {{date}}",
|
||||
"Revoking…": "Visszavonás…",
|
||||
"Revoke share": "Megosztás visszavonása",
|
||||
"Sign in to share books": "Jelentkezz be a könyvek megosztásához",
|
||||
"Expiring soon": "Hamarosan lejár",
|
||||
"Missing share token": "Hiányzó megosztási token",
|
||||
"Could not add to your library": "Nem sikerült hozzáadni a könyvtáradhoz",
|
||||
"This share link is no longer available": "Ez a megosztási link már nem érhető el",
|
||||
"The original link may have expired or been revoked.": "Az eredeti link lehet, hogy lejárt vagy visszavonták.",
|
||||
"Get Readest": "Readest letöltése",
|
||||
"Loading shared book…": "Megosztott könyv betöltése…",
|
||||
"Adding…": "Hozzáadás…",
|
||||
"Add to my library": "Hozzáadás a könyvtáramhoz",
|
||||
"Could not load your shares": "Nem sikerült betölteni a megosztásaidat",
|
||||
"Revoked": "Visszavonva",
|
||||
"Expired": "Lejárt",
|
||||
"Shared books": "Megosztott könyvek",
|
||||
"You haven't shared any books yet": "Még nem osztottál meg könyvet",
|
||||
"Open a book and tap Share to send it to a friend.": "Nyiss meg egy könyvet, és koppints a Megosztásra, hogy elküldd egy barátodnak.",
|
||||
"{{count}} active_one": "{{count}} aktív",
|
||||
"{{count}} active_other": "{{count}} aktív",
|
||||
"{{count}} downloads_one": "{{count}} letöltés",
|
||||
"{{count}} downloads_other": "{{count}} letöltés",
|
||||
"starts at saved page": "mentett oldaltól indul",
|
||||
"More actions": "További műveletek",
|
||||
"Loading…": "Betöltés…",
|
||||
"Load more": "Több betöltése",
|
||||
"Could not load shared book": "A megosztott könyv betöltése nem sikerült",
|
||||
"The share link is missing required information.": "A megosztási linkről hiányoznak szükséges adatok.",
|
||||
"Please check your connection and try again.": "Ellenőrizd a kapcsolatot, majd próbáld újra.",
|
||||
"Sign in to import shared books": "Jelentkezz be a megosztott könyvek importálásához",
|
||||
"Already in your library": "Már a könyvtáradban van",
|
||||
"Added to your library": "Hozzáadva a könyvtáradhoz",
|
||||
"Could not import shared book": "A megosztott könyv importálása nem sikerült",
|
||||
"Manage Shared Links": "Megosztási linkek kezelése",
|
||||
"Expires in": "Lejár",
|
||||
"{{count}} days_one": "1 nap",
|
||||
"{{count}} days_other": "{{count}} nap",
|
||||
"Expires in {{count}} days_one": "Lejár 1 nap múlva",
|
||||
"Expires in {{count}} days_other": "Lejár {{count}} nap múlva",
|
||||
"Expires in {{count}} hours_one": "Lejár 1 óra múlva",
|
||||
"Expires in {{count}} hours_other": "Lejár {{count}} óra múlva",
|
||||
"Open in app": "Megnyitás az alkalmazásban",
|
||||
"Shared with you": "Megosztva veled",
|
||||
"Downloading… {{percent}}%": "Letöltés… {{percent}}%",
|
||||
"Import progress": "Importálás folyamata",
|
||||
"Share reading progress": "Olvasási folyamat megosztása",
|
||||
"Includes your reading progress": "Tartalmazza az olvasási folyamatot",
|
||||
"Synced {{time}}": "Szinkronizálva {{time}}",
|
||||
"Sync Info": "Szinkronizálási információk",
|
||||
"Last Synced": "Utolsó szinkronizálás",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "A DICT csomagokhoz egy .index fájl és egy .dict.dz fájl szükséges.",
|
||||
"Slob bundles need a .slob file.": "A Slob csomagokhoz egy .slob fájl szükséges.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Az URL-sablonnak http(s):// kezdetűnek kell lennie, és tartalmaznia kell a %WORD% részt.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Webes keresés hozzáadása",
|
||||
"Edit Web Search": "Webes keresés szerkesztése",
|
||||
"e.g. Google": "pl. Google",
|
||||
"URL Template": "URL-sablon",
|
||||
"Use %WORD% where the looked-up word should appear.": "Használja a %WORD%-t ott, ahol a keresett szónak meg kell jelennie.",
|
||||
"Open the search result in your browser:": "Nyissa meg a találatot a böngészőben:",
|
||||
"Open in {{name}}": "Megnyitás itt: {{name}}",
|
||||
"Book Fingerprint": "Könyv ujjlenyomata",
|
||||
"Search the web": "Keresés a weben",
|
||||
"App deeplink (readest://)": "App-mélylink (readest://)",
|
||||
"Universal web link (https://)": "Univerzális weblink (https://)",
|
||||
"Name cannot be empty.": "A név nem lehet üres.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} meglévő szótár cserélve",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} meglévő szótár cserélve",
|
||||
"Cancel Edit": "Szerkesztés mégse",
|
||||
"Edit Dictionary": "Szótár szerkesztése",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Az MDict csomagok .mdx fájlokat használnak; a kísérő .mdd és .css fájlok opcionálisak.",
|
||||
"Dictionary name": "Szótár neve",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Ez a hang itt nem játszható le — a szótár elavult formátumot használ. Próbálj olyat, amely Opus, MP3 vagy WAV hangot tartalmaz.",
|
||||
"File uploaded: {{title}}": "Fájl feltöltve: {{title}}",
|
||||
"File downloaded: {{title}}": "Fájl letöltve: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Fájl felhőmásolata törölve: {{title}}",
|
||||
"Failed to upload file: {{title}}": "A fájl feltöltése sikertelen: {{title}}",
|
||||
"Failed to download file: {{title}}": "Fájl letöltése sikertelen: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Fájl felhőmásolatának törlése sikertelen: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% felhasználva",
|
||||
"Set PIN…": "PIN beállítása…",
|
||||
"Require a 4-digit PIN to open Readest": "4 jegyű PIN megkövetelése a Readest megnyitásához",
|
||||
"Change PIN…": "PIN módosítása…",
|
||||
"Disable PIN…": "PIN letiltása…",
|
||||
"Sync passphrase ready": "Szinkronizálási jelmondat készen áll",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Ez véglegesen törli a szinkronizált titkosított hitelesítő adatokat (pl. OPDS-katalógusjelszavak) minden eszközön. A helyi másolatok megmaradnak. Újra meg kell adnia a szinkronizálási jelmondatot, vagy újat kell beállítania. Folytatja?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Szinkronizálási jelmondat elfelejtve — az összes titkosított mező törölve",
|
||||
"Sync passphrase": "Szinkronizálási jelmondat",
|
||||
"Set passphrase": "Jelmondat beállítása",
|
||||
"Forgot passphrase": "Elfelejtett jelmondat",
|
||||
"Incorrect PIN": "Helytelen PIN",
|
||||
"App locked": "Az alkalmazás zárolva van",
|
||||
"Enter your PIN": "Adja meg a PIN-kódját",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "A Readest zárolva van. A folytatáshoz adja meg a 4 jegyű PIN-kódját.",
|
||||
"PIN code": "PIN-kód",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Ha elfelejti a PIN-kódját, kizárja magát erről az eszközről. Az alaphelyzetbe állításhoz törölnie kell az alkalmazás adatait.",
|
||||
"Passphrase must be at least 8 characters": "A jelmondatnak legalább 8 karakter hosszúnak kell lennie",
|
||||
"Passphrases do not match": "A jelmondatok nem egyeznek",
|
||||
"Set sync passphrase": "Szinkronizálási jelmondat beállítása",
|
||||
"Enter sync passphrase": "Adja meg a szinkronizálási jelmondatot",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "A szinkronizálási jelmondat titkosítja az érzékeny mezőket (mint például az OPDS-katalógus hitelesítő adatait), mielőtt szinkronizálódnának. Soha nem látjuk ezt a jelmondatot. Válasszon valami emlékezeteset — nélküle nincs helyreállítás.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Adja meg a másik eszközön beállított szinkronizálási jelmondatot a szinkronizált hitelesítő adatok visszafejtéséhez.",
|
||||
"Confirm passphrase": "Jelmondat megerősítése",
|
||||
"Unlock": "Feloldás",
|
||||
"Set PIN": "PIN beállítása",
|
||||
"Change PIN": "PIN módosítása",
|
||||
"Disable PIN": "PIN letiltása",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Adja meg a jelenlegi PIN-kódját, majd válasszon egy új 4 jegyű PIN-kódot.",
|
||||
"Enter your current PIN to disable the app lock.": "Az alkalmazászár letiltásához adja meg a jelenlegi PIN-kódját.",
|
||||
"PIN must be {{length}} digits": "A PIN-kódnak {{length}} jegyűnek kell lennie",
|
||||
"PINs do not match": "A PIN-kódok nem egyeznek",
|
||||
"Current PIN": "Jelenlegi PIN",
|
||||
"New PIN": "Új PIN",
|
||||
"Confirm new PIN": "Új PIN megerősítése",
|
||||
"Manage Sync": "Szinkronizálás kezelése",
|
||||
"Imported book files and library metadata": "Importált könyvfájlok és könyvtár-metaadatok",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Utolsó olvasási pozíció, könyvjelzők és könyvenkénti beállítások",
|
||||
"Highlights and notes": "Kiemelések és jegyzetek",
|
||||
"Fonts": "Betűtípusok",
|
||||
"Custom font files": "Egyéni betűtípus-fájlok",
|
||||
"Backgrounds": "Hátterek",
|
||||
"Custom background textures": "Egyéni háttértextúrák",
|
||||
"OPDS catalogs": "OPDS katalógusok",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Mentett katalógus-URL-ek és (titkosított) hitelesítő adatok",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Hibás szinkronizálási jelszó — a szinkronizált hitelesítő adatok nem voltak visszafejthetők",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "A kiszolgálón lévő szinkronizálási jelszóadatok visszaállítva. A hitelesítő adatok újratitkosítása az új jelszóval folyamatban…",
|
||||
"Failed to decrypt synced credentials": "A szinkronizált hitelesítő adatok visszafejtése sikertelen",
|
||||
"Imported dictionary bundles and settings": "Importált szótárcsomagok és beállítások",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Válaszd ki, mi szinkronizálódjon az eszközeid között. Egy kategória letiltása megakadályozza, hogy ez az eszköz ilyen típusú bejegyzéseket küldjön vagy fogadjon. A szerveren már lévő adatok érintetlenek maradnak, az újbóli engedélyezés onnan folytatódik, ahol abbahagytad.",
|
||||
"Data Sync": "Adatszinkronizálás",
|
||||
"Manage Fonts": "Betűtípusok kezelése",
|
||||
"App settings": "Alkalmazásbeállítások",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Téma, kiemelési színek, integrációk (KOSync, Readwise, Hardcover) és szótárak sorrendje",
|
||||
"Required while Dictionaries sync is enabled": "Szükséges, amíg a Szótárak szinkronizálása be van kapcsolva",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Visszaállás {{hours}} ó {{minutes}} p múlva",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Válasszon egy 4 számjegyű PIN-kódot. Minden alkalommal meg kell adnia, amikor megnyitja a Readestet. Az elfelejtett PIN-kódot nem lehet visszaállítani. Az alkalmazás adatainak törlése az egyetlen módja a visszaállításának.",
|
||||
"Credentials": "Hitelesítő adatok",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokenek, felhasználónevek és jelszavak az OPDS, KOReader, Hardcover és Readwise szolgáltatásokhoz. Ha le van tiltva, a hitelesítő adatok csak ezen az eszközön maradnak, és soha nem töltődnek fel.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Az érzékeny szinkronizált mezők feltöltés előtt titkosítva vannak. Állíts be egy jelmondatot most, vagy később, amikor titkosításra lesz szükség.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Mentve ehhez a fiókhoz. Akkor kérjük majd, amikor hitelesítő adatokat kell visszafejteni.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Az olvasási előrehaladás ezen az eszközön eltér a következőtől: „{{deviceName}}”.",
|
||||
"This device": "Ez az eszköz",
|
||||
"Red": "Piros",
|
||||
"Yellow": "Sárga",
|
||||
"Green": "Zöld",
|
||||
"Blue": "Kék",
|
||||
"Violet": "Lila",
|
||||
"Edit color": "Szín szerkesztése",
|
||||
"Add custom color": "Egyéni szín hozzáadása",
|
||||
"Add label": "Címke hozzáadása",
|
||||
"Choose color": "Válasszon színt",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Csatlakozva a Hardcover-hez. Utoljára szinkronizálva: {{time}}.",
|
||||
"Integrations": "Integrációk",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Csatlakozva a Readwise-hoz. Utoljára szinkronizálva: {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Tallózzon és töltsön le könyveket online katalógusokból.",
|
||||
"Connected as {{user}}": "Csatlakozva mint {{user}}",
|
||||
"Not connected": "Nincs csatlakoztatva",
|
||||
"{{count}} catalog_one": "{{count}} katalógus",
|
||||
"{{count}} catalog_other": "{{count}} katalógus",
|
||||
"No catalogs": "Nincs katalógus",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Csatlakoztassa a Readest-et külső szolgáltatásokhoz szinkronizálás, kiemelések és katalógusok használatához.",
|
||||
"Reading Sync": "Olvasási szinkronizálás",
|
||||
"Content Sources": "Tartalomforrások",
|
||||
"Scroll tabs": "Lapok görgetése",
|
||||
"Catalog actions": "Katalógusműveletek",
|
||||
"File Content": "Fájl tartalma",
|
||||
"Start your library": "Indítsa el a könyvtárát",
|
||||
"Pick a book from your device to add it to your library.": "Válasszon egy könyvet az eszközéről, hogy hozzáadja a könyvtárához.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Húzzon egy könyvet bárhová ezen az ablakon, vagy válasszon egyet a számítógépéről.",
|
||||
"Sign in to sync your library": "Jelentkezzen be a könyvtár szinkronizálásához"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Diperbarui",
|
||||
"Version {{version}}": "Versi {{version}}",
|
||||
"Vertical Direction": "Arah Vertikal",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Selamat datang di perpustakaan Anda. Anda dapat mengimpor buku-buku Anda di sini dan membacanya kapan saja.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Writing Mode": "Mode Menulis",
|
||||
"Your Library": "Perpustakaan Anda",
|
||||
@@ -297,7 +296,6 @@
|
||||
"No notes match your search": "Tidak ada catatan ditemukan",
|
||||
"Search notes and excerpts...": "Cari catatan...",
|
||||
"Sign in to Sync": "Masuk untuk Sinkronisasi",
|
||||
"Synced at {{time}}": "Disinkronkan pada {{time}}",
|
||||
"Never synced": "Belum pernah disinkronkan",
|
||||
"Show Remaining Time": "Perlihatkan Waktu Tersisa",
|
||||
"{{time}} min left in chapter": "{{time}} menit tersisa di bab",
|
||||
@@ -457,14 +455,12 @@
|
||||
"Remove from Cloud Only": "Hapus dari Cloud Saja",
|
||||
"Remove from Device Only": "Hapus dari Perangkat Saja",
|
||||
"Disconnected": "Terputus",
|
||||
"KOReader Sync Settings": "Pengaturan Sinkronisasi KOReader",
|
||||
"Sync Strategy": "Strategi Sinkronisasi",
|
||||
"Ask on conflict": "Tanya saat terjadi konflik",
|
||||
"Always use latest": "Selalu gunakan yang terbaru",
|
||||
"Send changes only": "Kirim perubahan saja",
|
||||
"Receive changes only": "Terima perubahan saja",
|
||||
"Checksum Method": "Metode Checksum",
|
||||
"File Content (recommended)": "Konten File (disarankan)",
|
||||
"File Name": "Nama File",
|
||||
"Device Name": "Nama Perangkat",
|
||||
"Connect to your KOReader Sync server.": "Hubungkan ke server Sinkronisasi KOReader Anda.",
|
||||
@@ -475,10 +471,7 @@
|
||||
"Connect": "Hubungkan",
|
||||
"KOReader Sync": "Sinkronisasi KOReader",
|
||||
"Sync Conflict": "Konflik Sinkronisasi",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Sinkronkan progres membaca dari \"{{deviceName}}\"?",
|
||||
"another device": "perangkat lain",
|
||||
"Local Progress": "Progres Lokal",
|
||||
"Remote Progress": "Progres Jarak Jauh",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Halaman {{page}} dari {{total}} ({{percentage}}%)",
|
||||
"Current position": "Posisi Saat Ini",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Sekitar halaman {{page}} dari {{total}} ({{percentage}}%)",
|
||||
@@ -631,7 +624,6 @@
|
||||
"Strikethrough": "Garis Tengah",
|
||||
"Squiggly": "Bergelombang",
|
||||
"Outline": "Garis Besar",
|
||||
"Save Current Color": "Simpan Warna Saat Ini",
|
||||
"Quick Colors": "Warna Cepat",
|
||||
"Highlighter": "Penyorot",
|
||||
"Save Book Cover": "Simpan Sampul Buku",
|
||||
@@ -781,7 +773,6 @@
|
||||
"Annotate text after selection": "Anotasi teks setelah pemilihan",
|
||||
"Search text after selection": "Cari teks setelah pemilihan",
|
||||
"Look up text in dictionary after selection": "Cari teks di kamus setelah pemilihan",
|
||||
"Look up text in Wikipedia after selection": "Cari teks di Wikipedia setelah pemilihan",
|
||||
"Translate text after selection": "Terjemahkan teks setelah pemilihan",
|
||||
"Read text aloud after selection": "Bacakan teks setelah pemilihan",
|
||||
"Proofread text after selection": "Periksa teks setelah pemilihan",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "Gagal mengekspor buku.",
|
||||
"Export Book": "Ekspor Buku",
|
||||
"Whole word:": "Kata utuh:",
|
||||
"Error": "Kesalahan",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Tidak dapat memuat artikel. Coba cari langsung di {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Tidak dapat memuat kata. Coba cari langsung di {{link}}.",
|
||||
"Date Published": "Tanggal terbit",
|
||||
"Only for TTS:": "Hanya untuk TTS:",
|
||||
"Uploaded": "Diunggah",
|
||||
@@ -1027,16 +1015,12 @@
|
||||
"Invalid Readwise access token": "Token akses Readwise tidak valid",
|
||||
"Disconnected from Readwise": "Terputus dari Readwise",
|
||||
"Never": "Tidak pernah",
|
||||
"Readwise Settings": "Pengaturan Readwise",
|
||||
"Connected to Readwise": "Terhubung ke Readwise",
|
||||
"Last synced: {{time}}": "Terakhir disinkronkan: {{time}}",
|
||||
"Sync Enabled": "Sinkronisasi Diaktifkan",
|
||||
"Disconnect": "Putuskan sambungan",
|
||||
"Connect your Readwise account to sync highlights.": "Hubungkan akun Readwise Anda untuk menyinkronkan sorotan.",
|
||||
"Get your access token at": "Dapatkan token akses Anda di",
|
||||
"Access Token": "Token Akses",
|
||||
"Paste your Readwise access token": "Tempelkan token akses Readwise Anda",
|
||||
"Config": "Konfigurasi",
|
||||
"Readwise Sync": "Sinkronisasi Readwise",
|
||||
"Push Highlights": "Kirim Sorotan",
|
||||
"Highlights synced to Readwise": "Sorotan disinkronkan ke Readwise",
|
||||
@@ -1106,7 +1090,6 @@
|
||||
"Copy Selection": "Salin pilihan",
|
||||
"Translate Selection": "Terjemahkan pilihan",
|
||||
"Dictionary Lookup": "Cari di kamus",
|
||||
"Wikipedia Lookup": "Cari di Wikipedia",
|
||||
"Read Aloud Selection": "Bacakan pilihan",
|
||||
"Proofread Selection": "Periksa ejaan pilihan",
|
||||
"Open Settings": "Buka pengaturan",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "Seret untuk mencari",
|
||||
"Punctuation Delay": "Jeda tanda baca",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Harap konfirmasi bahwa koneksi OPDS ini akan diteruskan melalui server Readest di aplikasi web sebelum melanjutkan.",
|
||||
"Custom Headers": "Header Kustom",
|
||||
"Custom Headers (optional)": "Header Kustom (opsional)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Tambahkan satu header per baris menggunakan \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Saya memahami bahwa koneksi OPDS ini akan diteruskan melalui server Readest di aplikasi web. Jika saya tidak mempercayai Readest dengan kredensial atau header ini, saya harus menggunakan aplikasi native.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Tidak dapat terhubung ke Hardcover. Periksa koneksi jaringan Anda.",
|
||||
"Invalid Hardcover API token": "Token API Hardcover tidak valid",
|
||||
"Disconnected from Hardcover": "Terputus dari Hardcover",
|
||||
"Hardcover Settings": "Pengaturan Hardcover",
|
||||
"Connected to Hardcover": "Terhubung ke Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Hubungkan akun Hardcover Anda untuk menyinkronkan progres membaca dan catatan.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Dapatkan token API Anda dari hardcover.app → Pengaturan → API.",
|
||||
"API Token": "Token API",
|
||||
"Paste your Hardcover API token": "Tempel token API Hardcover Anda",
|
||||
"Hardcover sync enabled for this book": "Sinkronisasi Hardcover diaktifkan untuk buku ini",
|
||||
"Hardcover sync disabled for this book": "Sinkronisasi Hardcover dinonaktifkan untuk buku ini",
|
||||
"Hardcover Sync": "Sinkronisasi Hardcover",
|
||||
"Enable for This Book": "Aktifkan untuk Buku Ini",
|
||||
"Push Notes": "Kirim Catatan",
|
||||
"Enable Hardcover sync for this book first.": "Aktifkan sinkronisasi Hardcover untuk buku ini terlebih dahulu.",
|
||||
"No annotations or excerpts to sync for this book.": "Tidak ada anotasi atau kutipan untuk disinkronkan pada buku ini.",
|
||||
"Configure Hardcover in Settings first.": "Konfigurasikan Hardcover di Pengaturan terlebih dahulu.",
|
||||
"No new Hardcover note changes to sync.": "Tidak ada perubahan catatan Hardcover baru untuk disinkronkan.",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "Pisahkan Tanda Hubung",
|
||||
"Apply Theme Colors to PDF": "Terapkan Warna Tema ke PDF",
|
||||
"Name": "Nama",
|
||||
"Unavailable": "Tidak Tersedia",
|
||||
"Remove": "Hapus",
|
||||
"Edit OPDS Catalog": "Edit Katalog OPDS",
|
||||
"Save Changes": "Simpan Perubahan",
|
||||
"Use Book Layout": "Gunakan tata letak buku"
|
||||
"Use Book Layout": "Gunakan tata letak buku",
|
||||
"End of this section. Continue to the next.": "Akhir bagian ini. Lanjutkan ke bagian berikutnya.",
|
||||
"Auto-download": "Unduh otomatis",
|
||||
"Auto-download new items": "Unduh item baru otomatis",
|
||||
"Automatically download new publications when the app syncs": "Otomatis unduh publikasi baru saat aplikasi disinkronkan",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} item baru telah diunduh dari OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Gagal menyinkronkan {{count}} katalog OPDS",
|
||||
"Last synced {{when}}": "Sinkronisasi terakhir {{when}}",
|
||||
"Failed downloads": "Unduhan gagal",
|
||||
"No failed downloads": "Tidak ada unduhan gagal",
|
||||
"Attempts: {{count}}_other": "Percobaan: {{count}}",
|
||||
"Skip": "Lewati",
|
||||
"Skip all": "Lewati semua",
|
||||
"Retry all": "Coba lagi semua",
|
||||
"{{count}} failed_other": "{{count}} gagal",
|
||||
"(none)": "(tidak ada)",
|
||||
"Identifiers": "Pengenal",
|
||||
"Read (Stream)": "Baca (Stream)",
|
||||
"Failed to start stream": "Gagal memulai stream",
|
||||
"No dictionaries enabled": "Tidak ada kamus yang diaktifkan",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Aktifkan kamus di Pengaturan → Bahasa → Kamus.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Seret untuk mengurutkan ulang",
|
||||
"Built-in": "Bawaan",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Paket tidak ada di perangkat ini. Impor ulang untuk menggunakannya.",
|
||||
"This dictionary format is not supported.": "Format kamus ini tidak didukung.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "{{count}} kamus diimpor",
|
||||
"Skipped incomplete bundles: {{names}}": "Paket tidak lengkap dilewati: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Gagal mengimpor kamus: {{message}}",
|
||||
"Dictionaries": "Kamus",
|
||||
"Delete Dictionary": "Hapus Kamus",
|
||||
"Importing…": "Mengimpor…",
|
||||
"Import Dictionary": "Impor Kamus",
|
||||
"No dictionaries available.": "Tidak ada kamus yang tersedia.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Paket StarDict memerlukan file .ifo, .idx, dan .dict.dz (.syn opsional).",
|
||||
"Select all the bundle files together when importing.": "Pilih semua file paket sekaligus saat mengimpor.",
|
||||
"Manage Dictionaries": "Kelola Kamus",
|
||||
"Select Dictionary Files": "Pilih File Kamus",
|
||||
"Read on Wikipedia →": "Baca di Wikipedia →",
|
||||
"This link can't be opened": "Tautan ini tidak dapat dibuka",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Tautan anotasi tidak memiliki informasi yang diperlukan. Tautan asli mungkin telah terpotong.",
|
||||
"Go to Readest": "Buka Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Pembaca ebook sumber terbuka untuk semua orang, di setiap perangkat.",
|
||||
"Open in Readest": "Buka di Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Jika Readest tidak terbuka otomatis, pilih salah satu opsi di bawah:",
|
||||
"Continue reading where you left off.": "Lanjutkan membaca dari tempat terakhir.",
|
||||
"Readest logo": "Logo Readest",
|
||||
"Opening Readest...": "Membuka Readest…",
|
||||
"Open in Readest app": "Buka di aplikasi Readest",
|
||||
"Continue in browser": "Lanjutkan di peramban",
|
||||
"Don't have Readest?": "Belum punya Readest?",
|
||||
"Book not in your library": "Buku tidak ada di pustaka Anda",
|
||||
"Share Book": "Bagikan Buku",
|
||||
"Could not create share link": "Tidak dapat membuat tautan berbagi",
|
||||
"Link copied": "Tautan disalin",
|
||||
"Could not copy link": "Tidak dapat menyalin tautan",
|
||||
"Share revoked": "Berbagi dibatalkan",
|
||||
"Could not revoke share": "Tidak dapat membatalkan berbagi",
|
||||
"Uploading book…": "Mengunggah buku…",
|
||||
"Generating…": "Membuat…",
|
||||
"Generate share link": "Buat tautan berbagi",
|
||||
"Share URL": "URL Berbagi",
|
||||
"Copy link": "Salin tautan",
|
||||
"Copied": "Disalin",
|
||||
"Share via…": "Bagikan melalui…",
|
||||
"Expires {{date}}": "Kedaluwarsa pada {{date}}",
|
||||
"Revoking…": "Membatalkan…",
|
||||
"Revoke share": "Batalkan berbagi",
|
||||
"Sign in to share books": "Masuk untuk berbagi buku",
|
||||
"Expiring soon": "Segera kedaluwarsa",
|
||||
"Missing share token": "Token berbagi hilang",
|
||||
"Could not add to your library": "Tidak dapat ditambahkan ke pustaka Anda",
|
||||
"This share link is no longer available": "Tautan berbagi ini tidak lagi tersedia",
|
||||
"The original link may have expired or been revoked.": "Tautan asli mungkin telah kedaluwarsa atau dibatalkan.",
|
||||
"Get Readest": "Dapatkan Readest",
|
||||
"Loading shared book…": "Memuat buku yang dibagikan…",
|
||||
"Adding…": "Menambahkan…",
|
||||
"Add to my library": "Tambahkan ke pustaka saya",
|
||||
"Could not load your shares": "Tidak dapat memuat berbagi Anda",
|
||||
"Revoked": "Dibatalkan",
|
||||
"Expired": "Kedaluwarsa",
|
||||
"Shared books": "Buku yang dibagikan",
|
||||
"You haven't shared any books yet": "Anda belum membagikan buku apa pun",
|
||||
"Open a book and tap Share to send it to a friend.": "Buka buku dan ketuk Bagikan untuk mengirimnya ke teman.",
|
||||
"{{count}} active_other": "{{count}} aktif",
|
||||
"{{count}} downloads_other": "{{count}} unduhan",
|
||||
"starts at saved page": "mulai dari halaman tersimpan",
|
||||
"More actions": "Tindakan lainnya",
|
||||
"Loading…": "Memuat…",
|
||||
"Load more": "Muat lainnya",
|
||||
"Could not load shared book": "Tidak dapat memuat buku yang dibagikan",
|
||||
"The share link is missing required information.": "Tautan berbagi tidak memiliki informasi yang diperlukan.",
|
||||
"Please check your connection and try again.": "Periksa koneksi Anda dan coba lagi.",
|
||||
"Sign in to import shared books": "Masuk untuk mengimpor buku yang dibagikan",
|
||||
"Already in your library": "Sudah ada di pustaka Anda",
|
||||
"Added to your library": "Ditambahkan ke pustaka Anda",
|
||||
"Could not import shared book": "Tidak dapat mengimpor buku yang dibagikan",
|
||||
"Manage Shared Links": "Kelola tautan berbagi",
|
||||
"Expires in": "Kedaluwarsa dalam",
|
||||
"{{count}} days_other": "{{count}} hari",
|
||||
"Expires in {{count}} days_other": "Kedaluwarsa dalam {{count}} hari",
|
||||
"Expires in {{count}} hours_other": "Kedaluwarsa dalam {{count}} jam",
|
||||
"Open in app": "Buka di aplikasi",
|
||||
"Shared with you": "Dibagikan dengan Anda",
|
||||
"Downloading… {{percent}}%": "Mengunduh… {{percent}}%",
|
||||
"Import progress": "Kemajuan impor",
|
||||
"Share reading progress": "Bagikan progres baca",
|
||||
"Includes your reading progress": "Termasuk progres baca Anda",
|
||||
"Synced {{time}}": "Disinkronkan {{time}}",
|
||||
"Sync Info": "Info sinkronisasi",
|
||||
"Last Synced": "Sinkronisasi terakhir",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Bundel DICT memerlukan berkas .index dan berkas .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Bundel Slob memerlukan berkas .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Templat URL harus diawali http(s):// dan berisi %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Tambah Pencarian Web",
|
||||
"Edit Web Search": "Edit Pencarian Web",
|
||||
"e.g. Google": "mis. Google",
|
||||
"URL Template": "Templat URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Gunakan %WORD% di tempat kata yang dicari harus muncul.",
|
||||
"Open the search result in your browser:": "Buka hasil pencarian di peramban Anda:",
|
||||
"Open in {{name}}": "Buka di {{name}}",
|
||||
"Book Fingerprint": "Sidik jari buku",
|
||||
"Search the web": "Cari di web",
|
||||
"App deeplink (readest://)": "Tautan dalam aplikasi (readest://)",
|
||||
"Universal web link (https://)": "Tautan web universal (https://)",
|
||||
"Name cannot be empty.": "Nama tidak boleh kosong.",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} kamus yang ada digantikan",
|
||||
"Cancel Edit": "Batalkan Edit",
|
||||
"Edit Dictionary": "Edit Kamus",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Paket MDict menggunakan berkas .mdx; berkas .mdd dan .css pendamping bersifat opsional.",
|
||||
"Dictionary name": "Nama kamus",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Audio ini tidak dapat diputar di sini — kamus menggunakan format usang. Coba kamus dengan audio Opus, MP3, atau WAV.",
|
||||
"File uploaded: {{title}}": "File diunggah: {{title}}",
|
||||
"File downloaded: {{title}}": "File diunduh: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Salinan cloud file dihapus: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Gagal mengunggah file: {{title}}",
|
||||
"Failed to download file: {{title}}": "Gagal mengunduh file: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Gagal menghapus salinan cloud file: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% terpakai",
|
||||
"Set PIN…": "Atur PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Wajibkan PIN 4 digit untuk membuka Readest",
|
||||
"Change PIN…": "Ubah PIN…",
|
||||
"Disable PIN…": "Nonaktifkan PIN…",
|
||||
"Sync passphrase ready": "Frasa sandi sinkronisasi siap",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Ini secara permanen menghapus kredensial terenkripsi yang kami sinkronkan (mis., kata sandi katalog OPDS) di setiap perangkat. Salinan lokal disimpan. Anda perlu memasukkan kembali frasa sandi sinkronisasi atau menyetel yang baru. Lanjutkan?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Frasa sandi sinkronisasi terlupakan — semua bidang terenkripsi dihapus",
|
||||
"Sync passphrase": "Frasa sandi sinkronisasi",
|
||||
"Set passphrase": "Setel frasa sandi",
|
||||
"Forgot passphrase": "Lupa frasa sandi",
|
||||
"Incorrect PIN": "PIN salah",
|
||||
"App locked": "Aplikasi terkunci",
|
||||
"Enter your PIN": "Masukkan PIN Anda",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest terkunci. Masukkan PIN 4 digit Anda untuk melanjutkan.",
|
||||
"PIN code": "Kode PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Lupa PIN akan mengunci Anda dari perangkat ini. Anda perlu menghapus data aplikasi untuk meresetnya.",
|
||||
"Passphrase must be at least 8 characters": "Frasa sandi harus minimal 8 karakter",
|
||||
"Passphrases do not match": "Frasa sandi tidak cocok",
|
||||
"Set sync passphrase": "Setel frasa sandi sinkronisasi",
|
||||
"Enter sync passphrase": "Masukkan frasa sandi sinkronisasi",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Frasa sandi sinkronisasi mengenkripsi bidang sensitif Anda (seperti kredensial katalog OPDS) sebelum disinkronkan. Kami tidak pernah melihat frasa sandi ini. Pilih sesuatu yang mudah diingat — tidak ada pemulihan tanpanya.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Masukkan frasa sandi sinkronisasi yang Anda setel di perangkat lain untuk mendekripsi kredensial yang tersinkron.",
|
||||
"Confirm passphrase": "Konfirmasi frasa sandi",
|
||||
"Unlock": "Buka kunci",
|
||||
"Set PIN": "Atur PIN",
|
||||
"Change PIN": "Ubah PIN",
|
||||
"Disable PIN": "Nonaktifkan PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Masukkan PIN Anda saat ini, lalu pilih PIN 4 digit baru.",
|
||||
"Enter your current PIN to disable the app lock.": "Masukkan PIN Anda saat ini untuk menonaktifkan kunci aplikasi.",
|
||||
"PIN must be {{length}} digits": "PIN harus terdiri dari {{length}} digit",
|
||||
"PINs do not match": "PIN tidak cocok",
|
||||
"Current PIN": "PIN saat ini",
|
||||
"New PIN": "PIN baru",
|
||||
"Confirm new PIN": "Konfirmasi PIN baru",
|
||||
"Manage Sync": "Kelola sinkronisasi",
|
||||
"Imported book files and library metadata": "Berkas buku yang diimpor dan metadata pustaka",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Posisi baca terakhir, penanda, dan preferensi per buku",
|
||||
"Highlights and notes": "Sorotan dan catatan",
|
||||
"Fonts": "Fon",
|
||||
"Custom font files": "Berkas fon kustom",
|
||||
"Backgrounds": "Latar belakang",
|
||||
"Custom background textures": "Tekstur latar belakang kustom",
|
||||
"OPDS catalogs": "Katalog OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URL katalog tersimpan dan kredensial (terenkripsi)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Frasa sandi sinkronisasi salah — kredensial yang disinkronkan tidak dapat didekripsi",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Data frasa sandi sinkronisasi di server telah direset. Mengenkripsi ulang kredensial Anda dengan frasa sandi baru…",
|
||||
"Failed to decrypt synced credentials": "Gagal mendekripsi kredensial yang disinkronkan",
|
||||
"Imported dictionary bundles and settings": "Bundel kamus yang diimpor dan pengaturan",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Pilih apa saja yang disinkronkan antar perangkatmu. Menonaktifkan sebuah kategori menghentikan perangkat ini mengirim atau menerima entri jenis itu. Apa pun yang sudah ada di server tetap utuh, mengaktifkannya kembali akan melanjutkan dari tempat kamu berhenti.",
|
||||
"Data Sync": "Sinkronisasi Data",
|
||||
"Manage Fonts": "Kelola Fon",
|
||||
"App settings": "Pengaturan aplikasi",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, warna sorotan, integrasi (KOSync, Readwise, Hardcover), dan urutan kamus",
|
||||
"Required while Dictionaries sync is enabled": "Diperlukan saat sinkronisasi Kamus diaktifkan",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Direset dalam {{hours}} j {{minutes}} mnt",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Pilih PIN 4 digit. Anda harus memasukkannya setiap kali membuka Readest. Tidak ada cara untuk memulihkan PIN yang terlupa. Menghapus data aplikasi adalah satu-satunya cara untuk mengaturnya ulang.",
|
||||
"Credentials": "Kredensial",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token, nama pengguna, dan kata sandi untuk OPDS, KOReader, Hardcover, dan Readwise. Saat dinonaktifkan, kredensial hanya tetap di perangkat ini dan tidak pernah diunggah.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Bidang sinkron yang sensitif dienkripsi sebelum diunggah. Atur frasa sandi sekarang atau nanti saat enkripsi diperlukan.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Disimpan di akun ini. Anda akan diminta memasukkannya saat mendekripsi kredensial.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Progres membaca di perangkat ini berbeda dari \"{{deviceName}}\".",
|
||||
"This device": "Perangkat ini",
|
||||
"Red": "Merah",
|
||||
"Yellow": "Kuning",
|
||||
"Green": "Hijau",
|
||||
"Blue": "Biru",
|
||||
"Violet": "Ungu",
|
||||
"Edit color": "Edit warna",
|
||||
"Add custom color": "Tambah warna kustom",
|
||||
"Add label": "Tambah label",
|
||||
"Choose color": "Pilih warna",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Terhubung ke Hardcover. Sinkronisasi terakhir {{time}}.",
|
||||
"Integrations": "Integrasi",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Terhubung ke Readwise. Sinkronisasi terakhir {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Telusuri dan unduh buku dari katalog online.",
|
||||
"Connected as {{user}}": "Terhubung sebagai {{user}}",
|
||||
"Not connected": "Tidak terhubung",
|
||||
"{{count}} catalog_other": "{{count}} katalog",
|
||||
"No catalogs": "Tidak ada katalog",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Hubungkan Readest ke layanan eksternal untuk sinkronisasi, sorotan, dan katalog.",
|
||||
"Reading Sync": "Sinkronisasi Membaca",
|
||||
"Content Sources": "Sumber Konten",
|
||||
"Scroll tabs": "Gulir tab",
|
||||
"Catalog actions": "Tindakan katalog",
|
||||
"File Content": "Konten berkas",
|
||||
"Start your library": "Mulai perpustakaan Anda",
|
||||
"Pick a book from your device to add it to your library.": "Pilih buku dari perangkat Anda untuk ditambahkan ke perpustakaan Anda.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Jatuhkan buku di mana saja pada jendela ini, atau pilih satu dari komputer Anda.",
|
||||
"Sign in to sync your library": "Masuk untuk menyinkronkan perpustakaan Anda"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Aggiornato",
|
||||
"Version {{version}}": "Versione {{version}}",
|
||||
"Vertical Direction": "Direzione verticale",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Benvenuto nella tua biblioteca. Puoi importare i tuoi libri qui e leggerli in qualsiasi momento.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Writing Mode": "Modalità scrittura",
|
||||
"Your Library": "La tua biblioteca",
|
||||
@@ -301,7 +300,6 @@
|
||||
"No notes match your search": "Nessuna nota trovata",
|
||||
"Search notes and excerpts...": "Cerca nelle note...",
|
||||
"Sign in to Sync": "Accedi per sincronizzare",
|
||||
"Synced at {{time}}": "Sincronizzato alle {{time}}",
|
||||
"Never synced": "Mai sincronizzato",
|
||||
"Show Remaining Time": "Mostra tempo rimanente",
|
||||
"{{time}} min left in chapter": "{{time}} min rimasti nel capitolo",
|
||||
@@ -465,14 +463,12 @@
|
||||
"Remove from Cloud Only": "Rimuovi solo da Cloud",
|
||||
"Remove from Device Only": "Rimuovi solo da Dispositivo",
|
||||
"Disconnected": "Disconnesso",
|
||||
"KOReader Sync Settings": "Impostazioni di Sincronizzazione KOReader",
|
||||
"Sync Strategy": "Strategia di Sincronizzazione",
|
||||
"Ask on conflict": "Chiedi in caso di conflitto",
|
||||
"Always use latest": "Usa sempre l'ultima versione",
|
||||
"Send changes only": "Invia solo le modifiche",
|
||||
"Receive changes only": "Ricevi solo le modifiche",
|
||||
"Checksum Method": "Metodo di Controllo",
|
||||
"File Content (recommended)": "Contenuto del File (consigliato)",
|
||||
"File Name": "Nome del File",
|
||||
"Device Name": "Nome del Dispositivo",
|
||||
"Connect to your KOReader Sync server.": "Connettiti al tuo server KOReader Sync.",
|
||||
@@ -483,10 +479,7 @@
|
||||
"Connect": "Connetti",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "Conflitto di Sincronizzazione",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Sincronizzare il progresso di lettura da \"{{deviceName}}\"?",
|
||||
"another device": "un altro dispositivo",
|
||||
"Local Progress": "Progresso Locale",
|
||||
"Remote Progress": "Progresso Remoto",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Pagina {{page}} di {{total}} ({{percentage}}%)",
|
||||
"Current position": "Posizione Corrente",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Circa pagina {{page}} di {{total}} ({{percentage}}%)",
|
||||
@@ -639,7 +632,6 @@
|
||||
"Strikethrough": "Barrato",
|
||||
"Squiggly": "Ondulato",
|
||||
"Outline": "Contorno",
|
||||
"Save Current Color": "Salva Colore Corrente",
|
||||
"Quick Colors": "Colori Veloci",
|
||||
"Highlighter": "Evidenziatore",
|
||||
"Save Book Cover": "Salva Copertina del Libro",
|
||||
@@ -801,7 +793,6 @@
|
||||
"Annotate text after selection": "Annota testo dopo la selezione",
|
||||
"Search text after selection": "Cerca testo dopo la selezione",
|
||||
"Look up text in dictionary after selection": "Cerca testo nel dizionario dopo la selezione",
|
||||
"Look up text in Wikipedia after selection": "Cerca testo in Wikipedia dopo la selezione",
|
||||
"Translate text after selection": "Traduci testo dopo la selezione",
|
||||
"Read text aloud after selection": "Leggi ad alta voce il testo dopo la selezione",
|
||||
"Proofread text after selection": "Correggi il testo dopo la selezione",
|
||||
@@ -848,9 +839,6 @@
|
||||
"Failed to export the book.": "Impossibile esportare il libro.",
|
||||
"Export Book": "Esporta libro",
|
||||
"Whole word:": "Parola intera:",
|
||||
"Error": "Errore",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Impossibile caricare l'articolo. Prova a cercare direttamente su {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Impossibile caricare la parola. Prova a cercare direttamente su {{link}}.",
|
||||
"Date Published": "Data di pubblicazione",
|
||||
"Only for TTS:": "Solo per TTS:",
|
||||
"Uploaded": "Caricato",
|
||||
@@ -1051,16 +1039,12 @@
|
||||
"Invalid Readwise access token": "Token di accesso Readwise non valido",
|
||||
"Disconnected from Readwise": "Disconnesso da Readwise",
|
||||
"Never": "Mai",
|
||||
"Readwise Settings": "Impostazioni Readwise",
|
||||
"Connected to Readwise": "Connesso a Readwise",
|
||||
"Last synced: {{time}}": "Ultima sincronizzazione: {{time}}",
|
||||
"Sync Enabled": "Sincronizzazione abilitata",
|
||||
"Disconnect": "Disconnetti",
|
||||
"Connect your Readwise account to sync highlights.": "Connetti il tuo account Readwise per sincronizzare le evidenziazioni.",
|
||||
"Get your access token at": "Ottieni il tuo token di accesso su",
|
||||
"Access Token": "Token di accesso",
|
||||
"Paste your Readwise access token": "Incolla il tuo token di accesso Readwise",
|
||||
"Config": "Configurazione",
|
||||
"Readwise Sync": "Sincronizzazione Readwise",
|
||||
"Push Highlights": "Invia evidenziazioni",
|
||||
"Highlights synced to Readwise": "Evidenziazioni sincronizzate su Readwise",
|
||||
@@ -1132,7 +1116,6 @@
|
||||
"Copy Selection": "Copia selezione",
|
||||
"Translate Selection": "Traduci selezione",
|
||||
"Dictionary Lookup": "Cerca nel dizionario",
|
||||
"Wikipedia Lookup": "Cerca su Wikipedia",
|
||||
"Read Aloud Selection": "Leggi la selezione ad alta voce",
|
||||
"Proofread Selection": "Correggi selezione",
|
||||
"Open Settings": "Apri impostazioni",
|
||||
@@ -1168,25 +1151,18 @@
|
||||
"Drag to seek": "Trascina per cercare",
|
||||
"Punctuation Delay": "Ritardo punteggiatura",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Conferma che questa connessione OPDS verrà instradata attraverso i server Readest nell'app web prima di continuare.",
|
||||
"Custom Headers": "Intestazioni personalizzate",
|
||||
"Custom Headers (optional)": "Intestazioni personalizzate (facoltativo)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Aggiungi un'intestazione per riga usando \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Capisco che questa connessione OPDS verrà instradata attraverso i server Readest nell'app web. Se non mi fido di Readest con queste credenziali o intestazioni, dovrei usare l'app nativa.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Impossibile connettersi a Hardcover. Controlla la connessione di rete.",
|
||||
"Invalid Hardcover API token": "Token API Hardcover non valido",
|
||||
"Disconnected from Hardcover": "Disconnesso da Hardcover",
|
||||
"Hardcover Settings": "Impostazioni Hardcover",
|
||||
"Connected to Hardcover": "Connesso a Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Collega il tuo account Hardcover per sincronizzare i progressi di lettura e le note.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Ottieni il tuo token API da hardcover.app → Impostazioni → API.",
|
||||
"API Token": "Token API",
|
||||
"Paste your Hardcover API token": "Incolla il tuo token API Hardcover",
|
||||
"Hardcover sync enabled for this book": "Sincronizzazione Hardcover attivata per questo libro",
|
||||
"Hardcover sync disabled for this book": "Sincronizzazione Hardcover disattivata per questo libro",
|
||||
"Hardcover Sync": "Sincronizzazione Hardcover",
|
||||
"Enable for This Book": "Attiva per questo libro",
|
||||
"Push Notes": "Invia note",
|
||||
"Enable Hardcover sync for this book first.": "Attiva prima la sincronizzazione Hardcover per questo libro.",
|
||||
"No annotations or excerpts to sync for this book.": "Nessuna annotazione o estratto da sincronizzare per questo libro.",
|
||||
"Configure Hardcover in Settings first.": "Configura prima Hardcover nelle impostazioni.",
|
||||
"No new Hardcover note changes to sync.": "Nessuna nuova modifica alle note Hardcover da sincronizzare.",
|
||||
@@ -1200,9 +1176,266 @@
|
||||
"Split Hyphens": "Dividi trattini",
|
||||
"Apply Theme Colors to PDF": "Applica colori tema al PDF",
|
||||
"Name": "Nome",
|
||||
"Unavailable": "Non disponibile",
|
||||
"Remove": "Rimuovi",
|
||||
"Edit OPDS Catalog": "Modifica catalogo OPDS",
|
||||
"Save Changes": "Salva modifiche",
|
||||
"Use Book Layout": "Usa layout del libro"
|
||||
"Use Book Layout": "Usa layout del libro",
|
||||
"End of this section. Continue to the next.": "Fine di questa sezione. Continua alla successiva.",
|
||||
"Auto-download": "Scaricamento automatico",
|
||||
"Auto-download new items": "Scarica automaticamente i nuovi elementi",
|
||||
"Automatically download new publications when the app syncs": "Scarica automaticamente le nuove pubblicazioni quando l'app si sincronizza",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} nuovo elemento scaricato da OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "{{count}} nuovi elementi scaricati da OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} nuovi elementi scaricati da OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Impossibile sincronizzare {{count}} catalogo OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "Impossibile sincronizzare {{count}} cataloghi OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Impossibile sincronizzare {{count}} cataloghi OPDS",
|
||||
"Last synced {{when}}": "Ultima sincronizzazione {{when}}",
|
||||
"Failed downloads": "Download non riusciti",
|
||||
"No failed downloads": "Nessun download non riuscito",
|
||||
"Attempts: {{count}}_one": "Tentativi: {{count}}",
|
||||
"Attempts: {{count}}_many": "Tentativi: {{count}}",
|
||||
"Attempts: {{count}}_other": "Tentativi: {{count}}",
|
||||
"Skip": "Ignora",
|
||||
"Skip all": "Ignora tutti",
|
||||
"Retry all": "Riprova tutti",
|
||||
"{{count}} failed_one": "{{count}} non riuscito",
|
||||
"{{count}} failed_many": "{{count}} non riusciti",
|
||||
"{{count}} failed_other": "{{count}} non riusciti",
|
||||
"(none)": "(nessuno)",
|
||||
"Identifiers": "Identificatori",
|
||||
"Read (Stream)": "Leggi (Stream)",
|
||||
"Failed to start stream": "Avvio dello stream non riuscito",
|
||||
"No dictionaries enabled": "Nessun dizionario abilitato",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Abilita un dizionario in Impostazioni → Lingua → Dizionari.",
|
||||
"Wiktionary": "Wikizionario",
|
||||
"Drag to reorder": "Trascina per riordinare",
|
||||
"Built-in": "Integrato",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Il pacchetto manca su questo dispositivo. Re-importalo per usarlo.",
|
||||
"This dictionary format is not supported.": "Questo formato di dizionario non è supportato.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "Importato {{count}} dizionario",
|
||||
"Imported {{count}} dictionary_many": "Importati {{count}} dizionari",
|
||||
"Imported {{count}} dictionary_other": "Importati {{count}} dizionari",
|
||||
"Skipped incomplete bundles: {{names}}": "Pacchetti incompleti ignorati: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Importazione del dizionario non riuscita: {{message}}",
|
||||
"Dictionaries": "Dizionari",
|
||||
"Delete Dictionary": "Elimina dizionario",
|
||||
"Importing…": "Importazione…",
|
||||
"Import Dictionary": "Importa dizionario",
|
||||
"No dictionaries available.": "Nessun dizionario disponibile.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "I pacchetti StarDict richiedono file .ifo, .idx e .dict.dz (.syn opzionale).",
|
||||
"Select all the bundle files together when importing.": "Seleziona tutti i file del pacchetto insieme durante l’importazione.",
|
||||
"Manage Dictionaries": "Gestisci dizionari",
|
||||
"Select Dictionary Files": "Seleziona file del dizionario",
|
||||
"Read on Wikipedia →": "Leggi su Wikipedia →",
|
||||
"This link can't be opened": "Impossibile aprire questo collegamento",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Al collegamento di annotazione mancano informazioni necessarie. Il collegamento originale potrebbe essere stato troncato.",
|
||||
"Go to Readest": "Vai a Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Lettore di e-book open source per tutti, su qualsiasi dispositivo.",
|
||||
"Open in Readest": "Apri in Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Se Readest non si è aperto automaticamente, scegli un'opzione qui sotto:",
|
||||
"Continue reading where you left off.": "Riprendi da dove avevi interrotto.",
|
||||
"Readest logo": "Logo Readest",
|
||||
"Opening Readest...": "Apertura di Readest…",
|
||||
"Open in Readest app": "Apri nell'app Readest",
|
||||
"Continue in browser": "Continua nel browser",
|
||||
"Don't have Readest?": "Non hai Readest?",
|
||||
"Book not in your library": "Libro non presente nella tua libreria",
|
||||
"Share Book": "Condividi libro",
|
||||
"Could not create share link": "Impossibile creare il link di condivisione",
|
||||
"Link copied": "Link copiato",
|
||||
"Could not copy link": "Impossibile copiare il link",
|
||||
"Share revoked": "Condivisione revocata",
|
||||
"Could not revoke share": "Impossibile revocare la condivisione",
|
||||
"Uploading book…": "Caricamento libro…",
|
||||
"Generating…": "Generazione…",
|
||||
"Generate share link": "Genera link di condivisione",
|
||||
"Share URL": "URL di condivisione",
|
||||
"Copy link": "Copia link",
|
||||
"Copied": "Copiato",
|
||||
"Share via…": "Condividi tramite…",
|
||||
"Expires {{date}}": "Scade il {{date}}",
|
||||
"Revoking…": "Revoca in corso…",
|
||||
"Revoke share": "Revoca condivisione",
|
||||
"Sign in to share books": "Accedi per condividere libri",
|
||||
"Expiring soon": "Scade presto",
|
||||
"Missing share token": "Token di condivisione mancante",
|
||||
"Could not add to your library": "Impossibile aggiungere alla tua libreria",
|
||||
"This share link is no longer available": "Questo link di condivisione non è più disponibile",
|
||||
"The original link may have expired or been revoked.": "Il link originale potrebbe essere scaduto o revocato.",
|
||||
"Get Readest": "Ottieni Readest",
|
||||
"Loading shared book…": "Caricamento libro condiviso…",
|
||||
"Adding…": "Aggiunta in corso…",
|
||||
"Add to my library": "Aggiungi alla mia libreria",
|
||||
"Could not load your shares": "Impossibile caricare le tue condivisioni",
|
||||
"Revoked": "Revocato",
|
||||
"Expired": "Scaduto",
|
||||
"Shared books": "Libri condivisi",
|
||||
"You haven't shared any books yet": "Non hai ancora condiviso alcun libro",
|
||||
"Open a book and tap Share to send it to a friend.": "Apri un libro e tocca Condividi per inviarlo a un amico.",
|
||||
"{{count}} active_one": "{{count}} attivo",
|
||||
"{{count}} active_many": "{{count}} attivi",
|
||||
"{{count}} active_other": "{{count}} attivi",
|
||||
"{{count}} downloads_one": "{{count}} download",
|
||||
"{{count}} downloads_many": "{{count}} download",
|
||||
"{{count}} downloads_other": "{{count}} download",
|
||||
"starts at saved page": "inizia dalla pagina salvata",
|
||||
"More actions": "Altre azioni",
|
||||
"Loading…": "Caricamento…",
|
||||
"Load more": "Carica altro",
|
||||
"Could not load shared book": "Impossibile caricare il libro condiviso",
|
||||
"The share link is missing required information.": "Al link di condivisione mancano informazioni necessarie.",
|
||||
"Please check your connection and try again.": "Controlla la connessione e riprova.",
|
||||
"Sign in to import shared books": "Accedi per importare libri condivisi",
|
||||
"Already in your library": "Già nella tua libreria",
|
||||
"Added to your library": "Aggiunto alla tua libreria",
|
||||
"Could not import shared book": "Impossibile importare il libro condiviso",
|
||||
"Manage Shared Links": "Gestisci link di condivisione",
|
||||
"Expires in": "Scade tra",
|
||||
"{{count}} days_one": "1 giorno",
|
||||
"{{count}} days_many": "{{count}} giorni",
|
||||
"{{count}} days_other": "{{count}} giorni",
|
||||
"Expires in {{count}} days_one": "Scade tra 1 giorno",
|
||||
"Expires in {{count}} days_many": "Scade tra {{count}} giorni",
|
||||
"Expires in {{count}} days_other": "Scade tra {{count}} giorni",
|
||||
"Expires in {{count}} hours_one": "Scade tra 1 ora",
|
||||
"Expires in {{count}} hours_many": "Scade tra {{count}} ore",
|
||||
"Expires in {{count}} hours_other": "Scade tra {{count}} ore",
|
||||
"Open in app": "Apri nell'app",
|
||||
"Shared with you": "Condiviso con te",
|
||||
"Downloading… {{percent}}%": "Download in corso… {{percent}}%",
|
||||
"Import progress": "Avanzamento dell'importazione",
|
||||
"Share reading progress": "Condividi i progressi di lettura",
|
||||
"Includes your reading progress": "Include i tuoi progressi di lettura",
|
||||
"Synced {{time}}": "Sincronizzato {{time}}",
|
||||
"Sync Info": "Info di sincronizzazione",
|
||||
"Last Synced": "Ultima sincronizzazione",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "I bundle DICT richiedono un file .index e un file .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "I bundle Slob richiedono un file .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Il modello URL deve iniziare con http(s):// e contenere %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Aggiungi ricerca web",
|
||||
"Edit Web Search": "Modifica ricerca web",
|
||||
"e.g. Google": "es. Google",
|
||||
"URL Template": "Modello URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Usa %WORD% dove dovrebbe apparire la parola cercata.",
|
||||
"Open the search result in your browser:": "Apri il risultato della ricerca nel tuo browser:",
|
||||
"Open in {{name}}": "Apri in {{name}}",
|
||||
"Book Fingerprint": "Impronta del libro",
|
||||
"Search the web": "Cerca nel web",
|
||||
"App deeplink (readest://)": "Deeplink app (readest://)",
|
||||
"Universal web link (https://)": "Link web universale (https://)",
|
||||
"Name cannot be empty.": "Il nome non può essere vuoto.",
|
||||
"Replaced {{count}} existing dictionary_one": "Sostituito {{count}} dizionario esistente",
|
||||
"Replaced {{count}} existing dictionary_many": "Sostituiti {{count}} dizionari esistenti",
|
||||
"Replaced {{count}} existing dictionary_other": "Sostituiti {{count}} dizionari esistenti",
|
||||
"Cancel Edit": "Annulla modifica",
|
||||
"Edit Dictionary": "Modifica dizionario",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "I pacchetti MDict usano file .mdx; i file .mdd e .css di accompagnamento sono facoltativi.",
|
||||
"Dictionary name": "Nome del dizionario",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Questo audio non può essere riprodotto qui — il dizionario usa un formato obsoleto. Prova un dizionario con audio Opus, MP3 o WAV.",
|
||||
"File uploaded: {{title}}": "File caricato: {{title}}",
|
||||
"File downloaded: {{title}}": "File scaricato: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Copia cloud del file eliminata: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Caricamento file non riuscito: {{title}}",
|
||||
"Failed to download file: {{title}}": "Download file non riuscito: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Impossibile eliminare la copia cloud del file: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% utilizzato",
|
||||
"Set PIN…": "Imposta PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Richiedi un PIN di 4 cifre per aprire Readest",
|
||||
"Change PIN…": "Cambia PIN…",
|
||||
"Disable PIN…": "Disattiva PIN…",
|
||||
"Sync passphrase ready": "Passphrase di sincronizzazione pronta",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Questa operazione elimina in modo permanente le credenziali crittografate che sincronizziamo (ad es. le password del catalogo OPDS) su ogni dispositivo. Le copie locali vengono conservate. Dovrai reinserire la passphrase di sincronizzazione o impostarne una nuova. Continuare?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Passphrase di sincronizzazione dimenticata — tutti i campi crittografati cancellati",
|
||||
"Sync passphrase": "Passphrase di sincronizzazione",
|
||||
"Set passphrase": "Imposta passphrase",
|
||||
"Forgot passphrase": "Passphrase dimenticata",
|
||||
"Incorrect PIN": "PIN errato",
|
||||
"App locked": "App bloccata",
|
||||
"Enter your PIN": "Inserisci il tuo PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest è bloccato. Inserisci il tuo PIN di 4 cifre per continuare.",
|
||||
"PIN code": "Codice PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Dimenticare il PIN ti escluderà da questo dispositivo. Dovrai cancellare i dati dell'app per reimpostarlo.",
|
||||
"Passphrase must be at least 8 characters": "La passphrase deve contenere almeno 8 caratteri",
|
||||
"Passphrases do not match": "Le passphrase non corrispondono",
|
||||
"Set sync passphrase": "Imposta passphrase di sincronizzazione",
|
||||
"Enter sync passphrase": "Inserisci la passphrase di sincronizzazione",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Una passphrase di sincronizzazione crittografa i tuoi campi sensibili (come le credenziali del catalogo OPDS) prima che vengano sincronizzati. Non vediamo mai questa passphrase. Scegli qualcosa di memorabile — senza di essa non c'è possibilità di recupero.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Inserisci la passphrase di sincronizzazione impostata su un altro dispositivo per decrittografare le tue credenziali sincronizzate.",
|
||||
"Confirm passphrase": "Conferma passphrase",
|
||||
"Unlock": "Sblocca",
|
||||
"Set PIN": "Imposta PIN",
|
||||
"Change PIN": "Cambia PIN",
|
||||
"Disable PIN": "Disattiva PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Inserisci il tuo PIN attuale, quindi scegli un nuovo PIN di 4 cifre.",
|
||||
"Enter your current PIN to disable the app lock.": "Inserisci il tuo PIN attuale per disattivare il blocco dell'app.",
|
||||
"PIN must be {{length}} digits": "Il PIN deve avere {{length}} cifre",
|
||||
"PINs do not match": "I PIN non corrispondono",
|
||||
"Current PIN": "PIN attuale",
|
||||
"New PIN": "Nuovo PIN",
|
||||
"Confirm new PIN": "Conferma nuovo PIN",
|
||||
"Manage Sync": "Gestisci sincronizzazione",
|
||||
"Imported book files and library metadata": "File dei libri importati e metadati della libreria",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Ultima posizione di lettura, segnalibri e preferenze per libro",
|
||||
"Highlights and notes": "Evidenziazioni e note",
|
||||
"Fonts": "Caratteri",
|
||||
"Custom font files": "File di caratteri personalizzati",
|
||||
"Backgrounds": "Sfondi",
|
||||
"Custom background textures": "Texture di sfondo personalizzate",
|
||||
"OPDS catalogs": "Cataloghi OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URL dei cataloghi salvati e credenziali (cifrate)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Passphrase di sincronizzazione errata — impossibile decifrare le credenziali sincronizzate",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "I dati della passphrase di sincronizzazione sul server sono stati reimpostati. Crittografia delle credenziali con la nuova passphrase in corso…",
|
||||
"Failed to decrypt synced credentials": "Impossibile decifrare le credenziali sincronizzate",
|
||||
"Imported dictionary bundles and settings": "Pacchetti di dizionari importati e impostazioni",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Scegli cosa sincronizzare tra i tuoi dispositivi. Disabilitare una categoria impedisce a questo dispositivo di inviare o ricevere voci di quel tipo. Quanto già presente sul server resta intatto, riabilitandola la sincronizzazione riprende da dove l'hai interrotta.",
|
||||
"Data Sync": "Sincronizzazione dati",
|
||||
"Manage Fonts": "Gestisci caratteri",
|
||||
"App settings": "Impostazioni app",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, colori delle evidenziazioni, integrazioni (KOSync, Readwise, Hardcover) e ordine dei dizionari",
|
||||
"Required while Dictionaries sync is enabled": "Necessario mentre la sincronizzazione dei Dizionari è attiva",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Si reimposta tra {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Scegli un PIN di 4 cifre. Dovrai inserirlo ogni volta che apri Readest. Non c'è modo di recuperare un PIN dimenticato. Cancellare i dati dell'app è l'unico modo per reimpostarlo.",
|
||||
"Credentials": "Credenziali",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token, nomi utente e password per OPDS, KOReader, Hardcover e Readwise. Quando disattivato, le credenziali restano solo su questo dispositivo e non vengono mai caricate.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "I campi sincronizzati sensibili vengono cifrati prima del caricamento. Imposta una passphrase ora o più tardi, quando servirà la cifratura.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Salvata in questo account. Ti verrà richiesta quando occorrerà decifrare le credenziali.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "L'avanzamento di lettura su questo dispositivo è diverso da «{{deviceName}}».",
|
||||
"This device": "Questo dispositivo",
|
||||
"Red": "Rosso",
|
||||
"Yellow": "Giallo",
|
||||
"Green": "Verde",
|
||||
"Blue": "Blu",
|
||||
"Violet": "Viola",
|
||||
"Edit color": "Modifica colore",
|
||||
"Add custom color": "Aggiungi colore personalizzato",
|
||||
"Add label": "Aggiungi etichetta",
|
||||
"Choose color": "Scegli colore",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Collegato a Hardcover. Ultima sincronizzazione {{time}}.",
|
||||
"Integrations": "Integrazioni",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Collegato a Readwise. Ultima sincronizzazione {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Sfoglia e scarica libri dai cataloghi online.",
|
||||
"Connected as {{user}}": "Collegato come {{user}}",
|
||||
"Not connected": "Non collegato",
|
||||
"{{count}} catalog_one": "{{count}} catalogo",
|
||||
"{{count}} catalog_many": "{{count}} cataloghi",
|
||||
"{{count}} catalog_other": "{{count}} cataloghi",
|
||||
"No catalogs": "Nessun catalogo",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Collega Readest a servizi esterni per sincronizzazione, evidenziazioni e cataloghi.",
|
||||
"Reading Sync": "Sincronizzazione lettura",
|
||||
"Content Sources": "Fonti di contenuti",
|
||||
"Scroll tabs": "Scorri schede",
|
||||
"Catalog actions": "Azioni del catalogo",
|
||||
"File Content": "Contenuto del file",
|
||||
"Start your library": "Inizia la tua biblioteca",
|
||||
"Pick a book from your device to add it to your library.": "Scegli un libro dal tuo dispositivo per aggiungerlo alla tua biblioteca.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Trascina un libro in qualsiasi punto di questa finestra, o sceglilo dal tuo computer.",
|
||||
"Sign in to sync your library": "Accedi per sincronizzare la tua biblioteca"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "更新日",
|
||||
"Version {{version}}": "バージョン {{version}}",
|
||||
"Vertical Direction": "縦書",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "ライブラリーへようこそ。ここに書籍をインポートして、いつでも読むことができます。",
|
||||
"Wikipedia": "ウィキペディア",
|
||||
"Writing Mode": "書き込みモード",
|
||||
"Your Library": "ライブラリー",
|
||||
@@ -297,7 +296,6 @@
|
||||
"No notes match your search": "ノートが見つかりません",
|
||||
"Search notes and excerpts...": "ノートを検索...",
|
||||
"Sign in to Sync": "同期するにはサインイン",
|
||||
"Synced at {{time}}": "{{time}} に同期済み",
|
||||
"Never synced": "まだ同期されていません",
|
||||
"Show Remaining Time": "残り時間を表示",
|
||||
"{{time}} min left in chapter": "{{time}}分残り",
|
||||
@@ -457,14 +455,12 @@
|
||||
"Remove from Cloud Only": "クラウドからのみ削除",
|
||||
"Remove from Device Only": "デバイスからのみ削除",
|
||||
"Disconnected": "切断されました",
|
||||
"KOReader Sync Settings": "KOReader Sync設定",
|
||||
"Sync Strategy": "同期戦略",
|
||||
"Ask on conflict": "競合時に確認",
|
||||
"Always use latest": "最新を常に使用",
|
||||
"Send changes only": "変更のみを送信",
|
||||
"Receive changes only": "変更のみを受信",
|
||||
"Checksum Method": "チェックサム方式",
|
||||
"File Content (recommended)": "ファイル内容(推奨)",
|
||||
"File Name": "ファイル名",
|
||||
"Device Name": "デバイス名",
|
||||
"Connect to your KOReader Sync server.": "KOReader Syncサーバーに接続します。",
|
||||
@@ -475,10 +471,7 @@
|
||||
"Connect": "接続",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "同期競合",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "{{deviceName}}から読書進捗を同期しますか?",
|
||||
"another device": "別のデバイス",
|
||||
"Local Progress": "ローカル進捗",
|
||||
"Remote Progress": "リモート進捗",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "ページ {{page}} / {{total}} ({{percentage}}%)",
|
||||
"Current position": "現在の位置",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "おおよそページ {{page}} / {{total}} ({{percentage}}%)",
|
||||
@@ -631,7 +624,6 @@
|
||||
"Strikethrough": "取り消し線",
|
||||
"Squiggly": "波線",
|
||||
"Outline": "アウトライン",
|
||||
"Save Current Color": "現在の色を保存",
|
||||
"Quick Colors": "クイックカラー",
|
||||
"Highlighter": "蛍光ペン",
|
||||
"Save Book Cover": "本のカバーを保存",
|
||||
@@ -781,7 +773,6 @@
|
||||
"Annotate text after selection": "選択後のテキストに注釈を付ける",
|
||||
"Search text after selection": "選択後のテキストを検索",
|
||||
"Look up text in dictionary after selection": "選択後のテキストを辞書で調べる",
|
||||
"Look up text in Wikipedia after selection": "選択後のテキストをWikipediaで調べる",
|
||||
"Translate text after selection": "選択後のテキストを翻訳する",
|
||||
"Read text aloud after selection": "選択後のテキストを音読する",
|
||||
"Proofread text after selection": "選択後のテキストを校正する",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "書籍のエクスポートに失敗しました。",
|
||||
"Export Book": "書籍をエクスポート",
|
||||
"Whole word:": "単語全体:",
|
||||
"Error": "エラー",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "記事を読み込めません。{{link}}で直接検索してみてください。",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "単語を読み込めません。{{link}}で直接検索してみてください。",
|
||||
"Date Published": "出版日",
|
||||
"Only for TTS:": "TTSのみ:",
|
||||
"Uploaded": "アップロード済み",
|
||||
@@ -1027,16 +1015,12 @@
|
||||
"Invalid Readwise access token": "無効な Readwise アクセストークン",
|
||||
"Disconnected from Readwise": "Readwise から切断されました",
|
||||
"Never": "一度もなし",
|
||||
"Readwise Settings": "Readwise 設定",
|
||||
"Connected to Readwise": "Readwise に接続済み",
|
||||
"Last synced: {{time}}": "最終同期:{{time}}",
|
||||
"Sync Enabled": "同期有効",
|
||||
"Disconnect": "切断",
|
||||
"Connect your Readwise account to sync highlights.": "ハイライトを同期するには Readwise アカウントを接続してください。",
|
||||
"Get your access token at": "アクセストークンの取得先:",
|
||||
"Access Token": "アクセストークン",
|
||||
"Paste your Readwise access token": "Readwise アクセストークンを貼り付けてください",
|
||||
"Config": "設定",
|
||||
"Readwise Sync": "Readwise 同期",
|
||||
"Push Highlights": "ハイライトをプッシュ",
|
||||
"Highlights synced to Readwise": "ハイライトが Readwise に同期されました",
|
||||
@@ -1106,7 +1090,6 @@
|
||||
"Copy Selection": "選択範囲をコピー",
|
||||
"Translate Selection": "選択範囲を翻訳",
|
||||
"Dictionary Lookup": "辞書で調べる",
|
||||
"Wikipedia Lookup": "Wikipediaで調べる",
|
||||
"Read Aloud Selection": "選択範囲を読み上げ",
|
||||
"Proofread Selection": "選択範囲を校正",
|
||||
"Open Settings": "設定を開く",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "ドラッグしてシーク",
|
||||
"Punctuation Delay": "句読点の遅延",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "続行する前に、このOPDS接続がWebアプリのReadestサーバーを経由してプロキシされることを確認してください。",
|
||||
"Custom Headers": "カスタムヘッダー",
|
||||
"Custom Headers (optional)": "カスタムヘッダー(任意)",
|
||||
"Add one header per line using \"Header-Name: value\".": "「Header-Name: value」の形式で1行に1つのヘッダーを追加してください。",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "このOPDS接続がWebアプリのReadestサーバーを経由してプロキシされることを理解しています。これらの認証情報やヘッダーについてReadestを信頼しない場合は、ネイティブアプリを使用してください。",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcoverに接続できません。ネットワーク接続を確認してください。",
|
||||
"Invalid Hardcover API token": "Hardcover APIトークンが無効です",
|
||||
"Disconnected from Hardcover": "Hardcoverから切断されました",
|
||||
"Hardcover Settings": "Hardcover設定",
|
||||
"Connected to Hardcover": "Hardcoverに接続済み",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Hardcoverアカウントを接続して、読書の進捗やメモを同期しましょう。",
|
||||
"Get your API token from hardcover.app → Settings → API.": "hardcover.app → 設定 → APIからAPIトークンを取得してください。",
|
||||
"API Token": "APIトークン",
|
||||
"Paste your Hardcover API token": "HardcoverのAPIトークンを貼り付け",
|
||||
"Hardcover sync enabled for this book": "この本のHardcover同期が有効になりました",
|
||||
"Hardcover sync disabled for this book": "この本のHardcover同期が無効になりました",
|
||||
"Hardcover Sync": "Hardcover同期",
|
||||
"Enable for This Book": "この本で有効にする",
|
||||
"Push Notes": "メモを送信",
|
||||
"Enable Hardcover sync for this book first.": "まずこの本のHardcover同期を有効にしてください。",
|
||||
"No annotations or excerpts to sync for this book.": "この本に同期する注釈や抜粋がありません。",
|
||||
"Configure Hardcover in Settings first.": "まず設定でHardcoverを構成してください。",
|
||||
"No new Hardcover note changes to sync.": "同期するHardcoverメモの新しい変更はありません。",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "ハイフンで分割",
|
||||
"Apply Theme Colors to PDF": "テーマカラーをPDFに適用",
|
||||
"Name": "名前",
|
||||
"Unavailable": "利用不可",
|
||||
"Remove": "削除",
|
||||
"Edit OPDS Catalog": "OPDSカタログを編集",
|
||||
"Save Changes": "変更を保存",
|
||||
"Use Book Layout": "書籍のレイアウトを使用"
|
||||
"Use Book Layout": "書籍のレイアウトを使用",
|
||||
"End of this section. Continue to the next.": "このセクションの終わりです。次のセクションへ進みます。",
|
||||
"Auto-download": "自動ダウンロード",
|
||||
"Auto-download new items": "新着アイテムを自動ダウンロード",
|
||||
"Automatically download new publications when the app syncs": "アプリの同期時に新しい出版物を自動的にダウンロードします",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDSから{{count}}件の新着アイテムをダウンロードしました",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "OPDSカタログ{{count}}件の同期に失敗しました",
|
||||
"Last synced {{when}}": "最終同期 {{when}}",
|
||||
"Failed downloads": "失敗したダウンロード",
|
||||
"No failed downloads": "失敗したダウンロードはありません",
|
||||
"Attempts: {{count}}_other": "試行回数: {{count}}",
|
||||
"Skip": "スキップ",
|
||||
"Skip all": "すべてスキップ",
|
||||
"Retry all": "すべて再試行",
|
||||
"{{count}} failed_other": "{{count}}件失敗",
|
||||
"(none)": "(なし)",
|
||||
"Identifiers": "識別子",
|
||||
"Read (Stream)": "読む(ストリーム)",
|
||||
"Failed to start stream": "ストリームの開始に失敗しました",
|
||||
"No dictionaries enabled": "有効な辞書がありません",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "設定 → 言語 → 辞書 で辞書を有効にしてください。",
|
||||
"Wiktionary": "ウィクショナリー",
|
||||
"Drag to reorder": "ドラッグで並べ替え",
|
||||
"Built-in": "組み込み",
|
||||
"Bundle is missing on this device. Re-import to use it.": "この端末にバンドルがありません。再度インポートしてご利用ください。",
|
||||
"This dictionary format is not supported.": "この辞書形式はサポートされていません。",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "{{count}} 件の辞書をインポートしました",
|
||||
"Skipped incomplete bundles: {{names}}": "不完全なバンドルをスキップしました: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "辞書のインポートに失敗しました: {{message}}",
|
||||
"Dictionaries": "辞書",
|
||||
"Delete Dictionary": "辞書を削除",
|
||||
"Importing…": "インポート中…",
|
||||
"Import Dictionary": "辞書をインポート",
|
||||
"No dictionaries available.": "利用可能な辞書はありません。",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict バンドルには .ifo、.idx、.dict.dz ファイルが必要です(.syn は任意)。",
|
||||
"Select all the bundle files together when importing.": "インポート時はバンドルのファイルをまとめて選択してください。",
|
||||
"Manage Dictionaries": "辞書を管理",
|
||||
"Select Dictionary Files": "辞書ファイルを選択",
|
||||
"Read on Wikipedia →": "Wikipedia で読む →",
|
||||
"This link can't be opened": "このリンクは開けません",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "注釈リンクに必要な情報が不足しています。元のリンクが途中で切れている可能性があります。",
|
||||
"Go to Readest": "Readest を開く",
|
||||
"Open-source ebook reader for everyone, on every device.": "誰もが、どんなデバイスでも使えるオープンソースの電子書籍リーダー。",
|
||||
"Open in Readest": "Readest で開く",
|
||||
"If Readest didn't open automatically, choose an option below:": "Readest が自動で開かなかった場合は、以下から選んでください:",
|
||||
"Continue reading where you left off.": "前回の続きから読み始めましょう。",
|
||||
"Readest logo": "Readest のロゴ",
|
||||
"Opening Readest...": "Readest を開いています…",
|
||||
"Open in Readest app": "Readest アプリで開く",
|
||||
"Continue in browser": "ブラウザーで続ける",
|
||||
"Don't have Readest?": "Readest をお持ちでない方は",
|
||||
"Book not in your library": "この本はライブラリにありません",
|
||||
"Share Book": "本を共有",
|
||||
"Could not create share link": "共有リンクを作成できませんでした",
|
||||
"Link copied": "リンクをコピーしました",
|
||||
"Could not copy link": "リンクをコピーできませんでした",
|
||||
"Share revoked": "共有を取り消しました",
|
||||
"Could not revoke share": "共有を取り消せませんでした",
|
||||
"Uploading book…": "本をアップロード中…",
|
||||
"Generating…": "生成中…",
|
||||
"Generate share link": "共有リンクを作成",
|
||||
"Share URL": "共有URL",
|
||||
"Copy link": "リンクをコピー",
|
||||
"Copied": "コピーしました",
|
||||
"Share via…": "共有…",
|
||||
"Expires {{date}}": "{{date}}に期限切れ",
|
||||
"Revoking…": "取り消し中…",
|
||||
"Revoke share": "共有を取り消す",
|
||||
"Sign in to share books": "本を共有するにはサインインしてください",
|
||||
"Expiring soon": "まもなく期限切れ",
|
||||
"Missing share token": "共有トークンが見つかりません",
|
||||
"Could not add to your library": "ライブラリに追加できませんでした",
|
||||
"This share link is no longer available": "この共有リンクはもう利用できません",
|
||||
"The original link may have expired or been revoked.": "元のリンクは期限切れか取り消された可能性があります。",
|
||||
"Get Readest": "Readest を入手",
|
||||
"Loading shared book…": "共有された本を読み込み中…",
|
||||
"Adding…": "追加中…",
|
||||
"Add to my library": "ライブラリに追加",
|
||||
"Could not load your shares": "共有を読み込めませんでした",
|
||||
"Revoked": "取り消し済み",
|
||||
"Expired": "期限切れ",
|
||||
"Shared books": "共有された本",
|
||||
"You haven't shared any books yet": "まだ本を共有していません",
|
||||
"Open a book and tap Share to send it to a friend.": "本を開き、共有をタップして友達に送りましょう。",
|
||||
"{{count}} active_other": "{{count}} 件アクティブ",
|
||||
"{{count}} downloads_other": "{{count}} 件のダウンロード",
|
||||
"starts at saved page": "保存されたページから開始",
|
||||
"More actions": "その他の操作",
|
||||
"Loading…": "読み込み中…",
|
||||
"Load more": "さらに読み込む",
|
||||
"Could not load shared book": "共有された本を読み込めませんでした",
|
||||
"The share link is missing required information.": "共有リンクに必要な情報が含まれていません。",
|
||||
"Please check your connection and try again.": "接続を確認してもう一度お試しください。",
|
||||
"Sign in to import shared books": "共有された本を取り込むにはサインインしてください",
|
||||
"Already in your library": "すでにライブラリにあります",
|
||||
"Added to your library": "ライブラリに追加しました",
|
||||
"Could not import shared book": "共有された本を取り込めませんでした",
|
||||
"Manage Shared Links": "共有リンクを管理",
|
||||
"Expires in": "有効期限",
|
||||
"{{count}} days_other": "{{count}}日",
|
||||
"Expires in {{count}} days_other": "{{count}}日で期限切れ",
|
||||
"Expires in {{count}} hours_other": "{{count}}時間で期限切れ",
|
||||
"Open in app": "アプリで開く",
|
||||
"Shared with you": "あなたへの共有",
|
||||
"Downloading… {{percent}}%": "ダウンロード中… {{percent}}%",
|
||||
"Import progress": "インポートの進行状況",
|
||||
"Share reading progress": "読書の進捗を共有",
|
||||
"Includes your reading progress": "読書の進捗を含みます",
|
||||
"Synced {{time}}": "{{time}}に同期",
|
||||
"Sync Info": "同期情報",
|
||||
"Last Synced": "最終同期",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT バンドルには .index ファイルと .dict.dz ファイルが必要です。",
|
||||
"Slob bundles need a .slob file.": "Slob バンドルには .slob ファイルが必要です。",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL テンプレートは http(s):// で始まり、%WORD% を含む必要があります。",
|
||||
"Web": "ウェブ",
|
||||
"Add Web Search": "ウェブ検索を追加",
|
||||
"Edit Web Search": "ウェブ検索を編集",
|
||||
"e.g. Google": "例: Google",
|
||||
"URL Template": "URL テンプレート",
|
||||
"Use %WORD% where the looked-up word should appear.": "調べる単語が表示される場所に %WORD% を使用してください。",
|
||||
"Open the search result in your browser:": "検索結果をブラウザで開く:",
|
||||
"Open in {{name}}": "{{name}} で開く",
|
||||
"Book Fingerprint": "書籍の指紋",
|
||||
"Search the web": "ウェブで検索",
|
||||
"App deeplink (readest://)": "アプリディープリンク (readest://)",
|
||||
"Universal web link (https://)": "ユニバーサルウェブリンク (https://)",
|
||||
"Name cannot be empty.": "名前を空にすることはできません。",
|
||||
"Replaced {{count}} existing dictionary_other": "既存の辞書 {{count}} 件を置き換えました",
|
||||
"Cancel Edit": "編集をキャンセル",
|
||||
"Edit Dictionary": "辞書を編集",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict バンドルは .mdx ファイルを使用します。付属の .mdd および .css ファイルは任意です。",
|
||||
"Dictionary name": "辞書名",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "この音声はここで再生できません — 辞書が古い形式を使用しています。Opus、MP3、または WAV 音声を使用する辞書を試してください。",
|
||||
"File uploaded: {{title}}": "ファイルがアップロードされました:{{title}}",
|
||||
"File downloaded: {{title}}": "ファイルがダウンロードされました:{{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "ファイルのクラウドコピーを削除しました:{{title}}",
|
||||
"Failed to upload file: {{title}}": "ファイルのアップロードに失敗しました:{{title}}",
|
||||
"Failed to download file: {{title}}": "ファイルのダウンロードに失敗しました:{{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "ファイルのクラウドコピーの削除に失敗しました:{{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% 使用済み",
|
||||
"Set PIN…": "PINを設定…",
|
||||
"Require a 4-digit PIN to open Readest": "Readestを開くのに4桁のPINを要求する",
|
||||
"Change PIN…": "PINを変更…",
|
||||
"Disable PIN…": "PINを無効化…",
|
||||
"Sync passphrase ready": "同期パスフレーズの準備ができました",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "これにより、各デバイスで同期している暗号化された資格情報(OPDS カタログのパスワードなど)が永続的に削除されます。ローカルのコピーは保持されます。同期パスフレーズを再入力するか、新しく設定する必要があります。続行しますか?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "同期パスフレーズを忘れました — 暗号化されたフィールドはすべてクリアされました",
|
||||
"Sync passphrase": "同期パスフレーズ",
|
||||
"Set passphrase": "パスフレーズを設定",
|
||||
"Forgot passphrase": "パスフレーズを忘れました",
|
||||
"Incorrect PIN": "PINが正しくありません",
|
||||
"App locked": "アプリがロックされています",
|
||||
"Enter your PIN": "PINを入力してください",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readestはロックされています。続行するには4桁のPINを入力してください。",
|
||||
"PIN code": "PINコード",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PINを忘れるとこのデバイスから締め出されます。リセットするにはアプリのデータを消去する必要があります。",
|
||||
"Passphrase must be at least 8 characters": "パスフレーズは 8 文字以上にしてください",
|
||||
"Passphrases do not match": "パスフレーズが一致しません",
|
||||
"Set sync passphrase": "同期パスフレーズを設定",
|
||||
"Enter sync passphrase": "同期パスフレーズを入力",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "同期パスフレーズは、機密フィールド(OPDS カタログの認証情報など)を同期する前に暗号化します。このパスフレーズを当社が知ることはありません。覚えやすいものを選んでください — これがないと復元できません。",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "別のデバイスで設定した同期パスフレーズを入力して、同期された資格情報を復号化します。",
|
||||
"Confirm passphrase": "パスフレーズを確認",
|
||||
"Unlock": "ロック解除",
|
||||
"Set PIN": "PINを設定",
|
||||
"Change PIN": "PINを変更",
|
||||
"Disable PIN": "PINを無効化",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "現在のPINを入力してから、新しい4桁のPINを選んでください。",
|
||||
"Enter your current PIN to disable the app lock.": "アプリのロックを解除するには現在のPINを入力してください。",
|
||||
"PIN must be {{length}} digits": "PINは{{length}}桁である必要があります",
|
||||
"PINs do not match": "PINが一致しません",
|
||||
"Current PIN": "現在のPIN",
|
||||
"New PIN": "新しいPIN",
|
||||
"Confirm new PIN": "新しいPINの確認",
|
||||
"Manage Sync": "同期を管理",
|
||||
"Imported book files and library metadata": "インポートした書籍ファイルとライブラリのメタデータ",
|
||||
"Last-read position, bookmarks, and per-book preferences": "最終閲覧位置、ブックマーク、書籍ごとの設定",
|
||||
"Highlights and notes": "ハイライトとノート",
|
||||
"Fonts": "フォント",
|
||||
"Custom font files": "カスタムフォントファイル",
|
||||
"Backgrounds": "背景",
|
||||
"Custom background textures": "カスタム背景テクスチャ",
|
||||
"OPDS catalogs": "OPDS カタログ",
|
||||
"Saved catalog URLs and (encrypted) credentials": "保存済みのカタログ URL と(暗号化された)認証情報",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "同期パスフレーズが違います — 同期された認証情報を復号できませんでした",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "サーバーの同期パスフレーズデータがリセットされました。新しいパスフレーズで認証情報を再暗号化しています…",
|
||||
"Failed to decrypt synced credentials": "同期された認証情報を復号できませんでした",
|
||||
"Imported dictionary bundles and settings": "インポートした辞書バンドルと設定",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "デバイス間で同期する項目を選択します。カテゴリを無効にすると、このデバイスはその種類のデータを送受信しなくなります。サーバーに既にあるデータはそのまま残り、再度有効にすると停止した位置から再開します。",
|
||||
"Data Sync": "データ同期",
|
||||
"Manage Fonts": "フォントを管理",
|
||||
"App settings": "アプリ設定",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "テーマ、ハイライトの色、連携 (KOSync、Readwise、Hardcover)、辞書の順序",
|
||||
"Required while Dictionaries sync is enabled": "辞書の同期が有効な間は必須",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}}時間{{minutes}}分でリセット",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4桁のPINを設定してください。Readestを開くたびに入力する必要があります。忘れたPINを復元する方法はありません。アプリのデータを消去することがリセットする唯一の方法です。",
|
||||
"Credentials": "認証情報",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover、Readwise のトークン、ユーザー名、パスワード。無効にすると、認証情報はこのデバイスにのみ残り、アップロードされません。",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "機密性の高い同期フィールドはアップロード前に暗号化されます。パスフレーズは今すぐ設定するか、暗号化が必要なときに後で設定できます。",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "このアカウントに保存されました。認証情報を復号する際に入力を求められます。",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "このデバイスの読書進捗は「{{deviceName}}」と異なります。",
|
||||
"This device": "このデバイス",
|
||||
"Red": "赤",
|
||||
"Yellow": "黄",
|
||||
"Green": "緑",
|
||||
"Blue": "青",
|
||||
"Violet": "紫",
|
||||
"Edit color": "色を編集",
|
||||
"Add custom color": "カスタムカラーを追加",
|
||||
"Add label": "ラベルを追加",
|
||||
"Choose color": "色を選択",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcoverに接続済み。最終同期 {{time}}。",
|
||||
"Integrations": "連携",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwiseに接続済み。最終同期 {{time}}。",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "オンラインカタログから書籍を閲覧・ダウンロードします。",
|
||||
"Connected as {{user}}": "{{user}} として接続済み",
|
||||
"Not connected": "未接続",
|
||||
"{{count}} catalog_other": "{{count}} カタログ",
|
||||
"No catalogs": "カタログなし",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "同期、ハイライト、カタログのために Readest を外部サービスに接続します。",
|
||||
"Reading Sync": "読書同期",
|
||||
"Content Sources": "コンテンツソース",
|
||||
"Scroll tabs": "タブをスクロール",
|
||||
"Catalog actions": "カタログ操作",
|
||||
"File Content": "ファイル内容",
|
||||
"Start your library": "ライブラリーを作成しましょう",
|
||||
"Pick a book from your device to add it to your library.": "デバイスから本を選んでライブラリーに追加しましょう。",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "このウィンドウの好きな場所に本をドロップするか、コンピューターから選んでください。",
|
||||
"Sign in to sync your library": "サインインしてライブラリーを同期"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "업데이트일",
|
||||
"Version {{version}}": "버전 {{version}}",
|
||||
"Vertical Direction": "수직 방향",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "내 서재에 오신 것을 환영합니다. 여기에서 책을 가져와 언제든지 읽을 수 있습니다.",
|
||||
"Wikipedia": "위키피디아",
|
||||
"Writing Mode": "글쓰기 모드",
|
||||
"Your Library": "내 서재",
|
||||
@@ -297,7 +296,6 @@
|
||||
"No notes match your search": "일치하는 노트가 없습니다",
|
||||
"Search notes and excerpts...": "노트 검색...",
|
||||
"Sign in to Sync": "동기화를 위해 로그인하세요",
|
||||
"Synced at {{time}}": "{{time}}에 동기화됨",
|
||||
"Never synced": "동기화된 적 없음",
|
||||
"Show Remaining Time": "남은 시간 표시",
|
||||
"{{time}} min left in chapter": "{{time}}분 남음",
|
||||
@@ -457,14 +455,12 @@
|
||||
"Remove from Cloud Only": "클라우드에서만 제거",
|
||||
"Remove from Device Only": "장치에서만 제거",
|
||||
"Disconnected": "연결 끊김",
|
||||
"KOReader Sync Settings": "KOReader Sync 설정",
|
||||
"Sync Strategy": "동기화 전략",
|
||||
"Ask on conflict": "충돌 시 묻기",
|
||||
"Always use latest": "항상 최신 버전 사용",
|
||||
"Send changes only": "변경 사항만 전송",
|
||||
"Receive changes only": "변경 사항만 수신",
|
||||
"Checksum Method": "체크섬 방법",
|
||||
"File Content (recommended)": "파일 내용 (권장)",
|
||||
"File Name": "파일 이름",
|
||||
"Device Name": "장치 이름",
|
||||
"Connect to your KOReader Sync server.": "KOReader Sync 서버에 연결합니다.",
|
||||
@@ -475,10 +471,7 @@
|
||||
"Connect": "연결",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "동기화 충돌",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": " \"{{deviceName}}\"에서 읽기 진행 상황을 동기화하시겠습니까?",
|
||||
"another device": "다른 장치",
|
||||
"Local Progress": "로컬 진행 상황",
|
||||
"Remote Progress": "원격 진행 상황",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "페이지 {{page}} / {{total}} ({{percentage}}%)",
|
||||
"Current position": "현재 위치",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "대략 페이지 {{page}} / {{total}} ({{percentage}}%)",
|
||||
@@ -631,7 +624,6 @@
|
||||
"Strikethrough": "취소선",
|
||||
"Squiggly": "물결선",
|
||||
"Outline": "윤곽선",
|
||||
"Save Current Color": "현재 색상 저장",
|
||||
"Quick Colors": "빠른 색상",
|
||||
"Highlighter": "형광펜",
|
||||
"Save Book Cover": "책 표지 저장",
|
||||
@@ -781,7 +773,6 @@
|
||||
"Annotate text after selection": "선택 후 텍스트 주석 달기",
|
||||
"Search text after selection": "선택 후 텍스트 검색",
|
||||
"Look up text in dictionary after selection": "선택 후 텍스트를 사전에서 찾기",
|
||||
"Look up text in Wikipedia after selection": "선택 후 텍스트를 위키피디아에서 찾기",
|
||||
"Translate text after selection": "선택 후 텍스트 번역",
|
||||
"Read text aloud after selection": "선택 후 텍스트 음성 읽기",
|
||||
"Proofread text after selection": "선택 후 텍스트 교정",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "책 내보내기에 실패했습니다.",
|
||||
"Export Book": "책 내보내기",
|
||||
"Whole word:": "전체 단어:",
|
||||
"Error": "오류",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "문서를 로드할 수 없습니다. {{link}}에서 직접 검색해 보세요.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "단어를 로드할 수 없습니다. {{link}}에서 직접 검색해 보세요.",
|
||||
"Date Published": "출판일",
|
||||
"Only for TTS:": "TTS 전용:",
|
||||
"Uploaded": "업로드됨",
|
||||
@@ -1027,16 +1015,12 @@
|
||||
"Invalid Readwise access token": "유효하지 않은 Readwise 액세스 토큰입니다",
|
||||
"Disconnected from Readwise": "Readwise와 연결이 끊어졌습니다",
|
||||
"Never": "안 함",
|
||||
"Readwise Settings": "Readwise 설정",
|
||||
"Connected to Readwise": "Readwise에 연결됨",
|
||||
"Last synced: {{time}}": "마지막 동기화: {{time}}",
|
||||
"Sync Enabled": "동기화 활성화됨",
|
||||
"Disconnect": "연결 해제",
|
||||
"Connect your Readwise account to sync highlights.": "하이라이트를 동기화하려면 Readwise 계정렬 연결하세요.",
|
||||
"Get your access token at": "액세스 토큰 받기:",
|
||||
"Access Token": "액세스 토큰",
|
||||
"Paste your Readwise access token": "Readwise 액세스 토큰을 붙여넣으세요",
|
||||
"Config": "구성",
|
||||
"Readwise Sync": "Readwise 동기화",
|
||||
"Push Highlights": "하이라이트 푸시",
|
||||
"Highlights synced to Readwise": "하이라이트가 Readwise에 동기화되었습니다",
|
||||
@@ -1106,7 +1090,6 @@
|
||||
"Copy Selection": "선택 영역 복사",
|
||||
"Translate Selection": "선택 영역 번역",
|
||||
"Dictionary Lookup": "사전 검색",
|
||||
"Wikipedia Lookup": "위키백과 검색",
|
||||
"Read Aloud Selection": "선택 영역 소리 내어 읽기",
|
||||
"Proofread Selection": "선택 영역 교정",
|
||||
"Open Settings": "설정 열기",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "드래그하여 탐색",
|
||||
"Punctuation Delay": "구두점 지연",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "계속하기 전에 이 OPDS 연결이 웹 앱의 Readest 서버를 통해 프록시될 것임을 확인해 주세요.",
|
||||
"Custom Headers": "사용자 정의 헤더",
|
||||
"Custom Headers (optional)": "사용자 정의 헤더 (선택 사항)",
|
||||
"Add one header per line using \"Header-Name: value\".": "\"Header-Name: value\" 형식으로 한 줄에 하나의 헤더를 추가하세요.",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "이 OPDS 연결이 웹 앱의 Readest 서버를 통해 프록시될 것임을 이해합니다. 이 자격 증명이나 헤더에 대해 Readest를 신뢰하지 않는다면 네이티브 앱을 사용해야 합니다.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcover에 연결할 수 없습니다. 네트워크 연결을 확인해 주세요.",
|
||||
"Invalid Hardcover API token": "유효하지 않은 Hardcover API 토큰",
|
||||
"Disconnected from Hardcover": "Hardcover에서 연결 해제됨",
|
||||
"Hardcover Settings": "Hardcover 설정",
|
||||
"Connected to Hardcover": "Hardcover에 연결됨",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "독서 진행 상황과 메모를 동기화하려면 Hardcover 계정을 연결하세요.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "hardcover.app → 설정 → API에서 API 토큰을 받으세요.",
|
||||
"API Token": "API 토큰",
|
||||
"Paste your Hardcover API token": "Hardcover API 토큰을 붙여넣기",
|
||||
"Hardcover sync enabled for this book": "이 책의 Hardcover 동기화가 활성화됨",
|
||||
"Hardcover sync disabled for this book": "이 책의 Hardcover 동기화가 비활성화됨",
|
||||
"Hardcover Sync": "Hardcover 동기화",
|
||||
"Enable for This Book": "이 책에 대해 활성화",
|
||||
"Push Notes": "메모 보내기",
|
||||
"Enable Hardcover sync for this book first.": "먼저 이 책의 Hardcover 동기화를 활성화하세요.",
|
||||
"No annotations or excerpts to sync for this book.": "이 책에 동기화할 주석이나 발췌가 없습니다.",
|
||||
"Configure Hardcover in Settings first.": "먼저 설정에서 Hardcover를 구성하세요.",
|
||||
"No new Hardcover note changes to sync.": "동기화할 새로운 Hardcover 메모 변경 사항이 없습니다.",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "하이픈 분리",
|
||||
"Apply Theme Colors to PDF": "PDF에 테마 색상 적용",
|
||||
"Name": "이름",
|
||||
"Unavailable": "사용 불가",
|
||||
"Remove": "삭제",
|
||||
"Edit OPDS Catalog": "OPDS 카탈로그 편집",
|
||||
"Save Changes": "변경 사항 저장",
|
||||
"Use Book Layout": "책 레이아웃 사용"
|
||||
"Use Book Layout": "책 레이아웃 사용",
|
||||
"End of this section. Continue to the next.": "이 섹션의 끝입니다. 다음으로 계속하세요.",
|
||||
"Auto-download": "자동 다운로드",
|
||||
"Auto-download new items": "새 항목 자동 다운로드",
|
||||
"Automatically download new publications when the app syncs": "앱 동기화 시 새 출판물 자동 다운로드",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDS에서 {{count}}개의 새 항목이 다운로드됨",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "OPDS 카탈로그 {{count}}개 동기화 실패",
|
||||
"Last synced {{when}}": "마지막 동기화 {{when}}",
|
||||
"Failed downloads": "실패한 다운로드",
|
||||
"No failed downloads": "실패한 다운로드 없음",
|
||||
"Attempts: {{count}}_other": "시도: {{count}}",
|
||||
"Skip": "건너뛰기",
|
||||
"Skip all": "모두 건너뛰기",
|
||||
"Retry all": "모두 재시도",
|
||||
"{{count}} failed_other": "{{count}}개 실패",
|
||||
"(none)": "(없음)",
|
||||
"Identifiers": "식별자",
|
||||
"Read (Stream)": "읽기 (스트림)",
|
||||
"Failed to start stream": "스트림을 시작할 수 없습니다",
|
||||
"No dictionaries enabled": "활성화된 사전이 없습니다",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "설정 → 언어 → 사전 에서 사전을 활성화하세요.",
|
||||
"Wiktionary": "위키낱말사전",
|
||||
"Drag to reorder": "드래그하여 순서 변경",
|
||||
"Built-in": "내장",
|
||||
"Bundle is missing on this device. Re-import to use it.": "이 기기에 번들이 없습니다. 사용하려면 다시 가져오세요.",
|
||||
"This dictionary format is not supported.": "이 사전 형식은 지원되지 않습니다.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "{{count}}개 사전 가져옴",
|
||||
"Skipped incomplete bundles: {{names}}": "불완전한 번들 건너뜀: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "사전 가져오기 실패: {{message}}",
|
||||
"Dictionaries": "사전",
|
||||
"Delete Dictionary": "사전 삭제",
|
||||
"Importing…": "가져오는 중…",
|
||||
"Import Dictionary": "사전 가져오기",
|
||||
"No dictionaries available.": "사용 가능한 사전이 없습니다.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict 번들은 .ifo, .idx, .dict.dz 파일이 필요합니다(.syn은 선택).",
|
||||
"Select all the bundle files together when importing.": "가져올 때 번들의 모든 파일을 함께 선택하세요.",
|
||||
"Manage Dictionaries": "사전 관리",
|
||||
"Select Dictionary Files": "사전 파일 선택",
|
||||
"Read on Wikipedia →": "위키백과에서 읽기 →",
|
||||
"This link can't be opened": "이 링크를 열 수 없습니다",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "주석 링크에 필요한 정보가 누락되었습니다. 원본 링크가 잘렸을 수 있습니다.",
|
||||
"Go to Readest": "Readest로 이동",
|
||||
"Open-source ebook reader for everyone, on every device.": "누구나, 어떤 기기에서나 사용할 수 있는 오픈소스 전자책 리더.",
|
||||
"Open in Readest": "Readest에서 열기",
|
||||
"If Readest didn't open automatically, choose an option below:": "Readest가 자동으로 열리지 않았다면 아래에서 선택하세요:",
|
||||
"Continue reading where you left off.": "마지막으로 읽던 곳부터 이어서 읽으세요.",
|
||||
"Readest logo": "Readest 로고",
|
||||
"Opening Readest...": "Readest를 여는 중…",
|
||||
"Open in Readest app": "Readest 앱에서 열기",
|
||||
"Continue in browser": "브라우저에서 계속",
|
||||
"Don't have Readest?": "Readest가 없으신가요?",
|
||||
"Book not in your library": "책이 라이브러리에 없습니다",
|
||||
"Share Book": "책 공유",
|
||||
"Could not create share link": "공유 링크를 만들 수 없습니다",
|
||||
"Link copied": "링크가 복사되었습니다",
|
||||
"Could not copy link": "링크를 복사할 수 없습니다",
|
||||
"Share revoked": "공유가 취소되었습니다",
|
||||
"Could not revoke share": "공유를 취소할 수 없습니다",
|
||||
"Uploading book…": "책 업로드 중…",
|
||||
"Generating…": "생성 중…",
|
||||
"Generate share link": "공유 링크 만들기",
|
||||
"Share URL": "공유 URL",
|
||||
"Copy link": "링크 복사",
|
||||
"Copied": "복사됨",
|
||||
"Share via…": "공유…",
|
||||
"Expires {{date}}": "{{date}}에 만료",
|
||||
"Revoking…": "취소 중…",
|
||||
"Revoke share": "공유 취소",
|
||||
"Sign in to share books": "책을 공유하려면 로그인하세요",
|
||||
"Expiring soon": "곧 만료",
|
||||
"Missing share token": "공유 토큰이 없습니다",
|
||||
"Could not add to your library": "내 라이브러리에 추가할 수 없습니다",
|
||||
"This share link is no longer available": "이 공유 링크는 더 이상 사용할 수 없습니다",
|
||||
"The original link may have expired or been revoked.": "원래 링크가 만료되었거나 취소되었을 수 있습니다.",
|
||||
"Get Readest": "Readest 받기",
|
||||
"Loading shared book…": "공유된 책을 불러오는 중…",
|
||||
"Adding…": "추가 중…",
|
||||
"Add to my library": "내 라이브러리에 추가",
|
||||
"Could not load your shares": "공유를 불러올 수 없습니다",
|
||||
"Revoked": "취소됨",
|
||||
"Expired": "만료됨",
|
||||
"Shared books": "공유된 책",
|
||||
"You haven't shared any books yet": "아직 책을 공유하지 않았습니다",
|
||||
"Open a book and tap Share to send it to a friend.": "책을 열고 공유를 눌러 친구에게 보내세요.",
|
||||
"{{count}} active_other": "활성 {{count}}개",
|
||||
"{{count}} downloads_other": "{{count}}회 다운로드",
|
||||
"starts at saved page": "저장된 페이지에서 시작",
|
||||
"More actions": "추가 작업",
|
||||
"Loading…": "불러오는 중…",
|
||||
"Load more": "더 보기",
|
||||
"Could not load shared book": "공유된 책을 불러올 수 없습니다",
|
||||
"The share link is missing required information.": "공유 링크에 필요한 정보가 없습니다.",
|
||||
"Please check your connection and try again.": "연결을 확인한 후 다시 시도하세요.",
|
||||
"Sign in to import shared books": "공유된 책을 가져오려면 로그인하세요",
|
||||
"Already in your library": "이미 라이브러리에 있습니다",
|
||||
"Added to your library": "라이브러리에 추가되었습니다",
|
||||
"Could not import shared book": "공유된 책을 가져올 수 없습니다",
|
||||
"Manage Shared Links": "공유 링크 관리",
|
||||
"Expires in": "만료",
|
||||
"{{count}} days_other": "{{count}}일",
|
||||
"Expires in {{count}} days_other": "{{count}}일 후 만료",
|
||||
"Expires in {{count}} hours_other": "{{count}}시간 후 만료",
|
||||
"Open in app": "앱에서 열기",
|
||||
"Shared with you": "회원님과 공유됨",
|
||||
"Downloading… {{percent}}%": "다운로드 중… {{percent}}%",
|
||||
"Import progress": "가져오기 진행률",
|
||||
"Share reading progress": "읽기 진행률 공유",
|
||||
"Includes your reading progress": "읽기 진행률 포함됨",
|
||||
"Synced {{time}}": "{{time}} 동기화됨",
|
||||
"Sync Info": "동기화 정보",
|
||||
"Last Synced": "마지막 동기화",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT 번들에는 .index 파일과 .dict.dz 파일이 필요합니다.",
|
||||
"Slob bundles need a .slob file.": "Slob 번들에는 .slob 파일이 필요합니다.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL 템플릿은 http(s):// 로 시작하고 %WORD%를 포함해야 합니다.",
|
||||
"Web": "웹",
|
||||
"Add Web Search": "웹 검색 추가",
|
||||
"Edit Web Search": "웹 검색 편집",
|
||||
"e.g. Google": "예: Google",
|
||||
"URL Template": "URL 템플릿",
|
||||
"Use %WORD% where the looked-up word should appear.": "검색어가 표시될 위치에 %WORD%를 사용하세요.",
|
||||
"Open the search result in your browser:": "브라우저에서 검색 결과 열기:",
|
||||
"Open in {{name}}": "{{name}}에서 열기",
|
||||
"Book Fingerprint": "책 지문",
|
||||
"Search the web": "웹에서 검색",
|
||||
"App deeplink (readest://)": "앱 딥링크 (readest://)",
|
||||
"Universal web link (https://)": "범용 웹 링크 (https://)",
|
||||
"Name cannot be empty.": "이름은 비워 둘 수 없습니다.",
|
||||
"Replaced {{count}} existing dictionary_other": "기존 사전 {{count}}개를 교체했습니다",
|
||||
"Cancel Edit": "편집 취소",
|
||||
"Edit Dictionary": "사전 편집",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict 번들은 .mdx 파일을 사용합니다. 동반된 .mdd 및 .css 파일은 선택 사항입니다.",
|
||||
"Dictionary name": "사전 이름",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "여기서는 이 오디오를 재생할 수 없습니다 — 사전이 오래된 형식을 사용합니다. Opus, MP3 또는 WAV 오디오 사전을 사용해 보세요.",
|
||||
"File uploaded: {{title}}": "파일 업로드됨: {{title}}",
|
||||
"File downloaded: {{title}}": "파일 다운로드됨: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "파일의 클라우드 사본이 삭제됨: {{title}}",
|
||||
"Failed to upload file: {{title}}": "파일 업로드 실패: {{title}}",
|
||||
"Failed to download file: {{title}}": "파일 다운로드 실패: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "파일의 클라우드 사본 삭제에 실패했습니다: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% 사용됨",
|
||||
"Set PIN…": "PIN 설정…",
|
||||
"Require a 4-digit PIN to open Readest": "Readest를 열 때 4자리 PIN 요구",
|
||||
"Change PIN…": "PIN 변경…",
|
||||
"Disable PIN…": "PIN 비활성화…",
|
||||
"Sync passphrase ready": "동기화 암호 문구가 준비되었습니다",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "이 작업을 수행하면 모든 기기에서 동기화하는 암호화된 자격 증명(예: OPDS 카탈로그 비밀번호)이 영구적으로 삭제됩니다. 로컬 복사본은 보존됩니다. 동기화 암호 문구를 다시 입력하거나 새로 설정해야 합니다. 계속하시겠습니까?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "동기화 암호 문구를 잊었습니다 — 모든 암호화된 필드가 지워졌습니다",
|
||||
"Sync passphrase": "동기화 암호 문구",
|
||||
"Set passphrase": "암호 문구 설정",
|
||||
"Forgot passphrase": "암호 문구를 잊으셨나요",
|
||||
"Incorrect PIN": "잘못된 PIN",
|
||||
"App locked": "앱이 잠겼습니다",
|
||||
"Enter your PIN": "PIN을 입력하세요",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest가 잠겼습니다. 계속하려면 4자리 PIN을 입력하세요.",
|
||||
"PIN code": "PIN 코드",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PIN을 잊으면 이 기기에서 잠금이 걸립니다. 재설정하려면 앱 데이터를 지워야 합니다.",
|
||||
"Passphrase must be at least 8 characters": "암호 문구는 8자 이상이어야 합니다",
|
||||
"Passphrases do not match": "암호 문구가 일치하지 않습니다",
|
||||
"Set sync passphrase": "동기화 암호 문구 설정",
|
||||
"Enter sync passphrase": "동기화 암호 문구 입력",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "동기화 암호 문구는 OPDS 카탈로그 자격 증명과 같은 민감한 필드를 동기화하기 전에 암호화합니다. 우리는 이 암호 문구를 결코 볼 수 없습니다. 기억하기 쉬운 것을 고르세요 — 잃어버리면 복구할 수 없습니다.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "다른 기기에서 설정한 동기화 암호 문구를 입력하여 동기화된 자격 증명을 복호화합니다.",
|
||||
"Confirm passphrase": "암호 문구 확인",
|
||||
"Unlock": "잠금 해제",
|
||||
"Set PIN": "PIN 설정",
|
||||
"Change PIN": "PIN 변경",
|
||||
"Disable PIN": "PIN 비활성화",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "현재 PIN을 입력한 다음 새 4자리 PIN을 선택하세요.",
|
||||
"Enter your current PIN to disable the app lock.": "앱 잠금을 비활성화하려면 현재 PIN을 입력하세요.",
|
||||
"PIN must be {{length}} digits": "PIN은 {{length}}자리여야 합니다",
|
||||
"PINs do not match": "PIN이 일치하지 않습니다",
|
||||
"Current PIN": "현재 PIN",
|
||||
"New PIN": "새 PIN",
|
||||
"Confirm new PIN": "새 PIN 확인",
|
||||
"Manage Sync": "동기화 관리",
|
||||
"Imported book files and library metadata": "가져온 도서 파일과 서재 메타데이터",
|
||||
"Last-read position, bookmarks, and per-book preferences": "마지막 읽은 위치, 북마크, 도서별 환경설정",
|
||||
"Highlights and notes": "하이라이트와 노트",
|
||||
"Fonts": "글꼴",
|
||||
"Custom font files": "사용자 지정 글꼴 파일",
|
||||
"Backgrounds": "배경",
|
||||
"Custom background textures": "사용자 지정 배경 텍스처",
|
||||
"OPDS catalogs": "OPDS 카탈로그",
|
||||
"Saved catalog URLs and (encrypted) credentials": "저장된 카탈로그 URL과 (암호화된) 자격 증명",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "동기화 암호가 잘못되었습니다 — 동기화된 자격 증명을 복호화할 수 없습니다",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "서버의 동기화 암호 데이터가 재설정되었습니다. 새 암호로 자격 증명을 다시 암호화하는 중입니다…",
|
||||
"Failed to decrypt synced credentials": "동기화된 자격 증명을 복호화하지 못했습니다",
|
||||
"Imported dictionary bundles and settings": "가져온 사전 번들과 설정",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "기기 간에 동기화할 항목을 선택하세요. 카테고리를 비활성화하면 이 기기는 해당 종류의 항목을 보내거나 받지 않습니다. 서버에 이미 있는 데이터는 그대로 유지되며, 다시 활성화하면 중단한 지점부터 이어집니다.",
|
||||
"Data Sync": "데이터 동기화",
|
||||
"Manage Fonts": "글꼴 관리",
|
||||
"App settings": "앱 설정",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "테마, 하이라이트 색상, 연동 (KOSync, Readwise, Hardcover), 사전 순서",
|
||||
"Required while Dictionaries sync is enabled": "사전 동기화가 켜져 있는 동안 필요",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}}시간 {{minutes}}분 후 재설정",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4자리 PIN을 선택하세요. Readest를 열 때마다 입력해야 합니다. 잊어버린 PIN을 복구할 방법은 없습니다. 앱 데이터를 지우는 것이 PIN을 재설정하는 유일한 방법입니다.",
|
||||
"Credentials": "자격 증명",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise의 토큰, 사용자 이름, 비밀번호입니다. 비활성화되면 자격 증명이 이 기기에만 남아 있고 절대 업로드되지 않습니다.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "민감한 동기화 필드는 업로드 전에 암호화됩니다. 지금 또는 암호화가 필요할 때 나중에 암호 문구를 설정하세요.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "이 계정에 저장되었습니다. 자격 증명을 복호화할 때 입력하라는 메시지가 표시됩니다.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "이 기기의 읽기 진행 상황이 \"{{deviceName}}\"와(과) 다릅니다.",
|
||||
"This device": "이 기기",
|
||||
"Red": "빨강",
|
||||
"Yellow": "노랑",
|
||||
"Green": "초록",
|
||||
"Blue": "파랑",
|
||||
"Violet": "보라",
|
||||
"Edit color": "색상 편집",
|
||||
"Add custom color": "사용자 지정 색상 추가",
|
||||
"Add label": "라벨 추가",
|
||||
"Choose color": "색상 선택",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcover에 연결됨. 마지막 동기화 {{time}}.",
|
||||
"Integrations": "통합",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwise에 연결됨. 마지막 동기화 {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "온라인 카탈로그에서 책을 둘러보고 다운로드하세요.",
|
||||
"Connected as {{user}}": "{{user}}(으)로 연결됨",
|
||||
"Not connected": "연결되지 않음",
|
||||
"{{count}} catalog_other": "카탈로그 {{count}}개",
|
||||
"No catalogs": "카탈로그 없음",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "동기화, 하이라이트, 카탈로그를 위해 Readest를 외부 서비스에 연결하세요.",
|
||||
"Reading Sync": "읽기 동기화",
|
||||
"Content Sources": "콘텐츠 소스",
|
||||
"Scroll tabs": "탭 스크롤",
|
||||
"Catalog actions": "카탈로그 작업",
|
||||
"File Content": "파일 내용",
|
||||
"Start your library": "서재 만들기",
|
||||
"Pick a book from your device to add it to your library.": "기기에서 책을 골라 서재에 추가하세요.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "이 창의 아무 곳에나 책을 놓거나, 컴퓨터에서 골라 보세요.",
|
||||
"Sign in to sync your library": "로그인하여 서재 동기화"
|
||||
}
|
||||
|
||||
@@ -160,7 +160,6 @@
|
||||
"Failed to delete cloud backup of the book: {{title}}": "Gagal memadam sandaran awan buku: {{title}}",
|
||||
"Failed to delete local copy of the book: {{title}}": "Gagal memadam salinan tempatan buku: {{title}}",
|
||||
"Library Header": "Pengepala Perpustakaan",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Selamat datang ke perpustakaan anda. Anda boleh import buku anda di sini dan membacanya bila-bila masa.",
|
||||
"Copied to notebook": "Disalin ke buku nota",
|
||||
"No annotations to export": "Tiada anotasi untuk dieksport",
|
||||
"Exported from Readest": "Dieksport dari Readest",
|
||||
@@ -212,13 +211,9 @@
|
||||
"Header Bar": "Bar Pengepala",
|
||||
"View Options": "Pilihan Paparan",
|
||||
"Sync Conflict": "Konflik Segerak",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Segerakkan kemajuan membaca dari \"{{deviceName}}\"?",
|
||||
"another device": "peranti lain",
|
||||
"Local Progress": "Kemajuan Tempatan",
|
||||
"Remote Progress": "Kemajuan Jauh",
|
||||
"Failed to connect": "Gagal menyambung",
|
||||
"Disconnected": "Terputus",
|
||||
"KOReader Sync Settings": "Tetapan Segerak KOReader",
|
||||
"Sync as {{userDisplayName}}": "Segerak sebagai {{userDisplayName}}",
|
||||
"Sync Server Connected": "Pelayan Segerak Disambung",
|
||||
"Sync Strategy": "Strategi Segerak",
|
||||
@@ -227,7 +222,6 @@
|
||||
"Send changes only": "Hantar perubahan sahaja",
|
||||
"Receive changes only": "Terima perubahan sahaja",
|
||||
"Checksum Method": "Kaedah Semak Jumlah",
|
||||
"File Content (recommended)": "Kandungan Fail (disyorkan)",
|
||||
"File Name": "Nama Fail",
|
||||
"Device Name": "Nama Peranti",
|
||||
"Connect to your KOReader Sync server.": "Sambung ke pelayan Segerak KOReader anda.",
|
||||
@@ -315,7 +309,6 @@
|
||||
"Separate Cover Page": "Halaman Kulit Berasingan",
|
||||
"Scrolled Mode": "Mod Tatal",
|
||||
"Sign in to Sync": "Log masuk untuk Segerak",
|
||||
"Synced at {{time}}": "Disegerak pada {{time}}",
|
||||
"Never synced": "Tidak pernah disegerak",
|
||||
"Invert Image In Dark Mode": "Songsangkan Imej Dalam Mod Gelap",
|
||||
"Failed to auto-save book cover for lock screen: {{error}}": "Gagal auto-simpan kulit buku untuk skrin kunci: {{error}}",
|
||||
@@ -496,7 +489,6 @@
|
||||
"Strikethrough": "Garis Lorek",
|
||||
"Squiggly": "Berkelok-kelok",
|
||||
"Outline": "Garis Besar",
|
||||
"Save Current Color": "Simpan Warna Semasa",
|
||||
"Quick Colors": "Warna Pantas",
|
||||
"Override Book Color": "Ganti Warna Buku",
|
||||
"Scroll": "Tatal",
|
||||
@@ -781,7 +773,6 @@
|
||||
"Annotate text after selection": "Anotasi teks selepas pilihan",
|
||||
"Search text after selection": "Cari teks selepas pilihan",
|
||||
"Look up text in dictionary after selection": "Cari teks dalam kamus selepas pilihan",
|
||||
"Look up text in Wikipedia after selection": "Cari teks dalam Wikipedia selepas pilihan",
|
||||
"Translate text after selection": "Terjemah teks selepas pilihan",
|
||||
"Read text aloud after selection": "Baca teks dengan kuat selepas pilihan",
|
||||
"Proofread text after selection": "Semak teks selepas pilihan",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "Gagal mengeksport buku.",
|
||||
"Export Book": "Eksport Buku",
|
||||
"Whole word:": "Perkataan penuh:",
|
||||
"Error": "Ralat",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Tidak dapat memuatkan artikel. Cuba cari terus di {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Tidak dapat memuatkan perkataan. Cuba cari terus di {{link}}.",
|
||||
"Date Published": "Tarikh diterbitkan",
|
||||
"Only for TTS:": "Hanya untuk TTS:",
|
||||
"Uploaded": "Dimuat naik",
|
||||
@@ -1027,16 +1015,12 @@
|
||||
"Invalid Readwise access token": "Token akses Readwise tidak sah",
|
||||
"Disconnected from Readwise": "Terputus sambungan daripada Readwise",
|
||||
"Never": "Tidak pernah",
|
||||
"Readwise Settings": "Tetapan Readwise",
|
||||
"Connected to Readwise": "Disambungkan ke Readwise",
|
||||
"Last synced: {{time}}": "Kali terakhir disinkronkan: {{time}}",
|
||||
"Sync Enabled": "Penyinkronan Didayakan",
|
||||
"Disconnect": "Putuskan sambungan",
|
||||
"Connect your Readwise account to sync highlights.": "Sambungkan akaun Readwise anda untuk menyinkronkan sorotan.",
|
||||
"Get your access token at": "Dapatkan token akses anda di",
|
||||
"Access Token": "Token Akses",
|
||||
"Paste your Readwise access token": "Tampal token akses Readwise anda",
|
||||
"Config": "Konfigurasi",
|
||||
"Readwise Sync": "Penyinkronan Readwise",
|
||||
"Push Highlights": "Hantar Sorotan",
|
||||
"Highlights synced to Readwise": "Sorotan disinkronkan ke Readwise",
|
||||
@@ -1106,7 +1090,6 @@
|
||||
"Copy Selection": "Salin pilihan",
|
||||
"Translate Selection": "Terjemah pilihan",
|
||||
"Dictionary Lookup": "Cari dalam kamus",
|
||||
"Wikipedia Lookup": "Cari di Wikipedia",
|
||||
"Read Aloud Selection": "Baca kuat pilihan",
|
||||
"Proofread Selection": "Semak pilihan",
|
||||
"Open Settings": "Buka tetapan",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "Seret untuk mencari",
|
||||
"Punctuation Delay": "Kelewatan tanda baca",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Sila sahkan bahawa sambungan OPDS ini akan diproksi melalui pelayan Readest pada aplikasi web sebelum meneruskan.",
|
||||
"Custom Headers": "Pengepala Tersuai",
|
||||
"Custom Headers (optional)": "Pengepala Tersuai (pilihan)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Tambah satu pengepala setiap baris menggunakan \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Saya faham bahawa sambungan OPDS ini akan diproksi melalui pelayan Readest pada aplikasi web. Jika saya tidak mempercayai Readest dengan kelayakan atau pengepala ini, saya perlu menggunakan aplikasi natif.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Tidak dapat menyambung ke Hardcover. Sila semak sambungan rangkaian anda.",
|
||||
"Invalid Hardcover API token": "Token API Hardcover tidak sah",
|
||||
"Disconnected from Hardcover": "Diputuskan dari Hardcover",
|
||||
"Hardcover Settings": "Tetapan Hardcover",
|
||||
"Connected to Hardcover": "Disambungkan ke Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Sambungkan akaun Hardcover anda untuk menyegerakkan kemajuan bacaan dan nota.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Dapatkan token API anda dari hardcover.app → Tetapan → API.",
|
||||
"API Token": "Token API",
|
||||
"Paste your Hardcover API token": "Tampal token API Hardcover anda",
|
||||
"Hardcover sync enabled for this book": "Penyegerakan Hardcover diaktifkan untuk buku ini",
|
||||
"Hardcover sync disabled for this book": "Penyegerakan Hardcover dinyahaktifkan untuk buku ini",
|
||||
"Hardcover Sync": "Penyegerakan Hardcover",
|
||||
"Enable for This Book": "Aktifkan untuk Buku Ini",
|
||||
"Push Notes": "Hantar Nota",
|
||||
"Enable Hardcover sync for this book first.": "Aktifkan penyegerakan Hardcover untuk buku ini terlebih dahulu.",
|
||||
"No annotations or excerpts to sync for this book.": "Tiada anotasi atau petikan untuk disegerakkan bagi buku ini.",
|
||||
"Configure Hardcover in Settings first.": "Konfigurasikan Hardcover dalam Tetapan terlebih dahulu.",
|
||||
"No new Hardcover note changes to sync.": "Tiada perubahan nota Hardcover baharu untuk disegerakkan.",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "Pisahkan Sempang",
|
||||
"Apply Theme Colors to PDF": "Gunakan Warna Tema pada PDF",
|
||||
"Name": "Nama",
|
||||
"Unavailable": "Tidak Tersedia",
|
||||
"Remove": "Alih keluar",
|
||||
"Edit OPDS Catalog": "Edit Katalog OPDS",
|
||||
"Save Changes": "Simpan Perubahan",
|
||||
"Use Book Layout": "Guna susun atur buku"
|
||||
"Use Book Layout": "Guna susun atur buku",
|
||||
"End of this section. Continue to the next.": "Akhir bahagian ini. Teruskan ke bahagian seterusnya.",
|
||||
"Auto-download": "Muat turun automatik",
|
||||
"Auto-download new items": "Muat turun item baharu secara automatik",
|
||||
"Automatically download new publications when the app syncs": "Muat turun penerbitan baharu secara automatik apabila apl disegerakkan",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} item baharu dimuat turun dari OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Gagal menyegerak {{count}} katalog OPDS",
|
||||
"Last synced {{when}}": "Selaras kali terakhir {{when}}",
|
||||
"Failed downloads": "Muat turun gagal",
|
||||
"No failed downloads": "Tiada muat turun gagal",
|
||||
"Attempts: {{count}}_other": "Percubaan: {{count}}",
|
||||
"Skip": "Langkau",
|
||||
"Skip all": "Langkau semua",
|
||||
"Retry all": "Cuba lagi semua",
|
||||
"{{count}} failed_other": "{{count}} gagal",
|
||||
"(none)": "(tiada)",
|
||||
"Identifiers": "Pengenal",
|
||||
"Read (Stream)": "Baca (Strim)",
|
||||
"Failed to start stream": "Gagal memulakan strim",
|
||||
"No dictionaries enabled": "Tiada kamus diaktifkan",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Aktifkan kamus di Tetapan → Bahasa → Kamus.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Seret untuk susun semula",
|
||||
"Built-in": "Terbina dalam",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Bundle tiada pada peranti ini. Import semula untuk menggunakannya.",
|
||||
"This dictionary format is not supported.": "Format kamus ini tidak disokong.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "{{count}} kamus diimport",
|
||||
"Skipped incomplete bundles: {{names}}": "Bundle tidak lengkap dilangkau: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Gagal mengimport kamus: {{message}}",
|
||||
"Dictionaries": "Kamus",
|
||||
"Delete Dictionary": "Padam Kamus",
|
||||
"Importing…": "Mengimport…",
|
||||
"Import Dictionary": "Import Kamus",
|
||||
"No dictionaries available.": "Tiada kamus tersedia.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Bundle StarDict memerlukan fail .ifo, .idx dan .dict.dz (.syn pilihan).",
|
||||
"Select all the bundle files together when importing.": "Pilih semua fail bundle sekali gus semasa mengimport.",
|
||||
"Manage Dictionaries": "Urus Kamus",
|
||||
"Select Dictionary Files": "Pilih Fail Kamus",
|
||||
"Read on Wikipedia →": "Baca di Wikipedia →",
|
||||
"This link can't be opened": "Pautan ini tidak boleh dibuka",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Pautan anotasi tiada maklumat yang diperlukan. Pautan asal mungkin telah dipotong.",
|
||||
"Go to Readest": "Pergi ke Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Pembaca e-buku sumber terbuka untuk semua orang, pada setiap peranti.",
|
||||
"Open in Readest": "Buka dalam Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Jika Readest tidak dibuka secara automatik, pilih pilihan di bawah:",
|
||||
"Continue reading where you left off.": "Sambung membaca dari tempat anda berhenti.",
|
||||
"Readest logo": "Logo Readest",
|
||||
"Opening Readest...": "Membuka Readest…",
|
||||
"Open in Readest app": "Buka dalam aplikasi Readest",
|
||||
"Continue in browser": "Teruskan dalam pelayar",
|
||||
"Don't have Readest?": "Tiada Readest?",
|
||||
"Book not in your library": "Buku tiada dalam pustaka anda",
|
||||
"Share Book": "Kongsi Buku",
|
||||
"Could not create share link": "Tidak dapat mencipta pautan kongsi",
|
||||
"Link copied": "Pautan disalin",
|
||||
"Could not copy link": "Tidak dapat menyalin pautan",
|
||||
"Share revoked": "Perkongsian dibatalkan",
|
||||
"Could not revoke share": "Tidak dapat membatalkan perkongsian",
|
||||
"Uploading book…": "Memuat naik buku…",
|
||||
"Generating…": "Menjana…",
|
||||
"Generate share link": "Jana pautan kongsi",
|
||||
"Share URL": "URL Kongsi",
|
||||
"Copy link": "Salin pautan",
|
||||
"Copied": "Disalin",
|
||||
"Share via…": "Kongsi melalui…",
|
||||
"Expires {{date}}": "Tamat pada {{date}}",
|
||||
"Revoking…": "Membatalkan…",
|
||||
"Revoke share": "Batalkan perkongsian",
|
||||
"Sign in to share books": "Log masuk untuk berkongsi buku",
|
||||
"Expiring soon": "Akan tamat tidak lama lagi",
|
||||
"Missing share token": "Token kongsi hilang",
|
||||
"Could not add to your library": "Tidak dapat ditambah ke pustaka anda",
|
||||
"This share link is no longer available": "Pautan kongsi ini tidak lagi tersedia",
|
||||
"The original link may have expired or been revoked.": "Pautan asal mungkin telah tamat tempoh atau dibatalkan.",
|
||||
"Get Readest": "Dapatkan Readest",
|
||||
"Loading shared book…": "Memuat buku yang dikongsi…",
|
||||
"Adding…": "Menambah…",
|
||||
"Add to my library": "Tambah ke pustaka saya",
|
||||
"Could not load your shares": "Tidak dapat memuat perkongsian anda",
|
||||
"Revoked": "Dibatalkan",
|
||||
"Expired": "Tamat tempoh",
|
||||
"Shared books": "Buku yang dikongsi",
|
||||
"You haven't shared any books yet": "Anda belum berkongsi sebarang buku",
|
||||
"Open a book and tap Share to send it to a friend.": "Buka buku dan ketik Kongsi untuk menghantarnya kepada rakan.",
|
||||
"{{count}} active_other": "{{count}} aktif",
|
||||
"{{count}} downloads_other": "{{count}} muat turun",
|
||||
"starts at saved page": "mula dari halaman tersimpan",
|
||||
"More actions": "Tindakan lain",
|
||||
"Loading…": "Memuat…",
|
||||
"Load more": "Muat lagi",
|
||||
"Could not load shared book": "Tidak dapat memuat buku yang dikongsi",
|
||||
"The share link is missing required information.": "Pautan kongsi tidak mempunyai maklumat yang diperlukan.",
|
||||
"Please check your connection and try again.": "Sila semak sambungan anda dan cuba lagi.",
|
||||
"Sign in to import shared books": "Log masuk untuk mengimport buku yang dikongsi",
|
||||
"Already in your library": "Sudah ada dalam pustaka anda",
|
||||
"Added to your library": "Ditambah ke pustaka anda",
|
||||
"Could not import shared book": "Tidak dapat mengimport buku yang dikongsi",
|
||||
"Manage Shared Links": "Urus pautan kongsi",
|
||||
"Expires in": "Tamat dalam",
|
||||
"{{count}} days_other": "{{count}} hari",
|
||||
"Expires in {{count}} days_other": "Tamat dalam {{count}} hari",
|
||||
"Expires in {{count}} hours_other": "Tamat dalam {{count}} jam",
|
||||
"Open in app": "Buka dalam app",
|
||||
"Shared with you": "Dikongsi dengan anda",
|
||||
"Downloading… {{percent}}%": "Memuat turun… {{percent}}%",
|
||||
"Import progress": "Kemajuan import",
|
||||
"Share reading progress": "Kongsi kemajuan bacaan",
|
||||
"Includes your reading progress": "Termasuk kemajuan bacaan anda",
|
||||
"Synced {{time}}": "Disegerakkan {{time}}",
|
||||
"Sync Info": "Maklumat penyegerakan",
|
||||
"Last Synced": "Penyegerakan terakhir",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Pakej DICT memerlukan fail .index dan fail .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Pakej Slob memerlukan fail .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Templat URL mesti bermula dengan http(s):// dan mengandungi %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Tambah Carian Web",
|
||||
"Edit Web Search": "Edit Carian Web",
|
||||
"e.g. Google": "cth. Google",
|
||||
"URL Template": "Templat URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Gunakan %WORD% di mana perkataan yang dicari harus muncul.",
|
||||
"Open the search result in your browser:": "Buka hasil carian dalam pelayar anda:",
|
||||
"Open in {{name}}": "Buka dalam {{name}}",
|
||||
"Book Fingerprint": "Cap jari buku",
|
||||
"Search the web": "Cari di web",
|
||||
"App deeplink (readest://)": "Pautan dalam apl (readest://)",
|
||||
"Universal web link (https://)": "Pautan web universal (https://)",
|
||||
"Name cannot be empty.": "Nama tidak boleh kosong.",
|
||||
"Replaced {{count}} existing dictionary_other": "Menggantikan {{count}} kamus sedia ada",
|
||||
"Cancel Edit": "Batal Sunting",
|
||||
"Edit Dictionary": "Sunting Kamus",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Bungkusan MDict menggunakan fail .mdx; fail .mdd dan .css yang menyertainya adalah pilihan.",
|
||||
"Dictionary name": "Nama kamus",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Audio ini tidak boleh dimainkan di sini — kamus menggunakan format lapuk. Cuba kamus dengan audio Opus, MP3 atau WAV.",
|
||||
"File uploaded: {{title}}": "Fail dimuat naik: {{title}}",
|
||||
"File downloaded: {{title}}": "Fail dimuat turun: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Salinan awan fail dipadam: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Gagal memuat naik fail: {{title}}",
|
||||
"Failed to download file: {{title}}": "Gagal memuat turun fail: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Gagal memadam salinan awan fail: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% telah digunakan",
|
||||
"Set PIN…": "Tetapkan PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Wajibkan PIN 4 digit untuk membuka Readest",
|
||||
"Change PIN…": "Tukar PIN…",
|
||||
"Disable PIN…": "Lumpuhkan PIN…",
|
||||
"Sync passphrase ready": "Frasa laluan penyegerakan sedia",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Ini memadamkan secara kekal bukti kelayakan tersulit yang kami selaraskan (cth., kata laluan katalog OPDS) pada setiap peranti. Salinan tempatan dikekalkan. Anda perlu memasukkan semula frasa laluan penyegerakan atau menetapkan yang baharu. Teruskan?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Frasa laluan penyegerakan dilupakan — semua medan tersulit dikosongkan",
|
||||
"Sync passphrase": "Frasa laluan penyegerakan",
|
||||
"Set passphrase": "Tetapkan frasa laluan",
|
||||
"Forgot passphrase": "Lupa frasa laluan",
|
||||
"Incorrect PIN": "PIN salah",
|
||||
"App locked": "Aplikasi terkunci",
|
||||
"Enter your PIN": "Masukkan PIN anda",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest terkunci. Masukkan PIN 4 digit anda untuk meneruskan.",
|
||||
"PIN code": "Kod PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Terlupa PIN akan mengunci anda daripada peranti ini. Anda perlu mengosongkan data aplikasi untuk menetapkannya semula.",
|
||||
"Passphrase must be at least 8 characters": "Frasa laluan mestilah sekurang-kurangnya 8 aksara",
|
||||
"Passphrases do not match": "Frasa laluan tidak sepadan",
|
||||
"Set sync passphrase": "Tetapkan frasa laluan penyegerakan",
|
||||
"Enter sync passphrase": "Masukkan frasa laluan penyegerakan",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Frasa laluan penyegerakan menyulitkan medan sensitif anda (seperti bukti kelayakan katalog OPDS) sebelum ia diselaraskan. Kami tidak pernah melihat frasa laluan ini. Pilih sesuatu yang mudah diingati — tiada pemulihan tanpanya.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Masukkan frasa laluan penyegerakan yang anda tetapkan pada peranti lain untuk menyahsulit bukti kelayakan yang disegerakkan.",
|
||||
"Confirm passphrase": "Sahkan frasa laluan",
|
||||
"Unlock": "Buka kunci",
|
||||
"Set PIN": "Tetapkan PIN",
|
||||
"Change PIN": "Tukar PIN",
|
||||
"Disable PIN": "Lumpuhkan PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Masukkan PIN semasa anda, kemudian pilih PIN 4 digit baharu.",
|
||||
"Enter your current PIN to disable the app lock.": "Masukkan PIN semasa anda untuk melumpuhkan kunci aplikasi.",
|
||||
"PIN must be {{length}} digits": "PIN mesti mengandungi {{length}} digit",
|
||||
"PINs do not match": "PIN tidak sepadan",
|
||||
"Current PIN": "PIN semasa",
|
||||
"New PIN": "PIN baharu",
|
||||
"Confirm new PIN": "Sahkan PIN baharu",
|
||||
"Manage Sync": "Urus penyegerakan",
|
||||
"Imported book files and library metadata": "Fail buku yang diimport dan metadata pustaka",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Kedudukan bacaan terakhir, penanda buku dan keutamaan setiap buku",
|
||||
"Highlights and notes": "Sorotan dan nota",
|
||||
"Fonts": "Fon",
|
||||
"Custom font files": "Fail fon tersuai",
|
||||
"Backgrounds": "Latar belakang",
|
||||
"Custom background textures": "Tekstur latar belakang tersuai",
|
||||
"OPDS catalogs": "Katalog OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URL katalog yang disimpan dan kelayakan (disulitkan)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Frasa laluan penyegerakan salah — kelayakan yang disegerakkan tidak dapat dinyahsulit",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Data frasa laluan penyegerakan pada pelayan telah ditetapkan semula. Menyulitkan semula kelayakan anda dengan frasa laluan baharu…",
|
||||
"Failed to decrypt synced credentials": "Gagal menyahsulit kelayakan yang disegerakkan",
|
||||
"Imported dictionary bundles and settings": "Himpunan kamus yang diimport dan tetapan",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Pilih apa yang disegerakkan antara peranti anda. Melumpuhkan kategori menghentikan peranti ini daripada menghantar atau menerima entri jenis itu. Apa-apa yang sudah ada pada pelayan dibiarkan, mengaktifkannya semula akan menyambung dari tempat anda berhenti.",
|
||||
"Data Sync": "Penyegerakan Data",
|
||||
"Manage Fonts": "Urus Fon",
|
||||
"App settings": "Tetapan aplikasi",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, warna sorotan, integrasi (KOSync, Readwise, Hardcover), dan susunan kamus",
|
||||
"Required while Dictionaries sync is enabled": "Diperlukan semasa penyegerakan Kamus didayakan",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Set semula dalam {{hours}} j {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Pilih PIN 4 digit. Anda perlu memasukkannya setiap kali anda membuka Readest. Tiada cara untuk memulihkan PIN yang terlupa. Mengosongkan data aplikasi adalah satu-satunya cara untuk menetapkannya semula.",
|
||||
"Credentials": "Kelayakan",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token, nama pengguna dan kata laluan untuk OPDS, KOReader, Hardcover dan Readwise. Apabila dilumpuhkan, kelayakan hanya kekal pada peranti ini dan tidak pernah dimuat naik.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Medan disegerakkan yang sensitif disulitkan sebelum dimuat naik. Tetapkan frasa laluan sekarang atau kemudian apabila penyulitan diperlukan.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Disimpan dalam akaun ini. Anda akan diminta memasukkannya apabila kelayakan perlu dinyahsulit.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Kemajuan membaca pada peranti ini berbeza daripada \"{{deviceName}}\".",
|
||||
"This device": "Peranti ini",
|
||||
"Red": "Merah",
|
||||
"Yellow": "Kuning",
|
||||
"Green": "Hijau",
|
||||
"Blue": "Biru",
|
||||
"Violet": "Ungu",
|
||||
"Edit color": "Edit warna",
|
||||
"Add custom color": "Tambah warna tersuai",
|
||||
"Add label": "Tambah label",
|
||||
"Choose color": "Pilih warna",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Disambungkan ke Hardcover. Penyegerakan terakhir {{time}}.",
|
||||
"Integrations": "Integrasi",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Disambungkan ke Readwise. Penyegerakan terakhir {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Lihat dan muat turun buku dari katalog dalam talian.",
|
||||
"Connected as {{user}}": "Disambungkan sebagai {{user}}",
|
||||
"Not connected": "Tidak disambungkan",
|
||||
"{{count}} catalog_other": "{{count}} katalog",
|
||||
"No catalogs": "Tiada katalog",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Sambungkan Readest ke perkhidmatan luar untuk penyegerakan, sorotan dan katalog.",
|
||||
"Reading Sync": "Penyegerakan Bacaan",
|
||||
"Content Sources": "Sumber Kandungan",
|
||||
"Scroll tabs": "Skrol tab",
|
||||
"Catalog actions": "Tindakan katalog",
|
||||
"File Content": "Kandungan fail",
|
||||
"Start your library": "Mulakan perpustakaan anda",
|
||||
"Pick a book from your device to add it to your library.": "Pilih buku dari peranti anda untuk ditambahkan ke perpustakaan anda.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Lepaskan buku di mana-mana pada tetingkap ini, atau pilih satu dari komputer anda.",
|
||||
"Sign in to sync your library": "Daftar masuk untuk menyegerakkan perpustakaan anda"
|
||||
}
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
"Book deleted: {{title}}": "Boek verwijderd: {{title}}",
|
||||
"Failed to delete book: {{title}}": "Verwijderen van boek mislukt: {{title}}",
|
||||
"Your Library": "Uw bibliotheek",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Welkom bij uw bibliotheek. U kunt hier uw boeken importeren en ze op elk moment lezen.",
|
||||
"Copied to notebook": "Gekopieerd naar notitieblok",
|
||||
"No annotations to export": "Geen annotaties om te exporteren",
|
||||
"Exported from Readest": "Geëxporteerd uit Readest",
|
||||
@@ -299,7 +298,6 @@
|
||||
"No notes match your search": "Geen notities gevonden",
|
||||
"Search notes and excerpts...": "Zoek notities...",
|
||||
"Sign in to Sync": "Meld je aan om te synchroniseren",
|
||||
"Synced at {{time}}": "Gesynchroniseerd om {{time}}",
|
||||
"Never synced": "Nooit gesynchroniseerd",
|
||||
"Show Remaining Time": "Toon resterende tijd",
|
||||
"{{time}} min left in chapter": "Nog {{time}} min in hoofdstuk",
|
||||
@@ -461,14 +459,12 @@
|
||||
"Remove from Cloud Only": "Verwijder alleen uit Cloud",
|
||||
"Remove from Device Only": "Verwijder alleen uit Apparaat",
|
||||
"Disconnected": "Verbroken",
|
||||
"KOReader Sync Settings": "KOReader Sync-instellingen",
|
||||
"Sync Strategy": "Synchronisatiestrategie",
|
||||
"Ask on conflict": "Vraag bij conflict",
|
||||
"Always use latest": "Altijd de nieuwste gebruiken",
|
||||
"Send changes only": "Verzend alleen wijzigingen",
|
||||
"Receive changes only": "Ontvang alleen wijzigingen",
|
||||
"Checksum Method": "Checksum-methode",
|
||||
"File Content (recommended)": "Bestandsinhoud (aanbevolen)",
|
||||
"File Name": "Bestandsnaam",
|
||||
"Device Name": "Apparaatnaam",
|
||||
"Connect to your KOReader Sync server.": "Verbind met je KOReader Sync-server.",
|
||||
@@ -479,10 +475,7 @@
|
||||
"Connect": "Verbinden",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "Synchronisatieconflict",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Leesvoortgang synchroniseren van \"{{deviceName}}\"?",
|
||||
"another device": "een ander apparaat",
|
||||
"Local Progress": "Lokale voortgang",
|
||||
"Remote Progress": "Externe voortgang",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Pagina {{page}} van {{total}} ({{percentage}}%)",
|
||||
"Current position": "Huidige positie",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Ongeveer pagina {{page}} van {{total}} ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "Doorhalen",
|
||||
"Squiggly": "Kronkelig",
|
||||
"Outline": "Omtrek",
|
||||
"Save Current Color": "Huidige kleur opslaan",
|
||||
"Quick Colors": "Snelle kleuren",
|
||||
"Highlighter": "Marker",
|
||||
"Save Book Cover": "Opslaan boekomslag",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "Annoteren tekst na selectie",
|
||||
"Search text after selection": "Zoek tekst na selectie",
|
||||
"Look up text in dictionary after selection": "Zoek tekst op in woordenboek na selectie",
|
||||
"Look up text in Wikipedia after selection": "Zoek tekst op in Wikipedia na selectie",
|
||||
"Translate text after selection": "Vertaal tekst na selectie",
|
||||
"Read text aloud after selection": "Lees tekst hardop na selectie",
|
||||
"Proofread text after selection": "Corrigeer tekst na selectie",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "Exporteren van het boek mislukt.",
|
||||
"Export Book": "Boek exporteren",
|
||||
"Whole word:": "Heel woord:",
|
||||
"Error": "Fout",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Kan het artikel niet laden. Probeer direct te zoeken op {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Kan het woord niet laden. Probeer direct te zoeken op {{link}}.",
|
||||
"Date Published": "Publicatiedatum",
|
||||
"Only for TTS:": "Alleen voor TTS:",
|
||||
"Uploaded": "Geüpload",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "Ongeldige Readwise-toegangstoken",
|
||||
"Disconnected from Readwise": "Verbinding met Readwise verbroken",
|
||||
"Never": "Nooit",
|
||||
"Readwise Settings": "Readwise-instellingen",
|
||||
"Connected to Readwise": "Verbonden met Readwise",
|
||||
"Last synced: {{time}}": "Laatst gesynchroniseerd: {{time}}",
|
||||
"Sync Enabled": "Synchronisatie ingeschakeld",
|
||||
"Disconnect": "Verbinding verbreken",
|
||||
"Connect your Readwise account to sync highlights.": "Verbind uw Readwise-account om markeringen te synchroniseren.",
|
||||
"Get your access token at": "Verkrijg uw toegangstoken op",
|
||||
"Access Token": "Toegangstoken",
|
||||
"Paste your Readwise access token": "Plak uw Readwise-toegangstoken",
|
||||
"Config": "Configuratie",
|
||||
"Readwise Sync": "Readwise-synchronisatie",
|
||||
"Push Highlights": "Markeringen verzenden",
|
||||
"Highlights synced to Readwise": "Markeringen gesynchroniseerd met Readwise",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "Selectie kopiëren",
|
||||
"Translate Selection": "Selectie vertalen",
|
||||
"Dictionary Lookup": "Opzoeken in woordenboek",
|
||||
"Wikipedia Lookup": "Opzoeken op Wikipedia",
|
||||
"Read Aloud Selection": "Selectie voorlezen",
|
||||
"Proofread Selection": "Selectie proeflezen",
|
||||
"Open Settings": "Instellingen openen",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "Sleep om te zoeken",
|
||||
"Punctuation Delay": "Leesteken-vertraging",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Bevestig dat deze OPDS-verbinding via Readest-servers in de webapp wordt doorgestuurd voordat u doorgaat.",
|
||||
"Custom Headers": "Aangepaste headers",
|
||||
"Custom Headers (optional)": "Aangepaste headers (optioneel)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Voeg één header per regel toe met \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Ik begrijp dat deze OPDS-verbinding via Readest-servers in de webapp wordt doorgestuurd. Als ik Readest niet vertrouw met deze inloggegevens of headers, moet ik de native app gebruiken.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Kan geen verbinding maken met Hardcover. Controleer uw netwerkverbinding.",
|
||||
"Invalid Hardcover API token": "Ongeldig Hardcover API-token",
|
||||
"Disconnected from Hardcover": "Verbinding met Hardcover verbroken",
|
||||
"Hardcover Settings": "Hardcover-instellingen",
|
||||
"Connected to Hardcover": "Verbonden met Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Verbind uw Hardcover-account om leesvoortgang en notities te synchroniseren.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Haal uw API-token op via hardcover.app → Instellingen → API.",
|
||||
"API Token": "API-token",
|
||||
"Paste your Hardcover API token": "Plak uw Hardcover API-token",
|
||||
"Hardcover sync enabled for this book": "Hardcover-synchronisatie ingeschakeld voor dit boek",
|
||||
"Hardcover sync disabled for this book": "Hardcover-synchronisatie uitgeschakeld voor dit boek",
|
||||
"Hardcover Sync": "Hardcover-synchronisatie",
|
||||
"Enable for This Book": "Inschakelen voor dit boek",
|
||||
"Push Notes": "Notities verzenden",
|
||||
"Enable Hardcover sync for this book first.": "Schakel eerst Hardcover-synchronisatie in voor dit boek.",
|
||||
"No annotations or excerpts to sync for this book.": "Geen annotaties of fragmenten om te synchroniseren voor dit boek.",
|
||||
"Configure Hardcover in Settings first.": "Configureer eerst Hardcover in de instellingen.",
|
||||
"No new Hardcover note changes to sync.": "Geen nieuwe Hardcover-notitiewijzigingen om te synchroniseren.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "Afbreekstreepjes splitsen",
|
||||
"Apply Theme Colors to PDF": "Themakleuren toepassen op PDF",
|
||||
"Name": "Naam",
|
||||
"Unavailable": "Niet beschikbaar",
|
||||
"Remove": "Verwijderen",
|
||||
"Edit OPDS Catalog": "OPDS-catalogus bewerken",
|
||||
"Save Changes": "Wijzigingen opslaan",
|
||||
"Use Book Layout": "Boekindeling gebruiken"
|
||||
"Use Book Layout": "Boekindeling gebruiken",
|
||||
"End of this section. Continue to the next.": "Einde van deze sectie. Ga verder naar de volgende.",
|
||||
"Auto-download": "Automatisch downloaden",
|
||||
"Auto-download new items": "Nieuwe items automatisch downloaden",
|
||||
"Automatically download new publications when the app syncs": "Download automatisch nieuwe publicaties wanneer de app synchroniseert",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} nieuw item gedownload van OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} nieuwe items gedownload van OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Synchronisatie van {{count}} OPDS-catalogus mislukt",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Synchronisatie van {{count}} OPDS-catalogi mislukt",
|
||||
"Last synced {{when}}": "Laatst gesynchroniseerd {{when}}",
|
||||
"Failed downloads": "Mislukte downloads",
|
||||
"No failed downloads": "Geen mislukte downloads",
|
||||
"Attempts: {{count}}_one": "Pogingen: {{count}}",
|
||||
"Attempts: {{count}}_other": "Pogingen: {{count}}",
|
||||
"Skip": "Overslaan",
|
||||
"Skip all": "Alles overslaan",
|
||||
"Retry all": "Alles opnieuw proberen",
|
||||
"{{count}} failed_one": "{{count}} mislukt",
|
||||
"{{count}} failed_other": "{{count}} mislukt",
|
||||
"(none)": "(geen)",
|
||||
"Identifiers": "Identificatoren",
|
||||
"Read (Stream)": "Lezen (Stream)",
|
||||
"Failed to start stream": "Kan stream niet starten",
|
||||
"No dictionaries enabled": "Geen woordenboeken ingeschakeld",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Schakel een woordenboek in via Instellingen → Taal → Woordenboeken.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Sleep om opnieuw te ordenen",
|
||||
"Built-in": "Ingebouwd",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Bundel ontbreekt op dit apparaat. Importeer opnieuw om te gebruiken.",
|
||||
"This dictionary format is not supported.": "Dit woordenboekformaat wordt niet ondersteund.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} woordenboek geïmporteerd",
|
||||
"Imported {{count}} dictionary_other": "{{count}} woordenboeken geïmporteerd",
|
||||
"Skipped incomplete bundles: {{names}}": "Onvolledige bundels overgeslagen: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Importeren van woordenboek mislukt: {{message}}",
|
||||
"Dictionaries": "Woordenboeken",
|
||||
"Delete Dictionary": "Woordenboek verwijderen",
|
||||
"Importing…": "Bezig met importeren…",
|
||||
"Import Dictionary": "Woordenboek importeren",
|
||||
"No dictionaries available.": "Geen woordenboeken beschikbaar.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict-bundels hebben .ifo-, .idx- en .dict.dz-bestanden nodig (.syn optioneel).",
|
||||
"Select all the bundle files together when importing.": "Selecteer bij het importeren alle bundelbestanden tegelijk.",
|
||||
"Manage Dictionaries": "Woordenboeken beheren",
|
||||
"Select Dictionary Files": "Woordenboekbestanden kiezen",
|
||||
"Read on Wikipedia →": "Lees verder op Wikipedia →",
|
||||
"This link can't be opened": "Deze link kan niet worden geopend",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "De annotatielink mist de vereiste gegevens. De oorspronkelijke link is mogelijk afgekapt.",
|
||||
"Go to Readest": "Ga naar Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Open-source e-bookreader voor iedereen, op elk apparaat.",
|
||||
"Open in Readest": "Openen in Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Als Readest niet automatisch is geopend, kies hieronder een optie:",
|
||||
"Continue reading where you left off.": "Lees verder waar je was gebleven.",
|
||||
"Readest logo": "Readest-logo",
|
||||
"Opening Readest...": "Readest wordt geopend…",
|
||||
"Open in Readest app": "Openen in de Readest-app",
|
||||
"Continue in browser": "Doorgaan in de browser",
|
||||
"Don't have Readest?": "Heb je Readest nog niet?",
|
||||
"Book not in your library": "Boek staat niet in je bibliotheek",
|
||||
"Share Book": "Boek delen",
|
||||
"Could not create share link": "Kan deelkoppeling niet maken",
|
||||
"Link copied": "Koppeling gekopieerd",
|
||||
"Could not copy link": "Kan koppeling niet kopiëren",
|
||||
"Share revoked": "Delen ingetrokken",
|
||||
"Could not revoke share": "Kan delen niet intrekken",
|
||||
"Uploading book…": "Boek uploaden…",
|
||||
"Generating…": "Genereren…",
|
||||
"Generate share link": "Deellink maken",
|
||||
"Share URL": "Deel-URL",
|
||||
"Copy link": "Koppeling kopiëren",
|
||||
"Copied": "Gekopieerd",
|
||||
"Share via…": "Delen via…",
|
||||
"Expires {{date}}": "Verloopt op {{date}}",
|
||||
"Revoking…": "Intrekken…",
|
||||
"Revoke share": "Delen intrekken",
|
||||
"Sign in to share books": "Meld u aan om boeken te delen",
|
||||
"Expiring soon": "Verloopt binnenkort",
|
||||
"Missing share token": "Deeltoken ontbreekt",
|
||||
"Could not add to your library": "Kon niet aan je bibliotheek worden toegevoegd",
|
||||
"This share link is no longer available": "Deze deelkoppeling is niet meer beschikbaar",
|
||||
"The original link may have expired or been revoked.": "De oorspronkelijke koppeling is mogelijk verlopen of ingetrokken.",
|
||||
"Get Readest": "Readest downloaden",
|
||||
"Loading shared book…": "Gedeeld boek laden…",
|
||||
"Adding…": "Toevoegen…",
|
||||
"Add to my library": "Aan mijn bibliotheek toevoegen",
|
||||
"Could not load your shares": "Kan uw delingen niet laden",
|
||||
"Revoked": "Ingetrokken",
|
||||
"Expired": "Verlopen",
|
||||
"Shared books": "Gedeelde boeken",
|
||||
"You haven't shared any books yet": "U heeft nog geen boeken gedeeld",
|
||||
"Open a book and tap Share to send it to a friend.": "Open een boek en tik op Delen om het naar een vriend te sturen.",
|
||||
"{{count}} active_one": "{{count}} actief",
|
||||
"{{count}} active_other": "{{count}} actief",
|
||||
"{{count}} downloads_one": "{{count}} download",
|
||||
"{{count}} downloads_other": "{{count}} downloads",
|
||||
"starts at saved page": "begint op opgeslagen pagina",
|
||||
"More actions": "Meer acties",
|
||||
"Loading…": "Laden…",
|
||||
"Load more": "Meer laden",
|
||||
"Could not load shared book": "Kan gedeeld boek niet laden",
|
||||
"The share link is missing required information.": "In de deellink ontbreekt vereiste informatie.",
|
||||
"Please check your connection and try again.": "Controleer uw verbinding en probeer het opnieuw.",
|
||||
"Sign in to import shared books": "Meld u aan om gedeelde boeken te importeren",
|
||||
"Already in your library": "Al in uw bibliotheek",
|
||||
"Added to your library": "Toegevoegd aan uw bibliotheek",
|
||||
"Could not import shared book": "Kan gedeeld boek niet importeren",
|
||||
"Manage Shared Links": "Deelkoppelingen beheren",
|
||||
"Expires in": "Verloopt over",
|
||||
"{{count}} days_one": "1 dag",
|
||||
"{{count}} days_other": "{{count}} dagen",
|
||||
"Expires in {{count}} days_one": "Verloopt over 1 dag",
|
||||
"Expires in {{count}} days_other": "Verloopt over {{count}} dagen",
|
||||
"Expires in {{count}} hours_one": "Verloopt over 1 uur",
|
||||
"Expires in {{count}} hours_other": "Verloopt over {{count}} uur",
|
||||
"Open in app": "Openen in app",
|
||||
"Shared with you": "Met u gedeeld",
|
||||
"Downloading… {{percent}}%": "Downloaden… {{percent}}%",
|
||||
"Import progress": "Voortgang import",
|
||||
"Share reading progress": "Leesvoortgang delen",
|
||||
"Includes your reading progress": "Inclusief je leesvoortgang",
|
||||
"Synced {{time}}": "Gesynchroniseerd {{time}}",
|
||||
"Sync Info": "Synchronisatie-info",
|
||||
"Last Synced": "Laatst gesynchroniseerd",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT-bundels hebben een .index-bestand en een .dict.dz-bestand nodig.",
|
||||
"Slob bundles need a .slob file.": "Slob-bundels hebben een .slob-bestand nodig.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL-sjabloon moet beginnen met http(s):// en %WORD% bevatten.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Webzoekopdracht toevoegen",
|
||||
"Edit Web Search": "Webzoekopdracht bewerken",
|
||||
"e.g. Google": "bijv. Google",
|
||||
"URL Template": "URL-sjabloon",
|
||||
"Use %WORD% where the looked-up word should appear.": "Gebruik %WORD% op de plek waar het opgezochte woord moet verschijnen.",
|
||||
"Open the search result in your browser:": "Open het zoekresultaat in je browser:",
|
||||
"Open in {{name}}": "Openen in {{name}}",
|
||||
"Book Fingerprint": "Vingerafdruk van boek",
|
||||
"Search the web": "Zoeken op het web",
|
||||
"App deeplink (readest://)": "App-deeplink (readest://)",
|
||||
"Universal web link (https://)": "Universele weblink (https://)",
|
||||
"Name cannot be empty.": "Naam mag niet leeg zijn.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} bestaand woordenboek vervangen",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} bestaande woordenboeken vervangen",
|
||||
"Cancel Edit": "Bewerken annuleren",
|
||||
"Edit Dictionary": "Woordenboek bewerken",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict-bundels gebruiken .mdx-bestanden; bijbehorende .mdd- en .css-bestanden zijn optioneel.",
|
||||
"Dictionary name": "Naam van woordenboek",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Deze audio kan hier niet worden afgespeeld — het woordenboek gebruikt een verouderd formaat. Probeer een woordenboek met Opus-, MP3- of WAV-audio.",
|
||||
"File uploaded: {{title}}": "Bestand geüpload: {{title}}",
|
||||
"File downloaded: {{title}}": "Bestand gedownload: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Verwijderde cloudkopie van het bestand: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Uploaden van bestand mislukt: {{title}}",
|
||||
"Failed to download file: {{title}}": "Downloaden van bestand mislukt: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Verwijderen van cloudkopie van het bestand is mislukt: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% gebruikt",
|
||||
"Set PIN…": "PIN instellen…",
|
||||
"Require a 4-digit PIN to open Readest": "4-cijferige PIN vereisen om Readest te openen",
|
||||
"Change PIN…": "PIN wijzigen…",
|
||||
"Disable PIN…": "PIN uitschakelen…",
|
||||
"Sync passphrase ready": "Sync-wachtwoordzin gereed",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Dit verwijdert permanent de versleutelde inloggegevens die we synchroniseren (bijv. OPDS-catalogi-wachtwoorden) op elk apparaat. Lokale kopieën blijven behouden. Je moet de sync-wachtwoordzin opnieuw invoeren of een nieuwe instellen. Doorgaan?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Sync-wachtwoordzin vergeten — alle versleutelde velden gewist",
|
||||
"Sync passphrase": "Sync-wachtwoordzin",
|
||||
"Set passphrase": "Wachtwoordzin instellen",
|
||||
"Forgot passphrase": "Wachtwoordzin vergeten",
|
||||
"Incorrect PIN": "Onjuiste PIN",
|
||||
"App locked": "App vergrendeld",
|
||||
"Enter your PIN": "Voer uw PIN in",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest is vergrendeld. Voer uw 4-cijferige PIN in om door te gaan.",
|
||||
"PIN code": "PIN-code",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Als u uw PIN vergeet, wordt u buitengesloten van dit apparaat. U moet de app-gegevens wissen om hem opnieuw in te stellen.",
|
||||
"Passphrase must be at least 8 characters": "De wachtwoordzin moet minstens 8 tekens lang zijn",
|
||||
"Passphrases do not match": "Wachtwoordzinnen komen niet overeen",
|
||||
"Set sync passphrase": "Sync-wachtwoordzin instellen",
|
||||
"Enter sync passphrase": "Sync-wachtwoordzin invoeren",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Een sync-wachtwoordzin versleutelt je gevoelige velden (zoals OPDS-cataloguscredentials) voordat ze worden gesynchroniseerd. We zien deze wachtwoordzin nooit. Kies iets dat je goed kunt onthouden — zonder de zin is er geen herstel mogelijk.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Voer de sync-wachtwoordzin in die je op een ander apparaat hebt ingesteld om je gesynchroniseerde inloggegevens te ontsleutelen.",
|
||||
"Confirm passphrase": "Wachtwoordzin bevestigen",
|
||||
"Unlock": "Ontgrendelen",
|
||||
"Set PIN": "PIN instellen",
|
||||
"Change PIN": "PIN wijzigen",
|
||||
"Disable PIN": "PIN uitschakelen",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Voer uw huidige PIN in en kies vervolgens een nieuwe 4-cijferige PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Voer uw huidige PIN in om de app-vergrendeling uit te schakelen.",
|
||||
"PIN must be {{length}} digits": "PIN moet uit {{length}} cijfers bestaan",
|
||||
"PINs do not match": "PINs komen niet overeen",
|
||||
"Current PIN": "Huidige PIN",
|
||||
"New PIN": "Nieuwe PIN",
|
||||
"Confirm new PIN": "Nieuwe PIN bevestigen",
|
||||
"Manage Sync": "Synchronisatie beheren",
|
||||
"Imported book files and library metadata": "Geïmporteerde boekbestanden en bibliotheekmetadata",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Laatst gelezen positie, bladwijzers en voorkeuren per boek",
|
||||
"Highlights and notes": "Markeringen en notities",
|
||||
"Fonts": "Lettertypen",
|
||||
"Custom font files": "Aangepaste lettertypebestanden",
|
||||
"Backgrounds": "Achtergronden",
|
||||
"Custom background textures": "Aangepaste achtergrondtexturen",
|
||||
"OPDS catalogs": "OPDS-catalogi",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Opgeslagen catalogus-URL's en (versleutelde) inloggegevens",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Onjuiste synchronisatiewachtwoordzin — gesynchroniseerde inloggegevens konden niet worden ontsleuteld",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Synchronisatiewachtwoordzingegevens op de server zijn gereset. Inloggegevens worden opnieuw versleuteld met de nieuwe wachtwoordzin…",
|
||||
"Failed to decrypt synced credentials": "Kan gesynchroniseerde inloggegevens niet ontsleutelen",
|
||||
"Imported dictionary bundles and settings": "Geïmporteerde woordenboekpakketten en instellingen",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Kies wat er tussen je apparaten wordt gesynchroniseerd. Een categorie uitschakelen zorgt dat dit apparaat geen items van dat type meer verstuurt of ontvangt. Alles wat al op de server staat blijft ongewijzigd, en bij opnieuw inschakelen wordt verdergegaan waar je was gestopt.",
|
||||
"Data Sync": "Gegevenssynchronisatie",
|
||||
"Manage Fonts": "Lettertypen beheren",
|
||||
"App settings": "App-instellingen",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Thema, markeringskleuren, integraties (KOSync, Readwise, Hardcover) en woordenboekvolgorde",
|
||||
"Required while Dictionaries sync is enabled": "Vereist zolang synchronisatie van Woordenboeken is ingeschakeld",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Reset over {{hours}} u {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Kies een viercijferige pincode. Je moet deze elke keer invoeren wanneer je Readest opent. Een vergeten pincode kan niet worden hersteld. Het wissen van de app-gegevens is de enige manier om deze opnieuw in te stellen.",
|
||||
"Credentials": "Inloggegevens",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, gebruikersnamen en wachtwoorden voor OPDS, KOReader, Hardcover en Readwise. Wanneer uitgeschakeld blijven inloggegevens alleen op dit apparaat en worden ze nooit geüpload.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Gevoelige gesynchroniseerde velden worden vóór het uploaden versleuteld. Stel nu of later een wachtwoordzin in wanneer versleuteling nodig is.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Opgeslagen op dit account. Er wordt om gevraagd wanneer inloggegevens ontsleuteld moeten worden.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "De leesvoortgang op dit apparaat verschilt van \"{{deviceName}}\".",
|
||||
"This device": "Dit apparaat",
|
||||
"Red": "Rood",
|
||||
"Yellow": "Geel",
|
||||
"Green": "Groen",
|
||||
"Blue": "Blauw",
|
||||
"Violet": "Violet",
|
||||
"Edit color": "Kleur bewerken",
|
||||
"Add custom color": "Aangepaste kleur toevoegen",
|
||||
"Add label": "Label toevoegen",
|
||||
"Choose color": "Kleur kiezen",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Verbonden met Hardcover. Laatst gesynchroniseerd {{time}}.",
|
||||
"Integrations": "Integraties",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Verbonden met Readwise. Laatst gesynchroniseerd {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Blader door online catalogi en download boeken.",
|
||||
"Connected as {{user}}": "Verbonden als {{user}}",
|
||||
"Not connected": "Niet verbonden",
|
||||
"{{count}} catalog_one": "{{count}} catalogus",
|
||||
"{{count}} catalog_other": "{{count}} catalogi",
|
||||
"No catalogs": "Geen catalogi",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Verbind Readest met externe diensten voor synchronisatie, markeringen en catalogi.",
|
||||
"Reading Sync": "Leessynchronisatie",
|
||||
"Content Sources": "Inhoudsbronnen",
|
||||
"Scroll tabs": "Tabbladen scrollen",
|
||||
"Catalog actions": "Catalogusacties",
|
||||
"File Content": "Bestandsinhoud",
|
||||
"Start your library": "Begin je bibliotheek",
|
||||
"Pick a book from your device to add it to your library.": "Kies een boek van je apparaat om aan je bibliotheek toe te voegen.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Sleep een boek ergens in dit venster, of kies er een van je computer.",
|
||||
"Sign in to sync your library": "Meld je aan om je bibliotheek te synchroniseren"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Zaktualizowano",
|
||||
"Version {{version}}": "Wersja {{version}}",
|
||||
"Vertical Direction": "Kierunek pionowy",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Witaj w swojej bibliotece. Możesz tutaj zaimportować swoje książki i czytać je w dowolnym momencie.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Writing Mode": "Tryb pisania",
|
||||
"Your Library": "Twoja biblioteka",
|
||||
@@ -303,7 +302,6 @@
|
||||
"No notes match your search": "Nie znaleziono notatek",
|
||||
"Search notes and excerpts...": "Szukaj notatek...",
|
||||
"Sign in to Sync": "Zaloguj się",
|
||||
"Synced at {{time}}": "Sync: {{time}}",
|
||||
"Never synced": "Brak synchronizacji",
|
||||
"Show Remaining Time": "Pokazuj pozostały czas",
|
||||
"{{time}} min left in chapter": "{{time}} min pozostało do końca rozdziału",
|
||||
@@ -469,14 +467,12 @@
|
||||
"Remove from Cloud Only": "Usuń tylko z chmury",
|
||||
"Remove from Device Only": "Usuń tylko z urządzenia",
|
||||
"Disconnected": "Rozłączono",
|
||||
"KOReader Sync Settings": "Ustawienia synchronizacji KOReader",
|
||||
"Sync Strategy": "Strategia synchronizacji",
|
||||
"Ask on conflict": "Pytaj w przypadku konfliktu",
|
||||
"Always use latest": "Zawsze używaj najnowszej",
|
||||
"Send changes only": "Wyślij tylko zmiany",
|
||||
"Receive changes only": "Odbierz tylko zmiany",
|
||||
"Checksum Method": "Metoda sumy kontrolnej",
|
||||
"File Content (recommended)": "Zawartość pliku (zalecane)",
|
||||
"File Name": "Nazwa pliku",
|
||||
"Device Name": "Nazwa urządzenia",
|
||||
"Connect to your KOReader Sync server.": "Połącz z serwerem synchronizacji KOReader.",
|
||||
@@ -487,10 +483,7 @@
|
||||
"Connect": "Połącz",
|
||||
"KOReader Sync": "Synchronizacja KOReader",
|
||||
"Sync Conflict": "Konflikt synchronizacji",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Synchronizować postęp czytania z \"{{deviceName}}\"?",
|
||||
"another device": "inne urządzenie",
|
||||
"Local Progress": "Postęp lokalny",
|
||||
"Remote Progress": "Postęp zdalny",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Strona {{page}} z {{total}} ({{percentage}}%)",
|
||||
"Current position": "Bieżąca pozycja",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Około strona {{page}} z {{total}} ({{percentage}}%)",
|
||||
@@ -643,7 +636,6 @@
|
||||
"Strikethrough": "Przekreślenie",
|
||||
"Squiggly": "Falista linia",
|
||||
"Outline": "Obrys",
|
||||
"Save Current Color": "Zapisz bieżący kolor",
|
||||
"Quick Colors": "Szybkie kolory",
|
||||
"Highlighter": "Zakreślacz",
|
||||
"Save Book Cover": "Zapisz okładkę książki",
|
||||
@@ -811,7 +803,6 @@
|
||||
"Annotate text after selection": "Dodaj adnotację do zaznaczonego tekstu",
|
||||
"Search text after selection": "Wyszukaj zaznaczony tekst",
|
||||
"Look up text in dictionary after selection": "Sprawdź zaznaczony tekst w słowniku",
|
||||
"Look up text in Wikipedia after selection": "Sprawdź zaznaczony tekst w Wikipedii",
|
||||
"Translate text after selection": "Przetłumacz zaznaczony tekst",
|
||||
"Read text aloud after selection": "Odczytaj zaznaczony tekst na głos",
|
||||
"Proofread text after selection": "Sprawdź zaznaczony tekst",
|
||||
@@ -858,9 +849,6 @@
|
||||
"Failed to export the book.": "Nie udało się wyeksportować książki.",
|
||||
"Export Book": "Eksportuj książkę",
|
||||
"Whole word:": "Całe słowo:",
|
||||
"Error": "Błąd",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Nie można załadować artykułu. Spróbuj wyszukać bezpośrednio na {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Nie można załadować słowa. Spróbuj wyszukać bezpośrednio na {{link}}.",
|
||||
"Date Published": "Data wydania",
|
||||
"Only for TTS:": "Tylko dla TTS:",
|
||||
"Uploaded": "Przesłano",
|
||||
@@ -1063,16 +1051,12 @@
|
||||
"Invalid Readwise access token": "Nieprawidłowy token dostępu Readwise",
|
||||
"Disconnected from Readwise": "Rozłączono z Readwise",
|
||||
"Never": "Nigdy",
|
||||
"Readwise Settings": "Ustawienia Readwise",
|
||||
"Connected to Readwise": "Połączono z Readwise",
|
||||
"Last synced: {{time}}": "Ostatnia synchronizacja: {{time}}",
|
||||
"Sync Enabled": "Synchronizacja włączona",
|
||||
"Disconnect": "Rozłącz",
|
||||
"Connect your Readwise account to sync highlights.": "Połącz swoje konto Readwise, aby synchronizować wyróżnienia.",
|
||||
"Get your access token at": "Pobierz token dostępu pod adresem",
|
||||
"Access Token": "Token dostępu",
|
||||
"Paste your Readwise access token": "Wklej swój token dostępu Readwise",
|
||||
"Config": "Konfiguracja",
|
||||
"Readwise Sync": "Synchronizacja Readwise",
|
||||
"Push Highlights": "Wyślij wyróżnienia",
|
||||
"Highlights synced to Readwise": "Wyróżnienia zsynchronizowane z Readwise",
|
||||
@@ -1145,7 +1129,6 @@
|
||||
"Copy Selection": "Kopiuj zaznaczenie",
|
||||
"Translate Selection": "Przetłumacz zaznaczenie",
|
||||
"Dictionary Lookup": "Wyszukaj w słowniku",
|
||||
"Wikipedia Lookup": "Wyszukaj w Wikipedii",
|
||||
"Read Aloud Selection": "Odczytaj zaznaczenie na głos",
|
||||
"Proofread Selection": "Sprawdź zaznaczenie",
|
||||
"Open Settings": "Otwórz ustawienia",
|
||||
@@ -1181,25 +1164,18 @@
|
||||
"Drag to seek": "Przeciągnij, aby przewinąć",
|
||||
"Punctuation Delay": "Opóźnienie interpunkcji",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Potwierdź, że to połączenie OPDS będzie przekierowywane przez serwery Readest w aplikacji webowej, zanim przejdziesz dalej.",
|
||||
"Custom Headers": "Niestandardowe nagłówki",
|
||||
"Custom Headers (optional)": "Niestandardowe nagłówki (opcjonalnie)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Dodaj jeden nagłówek w każdym wierszu, używając formatu \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Rozumiem, że to połączenie OPDS będzie przekierowywane przez serwery Readest w aplikacji webowej. Jeśli nie ufam Readest w kwestii tych danych uwierzytelniających lub nagłówków, powinienem użyć aplikacji natywnej.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Nie można połączyć się z Hardcover. Sprawdź połączenie sieciowe.",
|
||||
"Invalid Hardcover API token": "Nieprawidłowy token API Hardcover",
|
||||
"Disconnected from Hardcover": "Rozłączono z Hardcover",
|
||||
"Hardcover Settings": "Ustawienia Hardcover",
|
||||
"Connected to Hardcover": "Połączono z Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Połącz swoje konto Hardcover, aby synchronizować postęp czytania i notatki.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Pobierz token API z hardcover.app → Ustawienia → API.",
|
||||
"API Token": "Token API",
|
||||
"Paste your Hardcover API token": "Wklej swój token API Hardcover",
|
||||
"Hardcover sync enabled for this book": "Synchronizacja Hardcover włączona dla tej książki",
|
||||
"Hardcover sync disabled for this book": "Synchronizacja Hardcover wyłączona dla tej książki",
|
||||
"Hardcover Sync": "Synchronizacja Hardcover",
|
||||
"Enable for This Book": "Włącz dla tej książki",
|
||||
"Push Notes": "Wyślij notatki",
|
||||
"Enable Hardcover sync for this book first.": "Najpierw włącz synchronizację Hardcover dla tej książki.",
|
||||
"No annotations or excerpts to sync for this book.": "Brak adnotacji lub fragmentów do zsynchronizowania dla tej książki.",
|
||||
"Configure Hardcover in Settings first.": "Najpierw skonfiguruj Hardcover w ustawieniach.",
|
||||
"No new Hardcover note changes to sync.": "Brak nowych zmian notatek Hardcover do zsynchronizowania.",
|
||||
@@ -1213,9 +1189,278 @@
|
||||
"Split Hyphens": "Dziel łączniki",
|
||||
"Apply Theme Colors to PDF": "Zastosuj kolory motywu do PDF",
|
||||
"Name": "Nazwa",
|
||||
"Unavailable": "Niedostępne",
|
||||
"Remove": "Usuń",
|
||||
"Edit OPDS Catalog": "Edytuj katalog OPDS",
|
||||
"Save Changes": "Zapisz zmiany",
|
||||
"Use Book Layout": "Użyj układu książki"
|
||||
"Use Book Layout": "Użyj układu książki",
|
||||
"End of this section. Continue to the next.": "Koniec tej sekcji. Przejdź do następnej.",
|
||||
"Auto-download": "Automatyczne pobieranie",
|
||||
"Auto-download new items": "Automatycznie pobieraj nowe pozycje",
|
||||
"Automatically download new publications when the app syncs": "Automatycznie pobieraj nowe publikacje podczas synchronizacji aplikacji",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "Pobrano {{count}} nową pozycję z OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_few": "Pobrano {{count}} nowe pozycje z OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "Pobrano {{count}} nowych pozycji z OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Pobrano {{count}} nowych pozycji z OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Nie udało się zsynchronizować {{count}} katalogu OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_few": "Nie udało się zsynchronizować {{count}} katalogów OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "Nie udało się zsynchronizować {{count}} katalogów OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Nie udało się zsynchronizować {{count}} katalogów OPDS",
|
||||
"Last synced {{when}}": "Ostatnia synchronizacja {{when}}",
|
||||
"Failed downloads": "Nieudane pobrania",
|
||||
"No failed downloads": "Brak nieudanych pobrań",
|
||||
"Attempts: {{count}}_one": "Próby: {{count}}",
|
||||
"Attempts: {{count}}_few": "Próby: {{count}}",
|
||||
"Attempts: {{count}}_many": "Próby: {{count}}",
|
||||
"Attempts: {{count}}_other": "Próby: {{count}}",
|
||||
"Skip": "Pomiń",
|
||||
"Skip all": "Pomiń wszystko",
|
||||
"Retry all": "Ponów wszystkie",
|
||||
"{{count}} failed_one": "{{count}} nieudane",
|
||||
"{{count}} failed_few": "{{count}} nieudane",
|
||||
"{{count}} failed_many": "{{count}} nieudanych",
|
||||
"{{count}} failed_other": "{{count}} nieudanych",
|
||||
"(none)": "(brak)",
|
||||
"Identifiers": "Identyfikatory",
|
||||
"Read (Stream)": "Czytaj (Strumień)",
|
||||
"Failed to start stream": "Nie udało się uruchomić strumienia",
|
||||
"No dictionaries enabled": "Brak włączonych słowników",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Włącz słownik w Ustawienia → Język → Słowniki.",
|
||||
"Wiktionary": "Wikisłownik",
|
||||
"Drag to reorder": "Przeciągnij, aby zmienić kolejność",
|
||||
"Built-in": "Wbudowany",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Brak pakietu na tym urządzeniu. Zaimportuj ponownie, aby użyć.",
|
||||
"This dictionary format is not supported.": "Ten format słownika nie jest obsługiwany.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "Zaimportowano {{count}} słownik",
|
||||
"Imported {{count}} dictionary_few": "Zaimportowano {{count}} słowniki",
|
||||
"Imported {{count}} dictionary_many": "Zaimportowano {{count}} słowników",
|
||||
"Imported {{count}} dictionary_other": "Zaimportowano {{count}} słowników",
|
||||
"Skipped incomplete bundles: {{names}}": "Pominięto niekompletne pakiety: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Nie udało się zaimportować słownika: {{message}}",
|
||||
"Dictionaries": "Słowniki",
|
||||
"Delete Dictionary": "Usuń słownik",
|
||||
"Importing…": "Importowanie…",
|
||||
"Import Dictionary": "Importuj słownik",
|
||||
"No dictionaries available.": "Brak dostępnych słowników.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Pakiety StarDict wymagają plików .ifo, .idx i .dict.dz (.syn opcjonalny).",
|
||||
"Select all the bundle files together when importing.": "Podczas importu wybierz wszystkie pliki pakietu jednocześnie.",
|
||||
"Manage Dictionaries": "Zarządzaj słownikami",
|
||||
"Select Dictionary Files": "Wybierz pliki słownika",
|
||||
"Read on Wikipedia →": "Czytaj na Wikipedii →",
|
||||
"This link can't be opened": "Nie można otworzyć tego linku",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "W linku do adnotacji brakuje wymaganych informacji. Pierwotny link mógł zostać obcięty.",
|
||||
"Go to Readest": "Przejdź do Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Otwartoźródłowy czytnik e-booków dla każdego, na każdym urządzeniu.",
|
||||
"Open in Readest": "Otwórz w Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Jeśli Readest nie otworzył się automatycznie, wybierz opcję poniżej:",
|
||||
"Continue reading where you left off.": "Kontynuuj czytanie od miejsca, w którym skończyłeś.",
|
||||
"Readest logo": "Logo Readest",
|
||||
"Opening Readest...": "Otwieranie Readest…",
|
||||
"Open in Readest app": "Otwórz w aplikacji Readest",
|
||||
"Continue in browser": "Kontynuuj w przeglądarce",
|
||||
"Don't have Readest?": "Nie masz jeszcze Readest?",
|
||||
"Book not in your library": "Książki nie ma w Twojej bibliotece",
|
||||
"Share Book": "Udostępnij książkę",
|
||||
"Could not create share link": "Nie można utworzyć linku udostępniania",
|
||||
"Link copied": "Link skopiowany",
|
||||
"Could not copy link": "Nie można skopiować linku",
|
||||
"Share revoked": "Udostępnianie odwołane",
|
||||
"Could not revoke share": "Nie można odwołać udostępniania",
|
||||
"Uploading book…": "Przesyłanie książki…",
|
||||
"Generating…": "Generowanie…",
|
||||
"Generate share link": "Utwórz link udostępniania",
|
||||
"Share URL": "Adres udostępniania",
|
||||
"Copy link": "Kopiuj link",
|
||||
"Copied": "Skopiowano",
|
||||
"Share via…": "Udostępnij przez…",
|
||||
"Expires {{date}}": "Wygasa {{date}}",
|
||||
"Revoking…": "Odwoływanie…",
|
||||
"Revoke share": "Odwołaj udostępnianie",
|
||||
"Sign in to share books": "Zaloguj się, aby udostępniać książki",
|
||||
"Expiring soon": "Wkrótce wygaśnie",
|
||||
"Missing share token": "Brakuje tokenu udostępniania",
|
||||
"Could not add to your library": "Nie można dodać do biblioteki",
|
||||
"This share link is no longer available": "Ten link udostępniania jest już niedostępny",
|
||||
"The original link may have expired or been revoked.": "Pierwotny link mógł wygasnąć lub został odwołany.",
|
||||
"Get Readest": "Pobierz Readest",
|
||||
"Loading shared book…": "Wczytywanie udostępnionej książki…",
|
||||
"Adding…": "Dodawanie…",
|
||||
"Add to my library": "Dodaj do mojej biblioteki",
|
||||
"Could not load your shares": "Nie można wczytać udostępnień",
|
||||
"Revoked": "Odwołany",
|
||||
"Expired": "Wygasł",
|
||||
"Shared books": "Udostępnione książki",
|
||||
"You haven't shared any books yet": "Nie udostępniłeś jeszcze żadnych książek",
|
||||
"Open a book and tap Share to send it to a friend.": "Otwórz książkę i dotknij Udostępnij, aby wysłać ją znajomemu.",
|
||||
"{{count}} active_one": "{{count}} aktywny",
|
||||
"{{count}} active_few": "{{count}} aktywne",
|
||||
"{{count}} active_many": "{{count}} aktywnych",
|
||||
"{{count}} active_other": "{{count}} aktywnych",
|
||||
"{{count}} downloads_one": "{{count}} pobranie",
|
||||
"{{count}} downloads_few": "{{count}} pobrania",
|
||||
"{{count}} downloads_many": "{{count}} pobrań",
|
||||
"{{count}} downloads_other": "{{count}} pobrań",
|
||||
"starts at saved page": "zaczyna się od zapisanej strony",
|
||||
"More actions": "Więcej akcji",
|
||||
"Loading…": "Wczytywanie…",
|
||||
"Load more": "Wczytaj więcej",
|
||||
"Could not load shared book": "Nie można wczytać udostępnionej książki",
|
||||
"The share link is missing required information.": "W linku udostępniania brakuje wymaganych informacji.",
|
||||
"Please check your connection and try again.": "Sprawdź połączenie i spróbuj ponownie.",
|
||||
"Sign in to import shared books": "Zaloguj się, aby importować udostępnione książki",
|
||||
"Already in your library": "Już w Twojej bibliotece",
|
||||
"Added to your library": "Dodano do biblioteki",
|
||||
"Could not import shared book": "Nie można zaimportować udostępnionej książki",
|
||||
"Manage Shared Links": "Zarządzaj linkami udostępniania",
|
||||
"Expires in": "Wygasa za",
|
||||
"{{count}} days_one": "1 dzień",
|
||||
"{{count}} days_few": "{{count}} dni",
|
||||
"{{count}} days_many": "{{count}} dni",
|
||||
"{{count}} days_other": "{{count}} dni",
|
||||
"Expires in {{count}} days_one": "Wygasa za 1 dzień",
|
||||
"Expires in {{count}} days_few": "Wygasa za {{count}} dni",
|
||||
"Expires in {{count}} days_many": "Wygasa za {{count}} dni",
|
||||
"Expires in {{count}} days_other": "Wygasa za {{count}} dni",
|
||||
"Expires in {{count}} hours_one": "Wygasa za 1 godz.",
|
||||
"Expires in {{count}} hours_few": "Wygasa za {{count}} godz.",
|
||||
"Expires in {{count}} hours_many": "Wygasa za {{count}} godz.",
|
||||
"Expires in {{count}} hours_other": "Wygasa za {{count}} godz.",
|
||||
"Open in app": "Otwórz w aplikacji",
|
||||
"Shared with you": "Udostępnione Tobie",
|
||||
"Downloading… {{percent}}%": "Pobieranie… {{percent}}%",
|
||||
"Import progress": "Postęp importu",
|
||||
"Share reading progress": "Udostępnij postęp czytania",
|
||||
"Includes your reading progress": "Zawiera Twój postęp czytania",
|
||||
"Synced {{time}}": "Zsynchronizowano {{time}}",
|
||||
"Sync Info": "Informacje o synchronizacji",
|
||||
"Last Synced": "Ostatnia synchronizacja",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Pakiety DICT wymagają pliku .index i pliku .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Pakiety Slob wymagają pliku .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Szablon URL musi zaczynać się od http(s):// i zawierać %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Dodaj wyszukiwanie internetowe",
|
||||
"Edit Web Search": "Edytuj wyszukiwanie internetowe",
|
||||
"e.g. Google": "np. Google",
|
||||
"URL Template": "Szablon URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Użyj %WORD% w miejscu, w którym ma się pojawić wyszukiwane słowo.",
|
||||
"Open the search result in your browser:": "Otwórz wynik wyszukiwania w przeglądarce:",
|
||||
"Open in {{name}}": "Otwórz w {{name}}",
|
||||
"Book Fingerprint": "Odcisk książki",
|
||||
"Search the web": "Szukaj w sieci",
|
||||
"App deeplink (readest://)": "Głęboki link aplikacji (readest://)",
|
||||
"Universal web link (https://)": "Uniwersalny link sieciowy (https://)",
|
||||
"Name cannot be empty.": "Nazwa nie może być pusta.",
|
||||
"Replaced {{count}} existing dictionary_one": "Zastąpiono {{count}} istniejący słownik",
|
||||
"Replaced {{count}} existing dictionary_few": "Zastąpiono {{count}} istniejące słowniki",
|
||||
"Replaced {{count}} existing dictionary_many": "Zastąpiono {{count}} istniejących słowników",
|
||||
"Replaced {{count}} existing dictionary_other": "Zastąpiono {{count}} istniejące słowniki",
|
||||
"Cancel Edit": "Anuluj edycję",
|
||||
"Edit Dictionary": "Edytuj słownik",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Pakiety MDict używają plików .mdx; towarzyszące pliki .mdd i .css są opcjonalne.",
|
||||
"Dictionary name": "Nazwa słownika",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Tego dźwięku nie można odtworzyć tutaj — słownik używa przestarzałego formatu. Spróbuj słownika z dźwiękiem Opus, MP3 lub WAV.",
|
||||
"File uploaded: {{title}}": "Plik przesłany: {{title}}",
|
||||
"File downloaded: {{title}}": "Plik pobrany: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Usunięto kopię pliku w chmurze: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Nie udało się przesłać pliku: {{title}}",
|
||||
"Failed to download file: {{title}}": "Nie udało się pobrać pliku: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Nie udało się usunąć kopii pliku w chmurze: {{title}}",
|
||||
"{{percentage}}% used": "Wykorzystano {{percentage}}%",
|
||||
"Set PIN…": "Ustaw PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Wymagaj 4-cyfrowego PIN-u do otwarcia Readest",
|
||||
"Change PIN…": "Zmień PIN…",
|
||||
"Disable PIN…": "Wyłącz PIN…",
|
||||
"Sync passphrase ready": "Hasło synchronizacji gotowe",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Spowoduje to trwałe usunięcie zaszyfrowanych danych uwierzytelniających, które synchronizujemy (np. haseł katalogu OPDS), na każdym urządzeniu. Lokalne kopie zostaną zachowane. Konieczne będzie ponowne wprowadzenie hasła synchronizacji lub ustawienie nowego. Kontynuować?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Zapomniano hasła synchronizacji — wszystkie zaszyfrowane pola wyczyszczone",
|
||||
"Sync passphrase": "Hasło synchronizacji",
|
||||
"Set passphrase": "Ustaw hasło",
|
||||
"Forgot passphrase": "Zapomniałem hasła",
|
||||
"Incorrect PIN": "Nieprawidłowy PIN",
|
||||
"App locked": "Aplikacja zablokowana",
|
||||
"Enter your PIN": "Wprowadź swój PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest jest zablokowany. Wprowadź swój 4-cyfrowy PIN, aby kontynuować.",
|
||||
"PIN code": "Kod PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Zapomnienie PIN-u zablokuje Cię na tym urządzeniu. Aby go zresetować, musisz wyczyścić dane aplikacji.",
|
||||
"Passphrase must be at least 8 characters": "Hasło musi mieć co najmniej 8 znaków",
|
||||
"Passphrases do not match": "Hasła nie pasują do siebie",
|
||||
"Set sync passphrase": "Ustaw hasło synchronizacji",
|
||||
"Enter sync passphrase": "Wprowadź hasło synchronizacji",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Hasło synchronizacji szyfruje Twoje wrażliwe pola (np. dane uwierzytelniające katalogu OPDS) przed synchronizacją. Nigdy nie widzimy tego hasła. Wybierz coś łatwego do zapamiętania — bez niego nie ma odzyskiwania.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Wprowadź hasło synchronizacji ustawione na innym urządzeniu, aby odszyfrować zsynchronizowane dane uwierzytelniające.",
|
||||
"Confirm passphrase": "Potwierdź hasło",
|
||||
"Unlock": "Odblokuj",
|
||||
"Set PIN": "Ustaw PIN",
|
||||
"Change PIN": "Zmień PIN",
|
||||
"Disable PIN": "Wyłącz PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Wprowadź swój obecny PIN, a następnie wybierz nowy 4-cyfrowy PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Wprowadź swój obecny PIN, aby wyłączyć blokadę aplikacji.",
|
||||
"PIN must be {{length}} digits": "PIN musi mieć {{length}} cyfr",
|
||||
"PINs do not match": "PIN-y nie pasują do siebie",
|
||||
"Current PIN": "Obecny PIN",
|
||||
"New PIN": "Nowy PIN",
|
||||
"Confirm new PIN": "Potwierdź nowy PIN",
|
||||
"Manage Sync": "Zarządzaj synchronizacją",
|
||||
"Imported book files and library metadata": "Zaimportowane pliki książek i metadane biblioteki",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Ostatnia pozycja czytania, zakładki i ustawienia poszczególnych książek",
|
||||
"Highlights and notes": "Podświetlenia i notatki",
|
||||
"Fonts": "Czcionki",
|
||||
"Custom font files": "Niestandardowe pliki czcionek",
|
||||
"Backgrounds": "Tła",
|
||||
"Custom background textures": "Niestandardowe tekstury tła",
|
||||
"OPDS catalogs": "Katalogi OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Zapisane adresy URL katalogów i (zaszyfrowane) dane uwierzytelniające",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Nieprawidłowe hasło synchronizacji — nie można odszyfrować zsynchronizowanych danych uwierzytelniających",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Dane hasła synchronizacji na serwerze zostały zresetowane. Ponowne szyfrowanie danych uwierzytelniających przy użyciu nowego hasła…",
|
||||
"Failed to decrypt synced credentials": "Nie udało się odszyfrować zsynchronizowanych danych uwierzytelniających",
|
||||
"Imported dictionary bundles and settings": "Zaimportowane pakiety słowników i ustawienia",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Wybierz, co ma być synchronizowane między Twoimi urządzeniami. Wyłączenie kategorii sprawia, że to urządzenie przestaje wysyłać i odbierać wpisy tego typu. To, co jest już na serwerze, pozostaje nietknięte, a ponowne włączenie wznawia synchronizację od miejsca, w którym ją zatrzymałeś.",
|
||||
"Data Sync": "Synchronizacja danych",
|
||||
"Manage Fonts": "Zarządzaj czcionkami",
|
||||
"App settings": "Ustawienia aplikacji",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Motyw, kolory podświetleń, integracje (KOSync, Readwise, Hardcover) oraz kolejność słowników",
|
||||
"Required while Dictionaries sync is enabled": "Wymagane, gdy włączona jest synchronizacja Słowników",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Resetuje się za {{hours}} godz. {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Wybierz 4-cyfrowy PIN. Będziesz musiał go wprowadzać za każdym razem, gdy otworzysz Readest. Nie ma sposobu na odzyskanie zapomnianego PIN-u. Wyczyszczenie danych aplikacji to jedyny sposób, aby go zresetować.",
|
||||
"Credentials": "Poświadczenia",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokeny, nazwy użytkowników i hasła do OPDS, KOReader, Hardcover i Readwise. Gdy wyłączone, poświadczenia pozostają tylko na tym urządzeniu i nigdy nie są przesyłane.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Wrażliwe zsynchronizowane pola są szyfrowane przed wysłaniem. Ustaw hasło teraz lub później, gdy szyfrowanie będzie potrzebne.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Zapisane w tym koncie. Zostaniesz o nie poproszony przy odszyfrowywaniu poświadczeń.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Postęp czytania na tym urządzeniu różni się od „{{deviceName}}”.",
|
||||
"This device": "To urządzenie",
|
||||
"Red": "Czerwony",
|
||||
"Yellow": "Żółty",
|
||||
"Green": "Zielony",
|
||||
"Blue": "Niebieski",
|
||||
"Violet": "Fioletowy",
|
||||
"Edit color": "Edytuj kolor",
|
||||
"Add custom color": "Dodaj kolor niestandardowy",
|
||||
"Add label": "Dodaj etykietę",
|
||||
"Choose color": "Wybierz kolor",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Połączono z Hardcover. Ostatnia synchronizacja {{time}}.",
|
||||
"Integrations": "Integracje",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Połączono z Readwise. Ostatnia synchronizacja {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Przeglądaj i pobieraj książki z katalogów online.",
|
||||
"Connected as {{user}}": "Połączono jako {{user}}",
|
||||
"Not connected": "Nie połączono",
|
||||
"{{count}} catalog_one": "{{count}} katalog",
|
||||
"{{count}} catalog_few": "{{count}} katalogi",
|
||||
"{{count}} catalog_many": "{{count}} katalogów",
|
||||
"{{count}} catalog_other": "{{count}} katalogu",
|
||||
"No catalogs": "Brak katalogów",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Połącz Readest z usługami zewnętrznymi w celu synchronizacji, podświetleń i katalogów.",
|
||||
"Reading Sync": "Synchronizacja czytania",
|
||||
"Content Sources": "Źródła treści",
|
||||
"Scroll tabs": "Przewiń karty",
|
||||
"Catalog actions": "Akcje katalogu",
|
||||
"File Content": "Zawartość pliku",
|
||||
"Start your library": "Rozpocznij swoją bibliotekę",
|
||||
"Pick a book from your device to add it to your library.": "Wybierz książkę z urządzenia, aby dodać ją do swojej biblioteki.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Upuść książkę w dowolnym miejscu tego okna lub wybierz ją z komputera.",
|
||||
"Sign in to sync your library": "Zaloguj się, aby zsynchronizować bibliotekę"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -102,7 +102,6 @@
|
||||
"Updated": "Atualizado",
|
||||
"Version {{version}}": "Versão {{version}}",
|
||||
"Vertical Direction": "Direção Vertical",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Bem-vindo à sua biblioteca. Você pode importar seus livros aqui e lê-los a qualquer momento.",
|
||||
"Wikipedia": "Wikipédia",
|
||||
"Writing Mode": "Modo de Escrita",
|
||||
"Your Library": "Sua Biblioteca",
|
||||
@@ -301,7 +300,6 @@
|
||||
"No notes match your search": "Nenhuma nota encontrada",
|
||||
"Search notes and excerpts...": "Buscar notas...",
|
||||
"Sign in to Sync": "Entrar",
|
||||
"Synced at {{time}}": "Sincronizado às {{time}}",
|
||||
"Never synced": "Nunca sincronizado",
|
||||
"Show Remaining Time": "Mostrar Tempo Restante",
|
||||
"{{time}} min left in chapter": "{{time}} min restantes no capítulo",
|
||||
@@ -465,14 +463,12 @@
|
||||
"Remove from Cloud Only": "Remover apenas da Nuvem",
|
||||
"Remove from Device Only": "Remover apenas do Dispositivo",
|
||||
"Disconnected": "Desconectado",
|
||||
"KOReader Sync Settings": "Configurações de Sincronização KOReader",
|
||||
"Sync Strategy": "Estratégia de Sincronização",
|
||||
"Ask on conflict": "Perguntar em caso de conflito",
|
||||
"Always use latest": "Sempre usar o mais recente",
|
||||
"Send changes only": "Enviar apenas alterações",
|
||||
"Receive changes only": "Receber apenas alterações",
|
||||
"Checksum Method": "Método de Verificação",
|
||||
"File Content (recommended)": "Conteúdo do Arquivo (recomendado)",
|
||||
"File Name": "Nome do Arquivo",
|
||||
"Device Name": "Nome do Dispositivo",
|
||||
"Connect to your KOReader Sync server.": "Conectar ao seu servidor KOReader Sync.",
|
||||
@@ -483,10 +479,7 @@
|
||||
"Connect": "Conectar",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "Conflito de Sincronização",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Sincronizar progresso de leitura de \"{{deviceName}}\"?",
|
||||
"another device": "outro dispositivo",
|
||||
"Local Progress": "Progresso Local",
|
||||
"Remote Progress": "Progresso Remoto",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Página {{page}} de {{total}} ({{percentage}}%)",
|
||||
"Current position": "Posição Atual",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Aproximadamente página {{page}} de {{total}} ({{percentage}}%)",
|
||||
@@ -639,7 +632,6 @@
|
||||
"Strikethrough": "Tachado",
|
||||
"Squiggly": "Ondulado",
|
||||
"Outline": "Contorno",
|
||||
"Save Current Color": "Salvar cor atual",
|
||||
"Quick Colors": "Cores rápidas",
|
||||
"Highlighter": "Marcador",
|
||||
"Save Book Cover": "Salvar Capa do Livro",
|
||||
@@ -801,7 +793,6 @@
|
||||
"Annotate text after selection": "Anotar texto após a seleção",
|
||||
"Search text after selection": "Pesquisar texto após a seleção",
|
||||
"Look up text in dictionary after selection": "Procurar texto no dicionário após a seleção",
|
||||
"Look up text in Wikipedia after selection": "Procurar texto na Wikipedia após a seleção",
|
||||
"Translate text after selection": "Traduzir texto após a seleção",
|
||||
"Read text aloud after selection": "Ler texto em voz alta após a seleção",
|
||||
"Proofread text after selection": "Revisar texto após a seleção",
|
||||
@@ -848,9 +839,6 @@
|
||||
"Failed to export the book.": "Falha ao exportar o livro.",
|
||||
"Export Book": "Exportar livro",
|
||||
"Whole word:": "Palavra inteira:",
|
||||
"Error": "Erro",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Não foi possível carregar o artigo. Tente pesquisar diretamente em {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Não foi possível carregar a palavra. Tente pesquisar diretamente em {{link}}.",
|
||||
"Date Published": "Data de publicação",
|
||||
"Only for TTS:": "Apenas para TTS:",
|
||||
"Uploaded": "Enviado",
|
||||
@@ -1051,16 +1039,12 @@
|
||||
"Invalid Readwise access token": "Token de acesso do Readwise inválido",
|
||||
"Disconnected from Readwise": "Desconectado do Readwise",
|
||||
"Never": "Nunca",
|
||||
"Readwise Settings": "Configurações do Readwise",
|
||||
"Connected to Readwise": "Conectado ao Readwise",
|
||||
"Last synced: {{time}}": "Última sincronização: {{time}}",
|
||||
"Sync Enabled": "Sincronização ativada",
|
||||
"Disconnect": "Desconectar",
|
||||
"Connect your Readwise account to sync highlights.": "Conecte sua conta do Readwise para sincronizar os destaques.",
|
||||
"Get your access token at": "Obtenha seu token de acesso em",
|
||||
"Access Token": "Token de acesso",
|
||||
"Paste your Readwise access token": "Cole seu token de acesso do Readwise",
|
||||
"Config": "Configuração",
|
||||
"Readwise Sync": "Sincronização com o Readwise",
|
||||
"Push Highlights": "Enviar destaques",
|
||||
"Highlights synced to Readwise": "Destaques sincronizados com o Readwise",
|
||||
@@ -1132,7 +1116,6 @@
|
||||
"Copy Selection": "Copiar seleção",
|
||||
"Translate Selection": "Traduzir seleção",
|
||||
"Dictionary Lookup": "Pesquisar no dicionário",
|
||||
"Wikipedia Lookup": "Pesquisar na Wikipédia",
|
||||
"Read Aloud Selection": "Ler seleção em voz alta",
|
||||
"Proofread Selection": "Revisar seleção",
|
||||
"Open Settings": "Abrir configurações",
|
||||
@@ -1168,25 +1151,18 @@
|
||||
"Drag to seek": "Arraste para procurar",
|
||||
"Punctuation Delay": "Atraso de pontuação",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Confirme que esta conexão OPDS será encaminhada através dos servidores Readest no aplicativo web antes de continuar.",
|
||||
"Custom Headers": "Cabeçalhos personalizados",
|
||||
"Custom Headers (optional)": "Cabeçalhos personalizados (opcional)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Adicione um cabeçalho por linha usando \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Entendo que esta conexão OPDS será encaminhada através dos servidores Readest no aplicativo web. Se não confio no Readest com essas credenciais ou cabeçalhos, devo usar o aplicativo nativo.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Não foi possível conectar ao Hardcover. Verifique sua conexão de rede.",
|
||||
"Invalid Hardcover API token": "Token de API do Hardcover inválido",
|
||||
"Disconnected from Hardcover": "Desconectado do Hardcover",
|
||||
"Hardcover Settings": "Configurações do Hardcover",
|
||||
"Connected to Hardcover": "Conectado ao Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Conecte sua conta Hardcover para sincronizar o progresso de leitura e notas.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Obtenha seu token de API em hardcover.app → Configurações → API.",
|
||||
"API Token": "Token de API",
|
||||
"Paste your Hardcover API token": "Cole seu token de API do Hardcover",
|
||||
"Hardcover sync enabled for this book": "Sincronização do Hardcover ativada para este livro",
|
||||
"Hardcover sync disabled for this book": "Sincronização do Hardcover desativada para este livro",
|
||||
"Hardcover Sync": "Sincronização do Hardcover",
|
||||
"Enable for This Book": "Ativar para este livro",
|
||||
"Push Notes": "Enviar notas",
|
||||
"Enable Hardcover sync for this book first.": "Ative primeiro a sincronização do Hardcover para este livro.",
|
||||
"No annotations or excerpts to sync for this book.": "Não há anotações ou trechos para sincronizar neste livro.",
|
||||
"Configure Hardcover in Settings first.": "Configure o Hardcover nas configurações primeiro.",
|
||||
"No new Hardcover note changes to sync.": "Não há novas alterações de notas do Hardcover para sincronizar.",
|
||||
@@ -1200,9 +1176,266 @@
|
||||
"Split Hyphens": "Dividir hífens",
|
||||
"Apply Theme Colors to PDF": "Aplicar cores do tema ao PDF",
|
||||
"Name": "Nome",
|
||||
"Unavailable": "Indisponível",
|
||||
"Remove": "Remover",
|
||||
"Edit OPDS Catalog": "Editar catálogo OPDS",
|
||||
"Save Changes": "Salvar alterações",
|
||||
"Use Book Layout": "Usar layout do livro"
|
||||
"Use Book Layout": "Usar layout do livro",
|
||||
"End of this section. Continue to the next.": "Fim desta secção. Continuar para a próxima.",
|
||||
"Auto-download": "Download automático",
|
||||
"Auto-download new items": "Baixar novos itens automaticamente",
|
||||
"Automatically download new publications when the app syncs": "Baixe automaticamente novas publicações quando o aplicativo sincroniza",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} novo item baixado do OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "{{count}} novos itens baixados do OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} novos itens baixados do OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Falha ao sincronizar {{count}} catálogo OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "Falha ao sincronizar {{count}} catálogos OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Falha ao sincronizar {{count}} catálogos OPDS",
|
||||
"Last synced {{when}}": "Última sincronização {{when}}",
|
||||
"Failed downloads": "Downloads falhados",
|
||||
"No failed downloads": "Nenhum download falhado",
|
||||
"Attempts: {{count}}_one": "Tentativas: {{count}}",
|
||||
"Attempts: {{count}}_many": "Tentativas: {{count}}",
|
||||
"Attempts: {{count}}_other": "Tentativas: {{count}}",
|
||||
"Skip": "Ignorar",
|
||||
"Skip all": "Ignorar tudo",
|
||||
"Retry all": "Tentar tudo novamente",
|
||||
"{{count}} failed_one": "{{count}} falhada",
|
||||
"{{count}} failed_many": "{{count}} falhadas",
|
||||
"{{count}} failed_other": "{{count}} falhadas",
|
||||
"(none)": "(nenhum)",
|
||||
"Identifiers": "Identificadores",
|
||||
"Read (Stream)": "Ler (Streaming)",
|
||||
"Failed to start stream": "Falha ao iniciar o streaming",
|
||||
"No dictionaries enabled": "Nenhum dicionário ativado",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Ative um dicionário em Configurações → Idioma → Dicionários.",
|
||||
"Wiktionary": "Wikcionário",
|
||||
"Drag to reorder": "Arraste para reordenar",
|
||||
"Built-in": "Integrado",
|
||||
"Bundle is missing on this device. Re-import to use it.": "O pacote está ausente neste dispositivo. Reimporte para usar.",
|
||||
"This dictionary format is not supported.": "Este formato de dicionário não é suportado.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} dicionário importado",
|
||||
"Imported {{count}} dictionary_many": "{{count}} dicionários importados",
|
||||
"Imported {{count}} dictionary_other": "{{count}} dicionários importados",
|
||||
"Skipped incomplete bundles: {{names}}": "Pacotes incompletos ignorados: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Falha ao importar dicionário: {{message}}",
|
||||
"Dictionaries": "Dicionários",
|
||||
"Delete Dictionary": "Excluir dicionário",
|
||||
"Importing…": "Importando…",
|
||||
"Import Dictionary": "Importar dicionário",
|
||||
"No dictionaries available.": "Nenhum dicionário disponível.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Pacotes StarDict precisam dos arquivos .ifo, .idx e .dict.dz (.syn opcional).",
|
||||
"Select all the bundle files together when importing.": "Selecione todos os arquivos do pacote juntos ao importar.",
|
||||
"Manage Dictionaries": "Gerenciar dicionários",
|
||||
"Select Dictionary Files": "Selecionar arquivos do dicionário",
|
||||
"Read on Wikipedia →": "Leia na Wikipédia →",
|
||||
"This link can't be opened": "Não foi possível abrir este link",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Faltam informações necessárias no link da anotação. O link original pode ter sido truncado.",
|
||||
"Go to Readest": "Ir para o Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Leitor de e-books de código aberto para todos, em qualquer dispositivo.",
|
||||
"Open in Readest": "Abrir no Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Se o Readest não abriu automaticamente, escolha uma opção abaixo:",
|
||||
"Continue reading where you left off.": "Continue lendo de onde parou.",
|
||||
"Readest logo": "Logotipo do Readest",
|
||||
"Opening Readest...": "Abrindo o Readest…",
|
||||
"Open in Readest app": "Abrir no app Readest",
|
||||
"Continue in browser": "Continuar no navegador",
|
||||
"Don't have Readest?": "Ainda não tem o Readest?",
|
||||
"Book not in your library": "O livro não está na sua biblioteca",
|
||||
"Share Book": "Compartilhar livro",
|
||||
"Could not create share link": "Não foi possível criar o link de compartilhamento",
|
||||
"Link copied": "Link copiado",
|
||||
"Could not copy link": "Não foi possível copiar o link",
|
||||
"Share revoked": "Compartilhamento revogado",
|
||||
"Could not revoke share": "Não foi possível revogar o compartilhamento",
|
||||
"Uploading book…": "Enviando livro…",
|
||||
"Generating…": "Gerando…",
|
||||
"Generate share link": "Gerar link de compartilhamento",
|
||||
"Share URL": "URL de compartilhamento",
|
||||
"Copy link": "Copiar link",
|
||||
"Copied": "Copiado",
|
||||
"Share via…": "Compartilhar via…",
|
||||
"Expires {{date}}": "Expira em {{date}}",
|
||||
"Revoking…": "Revogando…",
|
||||
"Revoke share": "Revogar compartilhamento",
|
||||
"Sign in to share books": "Entre para compartilhar livros",
|
||||
"Expiring soon": "Expira em breve",
|
||||
"Missing share token": "Token de compartilhamento ausente",
|
||||
"Could not add to your library": "Não foi possível adicionar à sua biblioteca",
|
||||
"This share link is no longer available": "Este link de compartilhamento não está mais disponível",
|
||||
"The original link may have expired or been revoked.": "O link original pode ter expirado ou sido revogado.",
|
||||
"Get Readest": "Obter Readest",
|
||||
"Loading shared book…": "Carregando livro compartilhado…",
|
||||
"Adding…": "Adicionando…",
|
||||
"Add to my library": "Adicionar à minha biblioteca",
|
||||
"Could not load your shares": "Não foi possível carregar seus compartilhamentos",
|
||||
"Revoked": "Revogado",
|
||||
"Expired": "Expirado",
|
||||
"Shared books": "Livros compartilhados",
|
||||
"You haven't shared any books yet": "Você ainda não compartilhou nenhum livro",
|
||||
"Open a book and tap Share to send it to a friend.": "Abra um livro e toque em Compartilhar para enviá-lo a um amigo.",
|
||||
"{{count}} active_one": "{{count}} ativo",
|
||||
"{{count}} active_many": "{{count}} ativos",
|
||||
"{{count}} active_other": "{{count}} ativos",
|
||||
"{{count}} downloads_one": "{{count}} download",
|
||||
"{{count}} downloads_many": "{{count}} downloads",
|
||||
"{{count}} downloads_other": "{{count}} downloads",
|
||||
"starts at saved page": "começa na página salva",
|
||||
"More actions": "Mais ações",
|
||||
"Loading…": "Carregando…",
|
||||
"Load more": "Carregar mais",
|
||||
"Could not load shared book": "Não foi possível carregar o livro compartilhado",
|
||||
"The share link is missing required information.": "Faltam informações necessárias no link de compartilhamento.",
|
||||
"Please check your connection and try again.": "Verifique sua conexão e tente novamente.",
|
||||
"Sign in to import shared books": "Entre para importar livros compartilhados",
|
||||
"Already in your library": "Já está na sua biblioteca",
|
||||
"Added to your library": "Adicionado à sua biblioteca",
|
||||
"Could not import shared book": "Não foi possível importar o livro compartilhado",
|
||||
"Manage Shared Links": "Gerenciar links de compartilhamento",
|
||||
"Expires in": "Expira em",
|
||||
"{{count}} days_one": "1 dia",
|
||||
"{{count}} days_many": "{{count}} dias",
|
||||
"{{count}} days_other": "{{count}} dias",
|
||||
"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",
|
||||
"Expires in {{count}} hours_one": "Expira em 1 hora",
|
||||
"Expires in {{count}} hours_many": "Expira em {{count}} horas",
|
||||
"Expires in {{count}} hours_other": "Expira em {{count}} horas",
|
||||
"Open in app": "Abrir no app",
|
||||
"Shared with you": "Compartilhado com você",
|
||||
"Downloading… {{percent}}%": "Baixando… {{percent}}%",
|
||||
"Import progress": "Progresso da importação",
|
||||
"Share reading progress": "Compartilhar progresso de leitura",
|
||||
"Includes your reading progress": "Inclui seu progresso de leitura",
|
||||
"Synced {{time}}": "Sincronizado {{time}}",
|
||||
"Sync Info": "Informações de sincronização",
|
||||
"Last Synced": "Última sincronização",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Os pacotes DICT precisam de um arquivo .index e um arquivo .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Os pacotes Slob precisam de um arquivo .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "O modelo de URL deve começar com http(s):// e conter %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Adicionar pesquisa web",
|
||||
"Edit Web Search": "Editar pesquisa web",
|
||||
"e.g. Google": "por exemplo: Google",
|
||||
"URL Template": "Modelo de URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Use %WORD% onde a palavra pesquisada deve aparecer.",
|
||||
"Open the search result in your browser:": "Abrir o resultado da pesquisa no seu navegador:",
|
||||
"Open in {{name}}": "Abrir em {{name}}",
|
||||
"Book Fingerprint": "Impressão digital do livro",
|
||||
"Search the web": "Pesquisar na web",
|
||||
"App deeplink (readest://)": "Deeplink da aplicação (readest://)",
|
||||
"Universal web link (https://)": "Ligação web universal (https://)",
|
||||
"Name cannot be empty.": "O nome não pode estar vazio.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} dicionário existente substituído",
|
||||
"Replaced {{count}} existing dictionary_many": "{{count}} dicionários existentes substituídos",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} dicionários existentes substituídos",
|
||||
"Cancel Edit": "Cancelar edição",
|
||||
"Edit Dictionary": "Editar dicionário",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Os pacotes MDict usam ficheiros .mdx; os ficheiros .mdd e .css que os acompanham são opcionais.",
|
||||
"Dictionary name": "Nome do dicionário",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Este áudio não pode ser reproduzido aqui — o dicionário usa um formato obsoleto. Experimenta um dicionário com áudio Opus, MP3 ou WAV.",
|
||||
"File uploaded: {{title}}": "Arquivo enviado: {{title}}",
|
||||
"File downloaded: {{title}}": "Arquivo baixado: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Cópia na nuvem do arquivo excluída: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Falha ao enviar arquivo: {{title}}",
|
||||
"Failed to download file: {{title}}": "Falha ao baixar arquivo: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Falha ao excluir cópia na nuvem do arquivo: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% utilizado",
|
||||
"Set PIN…": "Definir PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Exigir um PIN de 4 dígitos para abrir o Readest",
|
||||
"Change PIN…": "Alterar PIN…",
|
||||
"Disable PIN…": "Desativar PIN…",
|
||||
"Sync passphrase ready": "Frase-passe de sincronização pronta",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Isto elimina permanentemente as credenciais encriptadas que sincronizamos (por exemplo, palavras-passe do catálogo OPDS) em todos os dispositivos. As cópias locais são preservadas. Terá de voltar a introduzir a frase-passe de sincronização ou definir uma nova. Continuar?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Frase-passe de sincronização esquecida — todos os campos encriptados foram apagados",
|
||||
"Sync passphrase": "Frase-passe de sincronização",
|
||||
"Set passphrase": "Definir frase-passe",
|
||||
"Forgot passphrase": "Esqueci a frase-passe",
|
||||
"Incorrect PIN": "PIN incorreto",
|
||||
"App locked": "Aplicação bloqueada",
|
||||
"Enter your PIN": "Introduza o seu PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "O Readest está bloqueado. Introduza o seu PIN de 4 dígitos para continuar.",
|
||||
"PIN code": "Código PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Esquecer o PIN bloqueia-o neste dispositivo. Terá de limpar os dados da aplicação para o repor.",
|
||||
"Passphrase must be at least 8 characters": "A frase-passe deve ter pelo menos 8 caracteres",
|
||||
"Passphrases do not match": "As frases-passe não coincidem",
|
||||
"Set sync passphrase": "Definir frase-passe de sincronização",
|
||||
"Enter sync passphrase": "Introduza a frase-passe de sincronização",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Uma frase-passe de sincronização encripta os seus campos sensíveis (como credenciais do catálogo OPDS) antes de serem sincronizados. Nunca vemos esta frase-passe. Escolha algo memorável — não há recuperação sem ela.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Introduza a frase-passe de sincronização que definiu noutro dispositivo para desencriptar as suas credenciais sincronizadas.",
|
||||
"Confirm passphrase": "Confirmar frase-passe",
|
||||
"Unlock": "Desbloquear",
|
||||
"Set PIN": "Definir PIN",
|
||||
"Change PIN": "Alterar PIN",
|
||||
"Disable PIN": "Desativar PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Introduza o seu PIN atual e, em seguida, escolha um novo PIN de 4 dígitos.",
|
||||
"Enter your current PIN to disable the app lock.": "Introduza o seu PIN atual para desativar o bloqueio da aplicação.",
|
||||
"PIN must be {{length}} digits": "O PIN deve ter {{length}} dígitos",
|
||||
"PINs do not match": "Os PIN não coincidem",
|
||||
"Current PIN": "PIN atual",
|
||||
"New PIN": "Novo PIN",
|
||||
"Confirm new PIN": "Confirmar novo PIN",
|
||||
"Manage Sync": "Gerenciar sincronização",
|
||||
"Imported book files and library metadata": "Arquivos de livros importados e metadados da biblioteca",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Última posição de leitura, marcadores e preferências por livro",
|
||||
"Highlights and notes": "Destaques e notas",
|
||||
"Fonts": "Fontes",
|
||||
"Custom font files": "Arquivos de fontes personalizadas",
|
||||
"Backgrounds": "Fundos",
|
||||
"Custom background textures": "Texturas de fundo personalizadas",
|
||||
"OPDS catalogs": "Catálogos OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URLs de catálogos salvas e credenciais (criptografadas)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Frase secreta de sincronização incorreta — não foi possível descriptografar as credenciais sincronizadas",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Os dados da frase secreta de sincronização no servidor foram redefinidos. Recriptografando suas credenciais com a nova frase…",
|
||||
"Failed to decrypt synced credentials": "Falha ao descriptografar as credenciais sincronizadas",
|
||||
"Imported dictionary bundles and settings": "Pacotes de dicionários importados e configurações",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Escolha o que será sincronizado entre seus dispositivos. Desativar uma categoria impede este dispositivo de enviar ou receber registros desse tipo. O que já está no servidor permanece intacto, e ao reativar a sincronização retoma de onde você parou.",
|
||||
"Data Sync": "Sincronização de dados",
|
||||
"Manage Fonts": "Gerenciar fontes",
|
||||
"App settings": "Configurações do app",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, cores de destaque, integrações (KOSync, Readwise, Hardcover) e ordem dos dicionários",
|
||||
"Required while Dictionaries sync is enabled": "Necessário enquanto a sincronização de Dicionários estiver ativada",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Repõe em {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Escolha um PIN de 4 dígitos. Terá de o introduzir sempre que abrir o Readest. Não há forma de recuperar um PIN esquecido. Limpar os dados da aplicação é a única maneira de o redefinir.",
|
||||
"Credentials": "Credenciais",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nomes de utilizador e palavras-passe para OPDS, KOReader, Hardcover e Readwise. Quando desativado, as credenciais permanecem apenas neste dispositivo e nunca são enviadas.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Os campos sincronizados sensíveis são cifrados antes do envio. Defina uma frase-senha agora ou mais tarde, quando a cifragem for necessária.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Guardada nesta conta. Ser-lhe-á pedida quando precisar de decifrar credenciais.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "O progresso de leitura neste dispositivo difere do «{{deviceName}}».",
|
||||
"This device": "Este dispositivo",
|
||||
"Red": "Vermelho",
|
||||
"Yellow": "Amarelo",
|
||||
"Green": "Verde",
|
||||
"Blue": "Azul",
|
||||
"Violet": "Violeta",
|
||||
"Edit color": "Editar cor",
|
||||
"Add custom color": "Adicionar cor personalizada",
|
||||
"Add label": "Adicionar etiqueta",
|
||||
"Choose color": "Escolher cor",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Ligado ao Hardcover. Última sincronização {{time}}.",
|
||||
"Integrations": "Integrações",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Ligado ao Readwise. Última sincronização {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Explore e descarregue livros de catálogos online.",
|
||||
"Connected as {{user}}": "Ligado como {{user}}",
|
||||
"Not connected": "Não ligado",
|
||||
"{{count}} catalog_one": "{{count}} catálogo",
|
||||
"{{count}} catalog_many": "{{count}} catálogos",
|
||||
"{{count}} catalog_other": "{{count}} catálogos",
|
||||
"No catalogs": "Sem catálogos",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Liga o Readest a serviços externos para sincronização, destaques e catálogos.",
|
||||
"Reading Sync": "Sincronização de leitura",
|
||||
"Content Sources": "Fontes de conteúdo",
|
||||
"Scroll tabs": "Deslocar separadores",
|
||||
"Catalog actions": "Ações do catálogo",
|
||||
"File Content": "Conteúdo do ficheiro",
|
||||
"Start your library": "Comece a sua biblioteca",
|
||||
"Pick a book from your device to add it to your library.": "Escolha um livro do seu dispositivo para adicionar à sua biblioteca.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Largue um livro em qualquer parte desta janela, ou escolha um do seu computador.",
|
||||
"Sign in to sync your library": "Inicie sessão para sincronizar a sua biblioteca"
|
||||
}
|
||||
|
||||
@@ -150,7 +150,6 @@
|
||||
"Cloud File Transfers": "Transferuri de fișiere în cloud",
|
||||
"{{activeCount}} active, {{pendingCount}} pending": "{{activeCount}} activ, {{pendingCount}} în așteptare",
|
||||
"{{failedCount}} failed": "{{failedCount}} a eșuat",
|
||||
"Synced at {{time}}": "Sincronizat la {{time}}",
|
||||
"Never synced": "Nu s-a sincronizat niciodată",
|
||||
"Account": "Cont",
|
||||
"Sign In": "Conectare",
|
||||
@@ -234,7 +233,6 @@
|
||||
"Library Header": "Antet bibliotecă",
|
||||
"Library Sync Progress": "Progresul sincronizării bibliotecii",
|
||||
"Your Bookshelf": "Raftul tău",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Bun venit la biblioteca dvs. Vă puteți importa cărțile aici și le puteți citi oricând.",
|
||||
"URL must start with http:// or https://": "Adresa URL trebuie să înceapă cu http:// sau https://",
|
||||
"Adding LAN addresses is not supported in the web app version.": "Adăugarea de adrese LAN nu este acceptată în versiunea aplicației web.",
|
||||
"Invalid OPDS catalog. Please check the URL.": "Catalog OPDS nevalid. Vă rugăm să verificați adresa URL.",
|
||||
@@ -308,7 +306,6 @@
|
||||
"Dictionary": "Dicţionar",
|
||||
"Look up text in dictionary after selection": "Căutați text în dicționar după selecție",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Look up text in Wikipedia after selection": "Căutați text în Wikipedia după selecție",
|
||||
"Translate": "Traduce",
|
||||
"Translate text after selection": "Traduceți textul după selecție",
|
||||
"Speak": "Vorbește",
|
||||
@@ -422,9 +419,6 @@
|
||||
"System Language": "Limba sistemului",
|
||||
"No translation available.": "Nicio traducere disponibilă.",
|
||||
"Translated by {{provider}}.": "Tradus de {{provider}}.",
|
||||
"Error": "Eroare",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Nu se poate încărca articolul. Încercați să căutați direct pe {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Nu se poate încărca cuvântul. Încercați să căutați direct pe {{link}}.",
|
||||
"Remove Bookmark": "Eliminați marcajul",
|
||||
"Add Bookmark": "Adăugați marcaj",
|
||||
"Books Content": "Conținutul cărților",
|
||||
@@ -459,13 +453,9 @@
|
||||
"Zoomed": "Mărit",
|
||||
"Zoom level": "Nivel de zoom",
|
||||
"Sync Conflict": "Conflict de sincronizare",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Sincronizați progresul citirii de pe „{{deviceName}}”?",
|
||||
"another device": "alt dispozitiv",
|
||||
"Local Progress": "Progres local",
|
||||
"Remote Progress": "Progres la distanță",
|
||||
"Failed to connect": "Nu s-a putut conecta",
|
||||
"Disconnected": "Deconectat",
|
||||
"KOReader Sync Settings": "Setări de sincronizare KOReader",
|
||||
"Sync as {{userDisplayName}}": "Sincronizare ca {{userDisplayName}}",
|
||||
"Sync Server Connected": "Server de sincronizare conectat",
|
||||
"Sync Strategy": "Strategie de sincronizare",
|
||||
@@ -474,7 +464,6 @@
|
||||
"Send changes only": "Trimite doar modificările",
|
||||
"Receive changes only": "Primește doar modificările",
|
||||
"Checksum Method": "Metoda sumei de control",
|
||||
"File Content (recommended)": "Conținutul fișierului (recomandat)",
|
||||
"File Name": "Numele fișierului",
|
||||
"Device Name": "Numele dispozitivului",
|
||||
"Connect to your KOReader Sync server.": "Conectați-vă la serverul dvs. KOReader Sync.",
|
||||
@@ -526,9 +515,6 @@
|
||||
"Invalid Readwise access token": "Token de acces Readwise nevalid",
|
||||
"Disconnected from Readwise": "Deconectat de la Readwise",
|
||||
"Never": "Niciodată",
|
||||
"Readwise Settings": "Setări Readwise",
|
||||
"Connected to Readwise": "Conectat la Readwise",
|
||||
"Last synced: {{time}}": "Ultima sincronizare: {{time}}",
|
||||
"Sync Enabled": "Sincronizare activată",
|
||||
"Disconnect": "Deconectează",
|
||||
"Connect your Readwise account to sync highlights.": "Conectați-vă contul Readwise pentru a sincroniza evidențierile.",
|
||||
@@ -582,7 +568,6 @@
|
||||
"Exit Parallel Read": "Ieși din citirea paralelă",
|
||||
"Enter Parallel Read": "Intră în citirea paralelă",
|
||||
"KOReader Sync": "Sincronizare KOReader",
|
||||
"Config": "Configurare",
|
||||
"Push Progress": "Trimite progresul (Push)",
|
||||
"Pull Progress": "Preia progresul (Pull)",
|
||||
"Readwise Sync": "Sincronizare Readwise",
|
||||
@@ -917,7 +902,6 @@
|
||||
"Strikethrough": "Tăiat",
|
||||
"Squiggly": "Ondulat",
|
||||
"Outline": "Contur",
|
||||
"Save Current Color": "Salvează culoarea curentă",
|
||||
"Quick Colors": "Culori rapide",
|
||||
"Override Book Color": "Suprascrie culoarea cărții",
|
||||
"None": "Niciuna",
|
||||
@@ -1079,7 +1063,6 @@
|
||||
"Copy Selection": "Copiază selecția",
|
||||
"Translate Selection": "Traduce selecția",
|
||||
"Dictionary Lookup": "Caută în dicționar",
|
||||
"Wikipedia Lookup": "Caută pe Wikipedia",
|
||||
"Read Aloud Selection": "Citește selecția cu voce tare",
|
||||
"Proofread Selection": "Corectează selecția",
|
||||
"Open Settings": "Deschide setările",
|
||||
@@ -1168,25 +1151,18 @@
|
||||
"Drag to seek": "Trageți pentru a căuta",
|
||||
"Punctuation Delay": "Întârziere punctuație",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Confirmați că această conexiune OPDS va fi direcționată prin serverele Readest din aplicația web înainte de a continua.",
|
||||
"Custom Headers": "Anteturi personalizate",
|
||||
"Custom Headers (optional)": "Anteturi personalizate (opțional)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Adăugați un antet pe linie folosind \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Înțeleg că această conexiune OPDS va fi direcționată prin serverele Readest din aplicația web. Dacă nu am încredere în Readest cu aceste credențiale sau anteturi, ar trebui să folosesc aplicația nativă.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Nu se poate conecta la Hardcover. Verificați conexiunea la rețea.",
|
||||
"Invalid Hardcover API token": "Token API Hardcover invalid",
|
||||
"Disconnected from Hardcover": "Deconectat de la Hardcover",
|
||||
"Hardcover Settings": "Setări Hardcover",
|
||||
"Connected to Hardcover": "Conectat la Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Conectați contul Hardcover pentru a sincroniza progresul lecturii și notele.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Obțineți tokenul API de la hardcover.app → Setări → API.",
|
||||
"API Token": "Token API",
|
||||
"Paste your Hardcover API token": "Lipiți tokenul API Hardcover",
|
||||
"Hardcover sync enabled for this book": "Sincronizarea Hardcover activată pentru această carte",
|
||||
"Hardcover sync disabled for this book": "Sincronizarea Hardcover dezactivată pentru această carte",
|
||||
"Hardcover Sync": "Sincronizare Hardcover",
|
||||
"Enable for This Book": "Activare pentru această carte",
|
||||
"Push Notes": "Trimite note",
|
||||
"Enable Hardcover sync for this book first.": "Activați mai întâi sincronizarea Hardcover pentru această carte.",
|
||||
"No annotations or excerpts to sync for this book.": "Nu există adnotări sau extrase de sincronizat pentru această carte.",
|
||||
"Configure Hardcover in Settings first.": "Configurați mai întâi Hardcover în setări.",
|
||||
"No new Hardcover note changes to sync.": "Nu există modificări noi ale notelor Hardcover de sincronizat.",
|
||||
@@ -1200,9 +1176,266 @@
|
||||
"Split Hyphens": "Desparte cratimele",
|
||||
"Apply Theme Colors to PDF": "Aplică culorile temei la PDF",
|
||||
"Name": "Nume",
|
||||
"Unavailable": "Indisponibil",
|
||||
"Remove": "Elimină",
|
||||
"Edit OPDS Catalog": "Editare catalog OPDS",
|
||||
"Save Changes": "Salvare modificări",
|
||||
"Use Book Layout": "Folosește aspectul cărții"
|
||||
"Use Book Layout": "Folosește aspectul cărții",
|
||||
"End of this section. Continue to the next.": "Sfârșitul acestei secțiuni. Continuați la următoarea.",
|
||||
"Auto-download": "Descărcare automată",
|
||||
"Auto-download new items": "Descarcă automat elementele noi",
|
||||
"Automatically download new publications when the app syncs": "Descarcă automat publicații noi atunci când aplicația sincronizează",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "A fost descărcat {{count}} element nou din OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_few": "Au fost descărcate {{count}} elemente noi din OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Au fost descărcate {{count}} de elemente noi din OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Sincronizarea a {{count}} catalog OPDS a eșuat",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_few": "Sincronizarea a {{count}} cataloage OPDS a eșuat",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Sincronizarea a {{count}} de cataloage OPDS a eșuat",
|
||||
"Last synced {{when}}": "Ultima sincronizare {{when}}",
|
||||
"Failed downloads": "Descărcări eșuate",
|
||||
"No failed downloads": "Nu există descărcări eșuate",
|
||||
"Attempts: {{count}}_one": "Încercări: {{count}}",
|
||||
"Attempts: {{count}}_few": "Încercări: {{count}}",
|
||||
"Attempts: {{count}}_other": "Încercări: {{count}}",
|
||||
"Skip": "Omite",
|
||||
"Skip all": "Omite toate",
|
||||
"Retry all": "Reîncearcă toate",
|
||||
"{{count}} failed_one": "{{count}} eșuat",
|
||||
"{{count}} failed_few": "{{count}} eșuate",
|
||||
"{{count}} failed_other": "{{count}} eșuate",
|
||||
"(none)": "(niciunul)",
|
||||
"Identifiers": "Identificatori",
|
||||
"Read (Stream)": "Citește (Flux)",
|
||||
"Failed to start stream": "Eroare la pornirea fluxului",
|
||||
"No dictionaries enabled": "Niciun dicționar activat",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Activează un dicționar din Setări → Limbă → Dicționare.",
|
||||
"Wiktionary": "Wikționar",
|
||||
"Drag to reorder": "Trage pentru a reordona",
|
||||
"Built-in": "Încorporat",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Pachetul lipsește de pe acest dispozitiv. Reimportă pentru a-l folosi.",
|
||||
"This dictionary format is not supported.": "Acest format de dicționar nu este acceptat.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "A fost importat {{count}} dicționar",
|
||||
"Imported {{count}} dictionary_few": "Au fost importate {{count}} dicționare",
|
||||
"Imported {{count}} dictionary_other": "Au fost importate {{count}} dicționare",
|
||||
"Skipped incomplete bundles: {{names}}": "Pachete incomplete ignorate: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Importul dicționarului a eșuat: {{message}}",
|
||||
"Dictionaries": "Dicționare",
|
||||
"Delete Dictionary": "Șterge dicționarul",
|
||||
"Importing…": "Se importă…",
|
||||
"Import Dictionary": "Importă dicționar",
|
||||
"No dictionaries available.": "Niciun dicționar disponibil.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Pachetele StarDict au nevoie de fișierele .ifo, .idx și .dict.dz (.syn opțional).",
|
||||
"Select all the bundle files together when importing.": "Selectează împreună toate fișierele pachetului la import.",
|
||||
"Manage Dictionaries": "Gestionează dicționarele",
|
||||
"Select Dictionary Files": "Selectează fișierele dicționarului",
|
||||
"Read on Wikipedia →": "Citește pe Wikipedia →",
|
||||
"This link can't be opened": "Acest link nu poate fi deschis",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Linkului adnotării îi lipsesc informații necesare. Linkul original ar putea fi trunchiat.",
|
||||
"Go to Readest": "Mergi la Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Cititor de cărți electronice cu sursă deschisă, pentru toți, pe orice dispozitiv.",
|
||||
"Open in Readest": "Deschide în Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Dacă Readest nu s-a deschis automat, alege o opțiune de mai jos:",
|
||||
"Continue reading where you left off.": "Continuă lectura de unde ai rămas.",
|
||||
"Readest logo": "Sigla Readest",
|
||||
"Opening Readest...": "Se deschide Readest…",
|
||||
"Open in Readest app": "Deschide în aplicația Readest",
|
||||
"Continue in browser": "Continuă în browser",
|
||||
"Don't have Readest?": "Nu ai Readest?",
|
||||
"Book not in your library": "Cartea nu este în biblioteca ta",
|
||||
"Share Book": "Partajează cartea",
|
||||
"Could not create share link": "Nu s-a putut crea linkul de partajare",
|
||||
"Link copied": "Link copiat",
|
||||
"Could not copy link": "Nu s-a putut copia linkul",
|
||||
"Share revoked": "Partajare revocată",
|
||||
"Could not revoke share": "Nu s-a putut revoca partajarea",
|
||||
"Uploading book…": "Se încarcă cartea…",
|
||||
"Generating…": "Se generează…",
|
||||
"Generate share link": "Generează link de partajare",
|
||||
"Share URL": "URL de partajare",
|
||||
"Copy link": "Copiază linkul",
|
||||
"Copied": "Copiat",
|
||||
"Share via…": "Partajează prin…",
|
||||
"Expires {{date}}": "Expiră pe {{date}}",
|
||||
"Revoking…": "Se revocă…",
|
||||
"Revoke share": "Revocă partajarea",
|
||||
"Sign in to share books": "Conectează-te pentru a partaja cărți",
|
||||
"Expiring soon": "Expiră în curând",
|
||||
"Missing share token": "Lipsește jetonul de partajare",
|
||||
"Could not add to your library": "Nu s-a putut adăuga în biblioteca ta",
|
||||
"This share link is no longer available": "Acest link de partajare nu mai este disponibil",
|
||||
"The original link may have expired or been revoked.": "Linkul original poate fi expirat sau revocat.",
|
||||
"Get Readest": "Obține Readest",
|
||||
"Loading shared book…": "Se încarcă cartea partajată…",
|
||||
"Adding…": "Se adaugă…",
|
||||
"Add to my library": "Adaugă în biblioteca mea",
|
||||
"Could not load your shares": "Nu s-au putut încărca partajările tale",
|
||||
"Revoked": "Revocat",
|
||||
"Expired": "Expirat",
|
||||
"Shared books": "Cărți partajate",
|
||||
"You haven't shared any books yet": "Nu ai partajat încă nicio carte",
|
||||
"Open a book and tap Share to send it to a friend.": "Deschide o carte și apasă pe Partajează pentru a o trimite unui prieten.",
|
||||
"{{count}} active_one": "{{count}} activ",
|
||||
"{{count}} active_few": "{{count}} active",
|
||||
"{{count}} active_other": "{{count}} de active",
|
||||
"{{count}} downloads_one": "{{count}} descărcare",
|
||||
"{{count}} downloads_few": "{{count}} descărcări",
|
||||
"{{count}} downloads_other": "{{count}} de descărcări",
|
||||
"starts at saved page": "începe de la pagina salvată",
|
||||
"More actions": "Mai multe acțiuni",
|
||||
"Loading…": "Se încarcă…",
|
||||
"Load more": "Încarcă mai multe",
|
||||
"Could not load shared book": "Nu s-a putut încărca cartea partajată",
|
||||
"The share link is missing required information.": "Lipsesc informații necesare din linkul de partajare.",
|
||||
"Please check your connection and try again.": "Verifică conexiunea și încearcă din nou.",
|
||||
"Sign in to import shared books": "Conectează-te pentru a importa cărți partajate",
|
||||
"Already in your library": "Deja în biblioteca ta",
|
||||
"Added to your library": "Adăugat în biblioteca ta",
|
||||
"Could not import shared book": "Nu s-a putut importa cartea partajată",
|
||||
"Manage Shared Links": "Gestionează linkurile de partajare",
|
||||
"Expires in": "Expiră în",
|
||||
"{{count}} days_one": "1 zi",
|
||||
"{{count}} days_few": "{{count}} zile",
|
||||
"{{count}} days_other": "{{count}} de zile",
|
||||
"Expires in {{count}} days_one": "Expiră într-o zi",
|
||||
"Expires in {{count}} days_few": "Expiră în {{count}} zile",
|
||||
"Expires in {{count}} days_other": "Expiră în {{count}} de zile",
|
||||
"Expires in {{count}} hours_one": "Expiră într-o oră",
|
||||
"Expires in {{count}} hours_few": "Expiră în {{count}} ore",
|
||||
"Expires in {{count}} hours_other": "Expiră în {{count}} de ore",
|
||||
"Open in app": "Deschide în aplicație",
|
||||
"Shared with you": "Partajat cu tine",
|
||||
"Downloading… {{percent}}%": "Se descarcă… {{percent}}%",
|
||||
"Import progress": "Progresul importului",
|
||||
"Share reading progress": "Partajează progresul lecturii",
|
||||
"Includes your reading progress": "Include progresul tău de lectură",
|
||||
"Synced {{time}}": "Sincronizat {{time}}",
|
||||
"Sync Info": "Informații sincronizare",
|
||||
"Last Synced": "Ultima sincronizare",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Pachetele DICT necesită un fișier .index și un fișier .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Pachetele Slob necesită un fișier .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Șablonul URL trebuie să înceapă cu http(s):// și să conțină %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Adaugă căutare web",
|
||||
"Edit Web Search": "Editează căutarea web",
|
||||
"e.g. Google": "ex. Google",
|
||||
"URL Template": "Șablon URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Folosiți %WORD% acolo unde ar trebui să apară cuvântul căutat.",
|
||||
"Open the search result in your browser:": "Deschideți rezultatul căutării în browser:",
|
||||
"Open in {{name}}": "Deschide în {{name}}",
|
||||
"Book Fingerprint": "Amprenta cărții",
|
||||
"Search the web": "Caută pe web",
|
||||
"App deeplink (readest://)": "Deeplink al aplicației (readest://)",
|
||||
"Universal web link (https://)": "Link web universal (https://)",
|
||||
"Name cannot be empty.": "Numele nu poate fi gol.",
|
||||
"Replaced {{count}} existing dictionary_one": "A fost înlocuit {{count}} dicționar existent",
|
||||
"Replaced {{count}} existing dictionary_few": "Au fost înlocuite {{count}} dicționare existente",
|
||||
"Replaced {{count}} existing dictionary_other": "Au fost înlocuite {{count}} de dicționare existente",
|
||||
"Cancel Edit": "Anulează editarea",
|
||||
"Edit Dictionary": "Editează dicționarul",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Pachetele MDict folosesc fișiere .mdx; fișierele .mdd și .css însoțitoare sunt opționale.",
|
||||
"Dictionary name": "Numele dicționarului",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Acest audio nu poate fi redat aici — dicționarul folosește un format învechit. Încearcă unul cu audio Opus, MP3 sau WAV.",
|
||||
"File uploaded: {{title}}": "Fișier încărcat: {{title}}",
|
||||
"File downloaded: {{title}}": "Fișier descărcat: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Copia din cloud a fișierului a fost ștearsă: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Nu s-a putut încărca fișierul: {{title}}",
|
||||
"Failed to download file: {{title}}": "Nu s-a putut descărca fișierul: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Nu s-a putut șterge copia din cloud a fișierului: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% utilizat",
|
||||
"Set PIN…": "Setează PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Solicită un PIN de 4 cifre pentru a deschide Readest",
|
||||
"Change PIN…": "Schimbă PIN…",
|
||||
"Disable PIN…": "Dezactivează PIN…",
|
||||
"Sync passphrase ready": "Fraza de acces pentru sincronizare este pregătită",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Această acțiune șterge definitiv datele de autentificare criptate pe care le sincronizăm (de exemplu, parolele catalogului OPDS) pe fiecare dispozitiv. Copiile locale sunt păstrate. Va trebui să reintroduci fraza de acces pentru sincronizare sau să setezi una nouă. Continui?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Fraza de acces pentru sincronizare a fost uitată — toate câmpurile criptate au fost șterse",
|
||||
"Sync passphrase": "Frază de acces pentru sincronizare",
|
||||
"Set passphrase": "Setează fraza de acces",
|
||||
"Forgot passphrase": "Am uitat fraza de acces",
|
||||
"Incorrect PIN": "PIN incorect",
|
||||
"App locked": "Aplicația este blocată",
|
||||
"Enter your PIN": "Introdu PIN-ul",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest este blocat. Introdu PIN-ul de 4 cifre pentru a continua.",
|
||||
"PIN code": "Cod PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Dacă uiți PIN-ul, vei fi blocat pe acest dispozitiv. Va trebui să ștergi datele aplicației pentru a-l reseta.",
|
||||
"Passphrase must be at least 8 characters": "Fraza de acces trebuie să aibă cel puțin 8 caractere",
|
||||
"Passphrases do not match": "Frazele de acces nu se potrivesc",
|
||||
"Set sync passphrase": "Setează fraza de acces pentru sincronizare",
|
||||
"Enter sync passphrase": "Introdu fraza de acces pentru sincronizare",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "O frază de acces pentru sincronizare îți criptează câmpurile sensibile (cum ar fi datele de autentificare ale catalogului OPDS) înainte de sincronizare. Nu vedem niciodată această frază. Alege ceva ușor de reținut — nu există recuperare fără ea.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Introdu fraza de acces pentru sincronizare pe care ai setat-o pe un alt dispozitiv pentru a-ți decripta datele de autentificare sincronizate.",
|
||||
"Confirm passphrase": "Confirmă fraza de acces",
|
||||
"Unlock": "Deblochează",
|
||||
"Set PIN": "Setează PIN",
|
||||
"Change PIN": "Schimbă PIN",
|
||||
"Disable PIN": "Dezactivează PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Introdu PIN-ul actual, apoi alege un nou PIN de 4 cifre.",
|
||||
"Enter your current PIN to disable the app lock.": "Introdu PIN-ul actual pentru a dezactiva blocarea aplicației.",
|
||||
"PIN must be {{length}} digits": "PIN-ul trebuie să aibă {{length}} cifre",
|
||||
"PINs do not match": "PIN-urile nu se potrivesc",
|
||||
"Current PIN": "PIN actual",
|
||||
"New PIN": "PIN nou",
|
||||
"Confirm new PIN": "Confirmă PIN-ul nou",
|
||||
"Manage Sync": "Gestionează sincronizarea",
|
||||
"Imported book files and library metadata": "Fișiere de cărți importate și metadate ale bibliotecii",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Ultima poziție de citire, marcaje și preferințe pentru fiecare carte",
|
||||
"Highlights and notes": "Evidențieri și note",
|
||||
"Fonts": "Fonturi",
|
||||
"Custom font files": "Fișiere de fonturi personalizate",
|
||||
"Backgrounds": "Fundaluri",
|
||||
"Custom background textures": "Texturi de fundal personalizate",
|
||||
"OPDS catalogs": "Cataloage OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URL-uri de cataloage salvate și acreditări (criptate)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Frază de acces pentru sincronizare incorectă — acreditările sincronizate nu au putut fi decriptate",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Datele frazei de acces pentru sincronizare de pe server au fost resetate. Se recriptează acreditările cu noua frază de acces…",
|
||||
"Failed to decrypt synced credentials": "Decriptarea acreditărilor sincronizate a eșuat",
|
||||
"Imported dictionary bundles and settings": "Pachete de dicționare importate și setări",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Alege ce se sincronizează între dispozitivele tale. Dezactivarea unei categorii oprește acest dispozitiv să trimită sau să primească intrări de acel tip. Ce există deja pe server rămâne neschimbat, iar reactivarea reia din locul în care te-ai oprit.",
|
||||
"Data Sync": "Sincronizare date",
|
||||
"Manage Fonts": "Gestionează fonturile",
|
||||
"App settings": "Setări aplicație",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Temă, culorile evidențierilor, integrări (KOSync, Readwise, Hardcover) și ordinea dicționarelor",
|
||||
"Required while Dictionaries sync is enabled": "Necesar cât timp sincronizarea Dicționarelor este activată",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Se resetează în {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Alege un PIN din 4 cifre. Va trebui să îl introduci de fiecare dată când deschizi Readest. Nu există nicio modalitate de a recupera un PIN uitat. Ștergerea datelor aplicației este singura modalitate de a-l reseta.",
|
||||
"Credentials": "Acreditări",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token-uri, nume de utilizator și parole pentru OPDS, KOReader, Hardcover și Readwise. Când sunt dezactivate, acreditările rămân doar pe acest dispozitiv și nu sunt niciodată încărcate.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Câmpurile sincronizate sensibile sunt criptate înainte de încărcare. Setați o frază de acces acum sau mai târziu, când criptarea va fi necesară.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Salvată în acest cont. Vi se va cere când va trebui să se decripteze acreditările.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Progresul de citire pe acest dispozitiv diferă de „{{deviceName}}”.",
|
||||
"This device": "Acest dispozitiv",
|
||||
"Red": "Roșu",
|
||||
"Yellow": "Galben",
|
||||
"Green": "Verde",
|
||||
"Blue": "Albastru",
|
||||
"Violet": "Violet",
|
||||
"Edit color": "Editează culoarea",
|
||||
"Add custom color": "Adaugă culoare personalizată",
|
||||
"Add label": "Adaugă etichetă",
|
||||
"Choose color": "Alege culoarea",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Conectat la Hardcover. Ultima sincronizare {{time}}.",
|
||||
"Integrations": "Integrări",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Conectat la Readwise. Ultima sincronizare {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Răsfoiește și descarcă cărți din cataloagele online.",
|
||||
"Connected as {{user}}": "Conectat ca {{user}}",
|
||||
"Not connected": "Neconectat",
|
||||
"{{count}} catalog_one": "{{count}} catalog",
|
||||
"{{count}} catalog_few": "{{count}} cataloage",
|
||||
"{{count}} catalog_other": "{{count}} de cataloage",
|
||||
"No catalogs": "Niciun catalog",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Conectează Readest la servicii externe pentru sincronizare, evidențieri și cataloage.",
|
||||
"Reading Sync": "Sincronizare citire",
|
||||
"Content Sources": "Surse de conținut",
|
||||
"Scroll tabs": "Derulează filele",
|
||||
"Catalog actions": "Acțiuni catalog",
|
||||
"File Content": "Conținutul fișierului",
|
||||
"Start your library": "Începe-ți biblioteca",
|
||||
"Pick a book from your device to add it to your library.": "Alege o carte de pe dispozitiv pentru a o adăuga în biblioteca ta.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Lasă o carte oriunde în această fereastră sau alege una de pe computer.",
|
||||
"Sign in to sync your library": "Conectează-te pentru a-ți sincroniza biblioteca"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Обновлено",
|
||||
"Version {{version}}": "Версия {{version}}",
|
||||
"Vertical Direction": "Вертикальное направление",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Добро пожаловать в вашу библиотеку. Вы можете импортировать сюда книги и читать их в любое время.",
|
||||
"Wikipedia": "Википедия",
|
||||
"Writing Mode": "Режим записи",
|
||||
"Your Library": "Ваша библиотека",
|
||||
@@ -303,7 +302,6 @@
|
||||
"No notes match your search": "Записи не найдены",
|
||||
"Search notes and excerpts...": "Искать записи...",
|
||||
"Sign in to Sync": "Войти",
|
||||
"Synced at {{time}}": "Синхр. в {{time}}",
|
||||
"Never synced": "Не синхр.",
|
||||
"Show Remaining Time": "Показать оставшееся время",
|
||||
"{{time}} min left in chapter": "{{time}} мин осталось в главе",
|
||||
@@ -469,14 +467,12 @@
|
||||
"Remove from Cloud Only": "Удалить только из облака",
|
||||
"Remove from Device Only": "Удалить только с устройства",
|
||||
"Disconnected": "Отключено",
|
||||
"KOReader Sync Settings": "Настройки синхронизации KOReader",
|
||||
"Sync Strategy": "Стратегия синхронизации",
|
||||
"Ask on conflict": "Спрашивать при конфликте",
|
||||
"Always use latest": "Всегда использовать последнюю",
|
||||
"Send changes only": "Отправлять только изменения",
|
||||
"Receive changes only": "Получать только изменения",
|
||||
"Checksum Method": "Метод контрольной суммы",
|
||||
"File Content (recommended)": "Содержимое файла (рекомендуется)",
|
||||
"File Name": "Имя файла",
|
||||
"Device Name": "Имя устройства",
|
||||
"Connect to your KOReader Sync server.": "Подключитесь к вашему серверу синхронизации KOReader.",
|
||||
@@ -487,10 +483,7 @@
|
||||
"Connect": "Подключиться",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "Конфликт синхронизации",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Синхронизировать прогресс чтения с \"{{deviceName}}\"?",
|
||||
"another device": "другом устройстве",
|
||||
"Local Progress": "Локальный прогресс",
|
||||
"Remote Progress": "Удаленный прогресс",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Страница {{page}} из {{total}} ({{percentage}}%)",
|
||||
"Current position": "Текущая позиция",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Приблизительно страница {{page}} из {{total}} ({{percentage}}%)",
|
||||
@@ -643,7 +636,6 @@
|
||||
"Strikethrough": "Зачёркивание",
|
||||
"Squiggly": "Волнистая линия",
|
||||
"Outline": "Контур",
|
||||
"Save Current Color": "Сохранить текущий цвет",
|
||||
"Quick Colors": "Быстрые цвета",
|
||||
"Highlighter": "Маркер",
|
||||
"Save Book Cover": "Сохранить обложку книги",
|
||||
@@ -811,7 +803,6 @@
|
||||
"Annotate text after selection": "Аннотировать текст после выделения",
|
||||
"Search text after selection": "Искать текст после выделения",
|
||||
"Look up text in dictionary after selection": "Искать текст в словаре после выделения",
|
||||
"Look up text in Wikipedia after selection": "Искать текст в Википедии после выделения",
|
||||
"Translate text after selection": "Перевести текст после выделения",
|
||||
"Read text aloud after selection": "Прочитать текст вслух после выделения",
|
||||
"Proofread text after selection": "Корректировать текст после выделения",
|
||||
@@ -858,9 +849,6 @@
|
||||
"Failed to export the book.": "Не удалось экспортировать книгу.",
|
||||
"Export Book": "Экспорт книги",
|
||||
"Whole word:": "Слово целиком:",
|
||||
"Error": "Ошибка",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Не удалось загрузить статью. Попробуйте искать напрямую на {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Не удалось загрузить слово. Попробуйте искать напрямую на {{link}}.",
|
||||
"Date Published": "Дата публикации",
|
||||
"Only for TTS:": "Только для TTS:",
|
||||
"Uploaded": "Загружено",
|
||||
@@ -1063,22 +1051,18 @@
|
||||
"Invalid Readwise access token": "Недействительный токен доступа Readwise",
|
||||
"Disconnected from Readwise": "Отключено от Readwise",
|
||||
"Never": "Никогда",
|
||||
"Readwise Settings": "Настройки Readwise",
|
||||
"Connected to Readwise": "Подключено к Readwise",
|
||||
"Last synced: {{time}}": "Последняя синхронизация: {{time}}",
|
||||
"Sync Enabled": "Синхронизация включена",
|
||||
"Disconnect": "Отключить",
|
||||
"Connect your Readwise account to sync highlights.": "Подключите ваш аккаунт Readwise для синхронизации выделений.",
|
||||
"Get your access token at": "Получите ваш токен доступа на",
|
||||
"Access Token": "Токен доступа",
|
||||
"Paste your Readwise access token": "Вставьте ваш токен доступа Readwise",
|
||||
"Config": "Конфигурация",
|
||||
"Readwise Sync": "Синхронизация Readwise",
|
||||
"Push Highlights": "Отправить выделения",
|
||||
"Highlights synced to Readwise": "Выделения синхронизированы с Readwise",
|
||||
"Readwise sync failed: no internet connection": "Синхронизация Readwise не удалась: нет интернет-соединения",
|
||||
"Readwise sync failed: {{error}}": "Синхронизация Readwise не удалась: {{error}}",
|
||||
"System Screen Brightness": "Систেমная яркость экрана",
|
||||
"System Screen Brightness": "Яркость экрана системы",
|
||||
"Page:": "Страница:",
|
||||
"Page: {{number}}": "Страница: {{number}}",
|
||||
"Annotation page number": "Номер страницы аннотации",
|
||||
@@ -1145,7 +1129,6 @@
|
||||
"Copy Selection": "Копировать выбранное",
|
||||
"Translate Selection": "Перевести выбранное",
|
||||
"Dictionary Lookup": "Поиск в словаре",
|
||||
"Wikipedia Lookup": "Поиск в Википедии",
|
||||
"Read Aloud Selection": "Прочитать выбранное вслух",
|
||||
"Proofread Selection": "Проверить выбранное",
|
||||
"Open Settings": "Открыть настройки",
|
||||
@@ -1181,25 +1164,18 @@
|
||||
"Drag to seek": "Перетащите для перемотки",
|
||||
"Punctuation Delay": "Задержка на знаках препинания",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Подтвердите, что это OPDS-соединение будет проксироваться через серверы Readest в веб-приложении, прежде чем продолжить.",
|
||||
"Custom Headers": "Пользовательские заголовки",
|
||||
"Custom Headers (optional)": "Пользовательские заголовки (необязательно)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Добавляйте по одному заголовку на строку в формате \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Я понимаю, что это OPDS-соединение будет проксироваться через серверы Readest в веб-приложении. Если я не доверяю Readest свои учётные данные или заголовки, мне следует использовать нативное приложение.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Не удалось подключиться к Hardcover. Проверьте сетевое подключение.",
|
||||
"Invalid Hardcover API token": "Недействительный API-токен Hardcover",
|
||||
"Disconnected from Hardcover": "Отключено от Hardcover",
|
||||
"Hardcover Settings": "Настройки Hardcover",
|
||||
"Connected to Hardcover": "Подключено к Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Подключите свой аккаунт Hardcover для синхронизации прогресса чтения и заметок.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Получите API-токен на hardcover.app → Настройки → API.",
|
||||
"API Token": "API-токен",
|
||||
"Paste your Hardcover API token": "Вставьте ваш API-токен Hardcover",
|
||||
"Hardcover sync enabled for this book": "Синхронизация Hardcover включена для этой книги",
|
||||
"Hardcover sync disabled for this book": "Синхронизация Hardcover отключена для этой книги",
|
||||
"Hardcover Sync": "Синхронизация Hardcover",
|
||||
"Enable for This Book": "Включить для этой книги",
|
||||
"Push Notes": "Отправить заметки",
|
||||
"Enable Hardcover sync for this book first.": "Сначала включите синхронизацию Hardcover для этой книги.",
|
||||
"No annotations or excerpts to sync for this book.": "Нет аннотаций или выдержек для синхронизации для этой книги.",
|
||||
"Configure Hardcover in Settings first.": "Сначала настройте Hardcover в параметрах.",
|
||||
"No new Hardcover note changes to sync.": "Нет новых изменений заметок Hardcover для синхронизации.",
|
||||
@@ -1213,9 +1189,278 @@
|
||||
"Split Hyphens": "Разделить дефисы",
|
||||
"Apply Theme Colors to PDF": "Применить цвета темы к PDF",
|
||||
"Name": "Имя",
|
||||
"Unavailable": "Недоступно",
|
||||
"Remove": "Удалить",
|
||||
"Edit OPDS Catalog": "Редактировать каталог OPDS",
|
||||
"Save Changes": "Сохранить изменения",
|
||||
"Use Book Layout": "Использовать макет книги"
|
||||
"Use Book Layout": "Использовать макет книги",
|
||||
"End of this section. Continue to the next.": "Конец этого раздела. Перейти к следующему.",
|
||||
"Auto-download": "Автозагрузка",
|
||||
"Auto-download new items": "Автоматически загружать новые элементы",
|
||||
"Automatically download new publications when the app syncs": "Автоматически загружать новые публикации при синхронизации приложения",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "Загружен {{count}} новый элемент из OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_few": "Загружено {{count}} новых элемента из OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "Загружено {{count}} новых элементов из OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Загружено {{count}} новых элементов из OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Не удалось синхронизировать {{count}} каталог OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_few": "Не удалось синхронизировать {{count}} каталога OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "Не удалось синхронизировать {{count}} каталогов OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Не удалось синхронизировать {{count}} каталогов OPDS",
|
||||
"Last synced {{when}}": "Последняя синхронизация {{when}}",
|
||||
"Failed downloads": "Неудачные загрузки",
|
||||
"No failed downloads": "Нет неудачных загрузок",
|
||||
"Attempts: {{count}}_one": "Попытки: {{count}}",
|
||||
"Attempts: {{count}}_few": "Попытки: {{count}}",
|
||||
"Attempts: {{count}}_many": "Попытки: {{count}}",
|
||||
"Attempts: {{count}}_other": "Попытки: {{count}}",
|
||||
"Skip": "Пропустить",
|
||||
"Skip all": "Пропустить все",
|
||||
"Retry all": "Повторить все",
|
||||
"{{count}} failed_one": "{{count}} ошибка",
|
||||
"{{count}} failed_few": "{{count}} ошибки",
|
||||
"{{count}} failed_many": "{{count}} ошибок",
|
||||
"{{count}} failed_other": "{{count}} ошибок",
|
||||
"(none)": "(нет)",
|
||||
"Identifiers": "Идентификаторы",
|
||||
"Read (Stream)": "Читать (Поток)",
|
||||
"Failed to start stream": "Не удалось запустить поток",
|
||||
"No dictionaries enabled": "Нет включённых словарей",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Включите словарь в Настройки → Язык → Словари.",
|
||||
"Wiktionary": "Викисловарь",
|
||||
"Drag to reorder": "Перетащите для изменения порядка",
|
||||
"Built-in": "Встроенный",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Пакет отсутствует на этом устройстве. Импортируйте повторно для использования.",
|
||||
"This dictionary format is not supported.": "Этот формат словаря не поддерживается.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "Импортирован {{count}} словарь",
|
||||
"Imported {{count}} dictionary_few": "Импортировано {{count}} словаря",
|
||||
"Imported {{count}} dictionary_many": "Импортировано {{count}} словарей",
|
||||
"Imported {{count}} dictionary_other": "Импортировано {{count}} словарей",
|
||||
"Skipped incomplete bundles: {{names}}": "Пропущены неполные пакеты: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Не удалось импортировать словарь: {{message}}",
|
||||
"Dictionaries": "Словари",
|
||||
"Delete Dictionary": "Удалить словарь",
|
||||
"Importing…": "Импорт…",
|
||||
"Import Dictionary": "Импорт словаря",
|
||||
"No dictionaries available.": "Нет доступных словарей.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Пакеты StarDict требуют файлов .ifo, .idx и .dict.dz (.syn — опционально).",
|
||||
"Select all the bundle files together when importing.": "При импорте выбирайте все файлы пакета вместе.",
|
||||
"Manage Dictionaries": "Управление словарями",
|
||||
"Select Dictionary Files": "Выберите файлы словаря",
|
||||
"Read on Wikipedia →": "Читать в Википедии →",
|
||||
"This link can't be opened": "Не удалось открыть ссылку",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "В ссылке на аннотацию не хватает необходимых данных. Возможно, исходная ссылка была обрезана.",
|
||||
"Go to Readest": "Перейти в Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Электронная читалка с открытым исходным кодом — для всех и на любом устройстве.",
|
||||
"Open in Readest": "Открыть в Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Если Readest не открылся автоматически, выберите вариант ниже:",
|
||||
"Continue reading where you left off.": "Продолжайте чтение с того места, где остановились.",
|
||||
"Readest logo": "Логотип Readest",
|
||||
"Opening Readest...": "Открываем Readest…",
|
||||
"Open in Readest app": "Открыть в приложении Readest",
|
||||
"Continue in browser": "Продолжить в браузере",
|
||||
"Don't have Readest?": "Ещё нет Readest?",
|
||||
"Book not in your library": "Книги нет в вашей библиотеке",
|
||||
"Share Book": "Поделиться книгой",
|
||||
"Could not create share link": "Не удалось создать ссылку для общего доступа",
|
||||
"Link copied": "Ссылка скопирована",
|
||||
"Could not copy link": "Не удалось скопировать ссылку",
|
||||
"Share revoked": "Доступ отозван",
|
||||
"Could not revoke share": "Не удалось отозвать доступ",
|
||||
"Uploading book…": "Загрузка книги…",
|
||||
"Generating…": "Создание…",
|
||||
"Generate share link": "Создать ссылку",
|
||||
"Share URL": "URL для общего доступа",
|
||||
"Copy link": "Копировать ссылку",
|
||||
"Copied": "Скопировано",
|
||||
"Share via…": "Поделиться через…",
|
||||
"Expires {{date}}": "Истекает {{date}}",
|
||||
"Revoking…": "Отзыв…",
|
||||
"Revoke share": "Отозвать доступ",
|
||||
"Sign in to share books": "Войдите, чтобы делиться книгами",
|
||||
"Expiring soon": "Скоро истекает",
|
||||
"Missing share token": "Отсутствует токен общего доступа",
|
||||
"Could not add to your library": "Не удалось добавить в вашу библиотеку",
|
||||
"This share link is no longer available": "Эта ссылка больше не доступна",
|
||||
"The original link may have expired or been revoked.": "Срок действия исходной ссылки мог истечь или её отозвали.",
|
||||
"Get Readest": "Скачать Readest",
|
||||
"Loading shared book…": "Загрузка книги…",
|
||||
"Adding…": "Добавление…",
|
||||
"Add to my library": "Добавить в мою библиотеку",
|
||||
"Could not load your shares": "Не удалось загрузить ваши ссылки",
|
||||
"Revoked": "Отозвано",
|
||||
"Expired": "Истекло",
|
||||
"Shared books": "Поделённые книги",
|
||||
"You haven't shared any books yet": "Вы ещё не поделились ни одной книгой",
|
||||
"Open a book and tap Share to send it to a friend.": "Откройте книгу и нажмите «Поделиться», чтобы отправить её другу.",
|
||||
"{{count}} active_one": "{{count}} активная",
|
||||
"{{count}} active_few": "{{count}} активные",
|
||||
"{{count}} active_many": "{{count}} активных",
|
||||
"{{count}} active_other": "{{count}} активных",
|
||||
"{{count}} downloads_one": "{{count}} загрузка",
|
||||
"{{count}} downloads_few": "{{count}} загрузки",
|
||||
"{{count}} downloads_many": "{{count}} загрузок",
|
||||
"{{count}} downloads_other": "{{count}} загрузок",
|
||||
"starts at saved page": "начинается с сохранённой страницы",
|
||||
"More actions": "Другие действия",
|
||||
"Loading…": "Загрузка…",
|
||||
"Load more": "Загрузить ещё",
|
||||
"Could not load shared book": "Не удалось загрузить книгу",
|
||||
"The share link is missing required information.": "В ссылке для общего доступа не хватает необходимых данных.",
|
||||
"Please check your connection and try again.": "Проверьте подключение и повторите попытку.",
|
||||
"Sign in to import shared books": "Войдите, чтобы импортировать поделённые книги",
|
||||
"Already in your library": "Уже в вашей библиотеке",
|
||||
"Added to your library": "Добавлено в вашу библиотеку",
|
||||
"Could not import shared book": "Не удалось импортировать книгу",
|
||||
"Manage Shared Links": "Управление ссылками",
|
||||
"Expires in": "Истекает через",
|
||||
"{{count}} days_one": "{{count}} день",
|
||||
"{{count}} days_few": "{{count}} дня",
|
||||
"{{count}} days_many": "{{count}} дней",
|
||||
"{{count}} days_other": "{{count}} дней",
|
||||
"Expires in {{count}} days_one": "Истекает через {{count}} день",
|
||||
"Expires in {{count}} days_few": "Истекает через {{count}} дня",
|
||||
"Expires in {{count}} days_many": "Истекает через {{count}} дней",
|
||||
"Expires in {{count}} days_other": "Истекает через {{count}} дней",
|
||||
"Expires in {{count}} hours_one": "Истекает через {{count}} час",
|
||||
"Expires in {{count}} hours_few": "Истекает через {{count}} часа",
|
||||
"Expires in {{count}} hours_many": "Истекает через {{count}} часов",
|
||||
"Expires in {{count}} hours_other": "Истекает через {{count}} часов",
|
||||
"Open in app": "Открыть в приложении",
|
||||
"Shared with you": "Поделились с вами",
|
||||
"Downloading… {{percent}}%": "Загрузка… {{percent}}%",
|
||||
"Import progress": "Ход импорта",
|
||||
"Share reading progress": "Поделиться прогрессом чтения",
|
||||
"Includes your reading progress": "Включает ваш прогресс чтения",
|
||||
"Synced {{time}}": "Синхронизировано {{time}}",
|
||||
"Sync Info": "Информация о синхронизации",
|
||||
"Last Synced": "Последняя синхронизация",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Пакетам DICT нужны файл .index и файл .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Пакетам Slob нужен файл .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Шаблон URL должен начинаться с http(s):// и содержать %WORD%.",
|
||||
"Web": "Веб",
|
||||
"Add Web Search": "Добавить веб-поиск",
|
||||
"Edit Web Search": "Изменить веб-поиск",
|
||||
"e.g. Google": "Например, Google",
|
||||
"URL Template": "Шаблон URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Используйте %WORD% там, где должно появиться искомое слово.",
|
||||
"Open the search result in your browser:": "Открыть результат поиска в браузере:",
|
||||
"Open in {{name}}": "Открыть в {{name}}",
|
||||
"Book Fingerprint": "Отпечаток книги",
|
||||
"Search the web": "Поиск в интернете",
|
||||
"App deeplink (readest://)": "Глубокая ссылка приложения (readest://)",
|
||||
"Universal web link (https://)": "Универсальная веб-ссылка (https://)",
|
||||
"Name cannot be empty.": "Имя не может быть пустым.",
|
||||
"Replaced {{count}} existing dictionary_one": "Заменён {{count}} существующий словарь",
|
||||
"Replaced {{count}} existing dictionary_few": "Заменено {{count}} существующих словаря",
|
||||
"Replaced {{count}} existing dictionary_many": "Заменено {{count}} существующих словарей",
|
||||
"Replaced {{count}} existing dictionary_other": "Заменено {{count}} существующих словарей",
|
||||
"Cancel Edit": "Отменить редактирование",
|
||||
"Edit Dictionary": "Редактировать словарь",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Пакеты MDict используют файлы .mdx; сопутствующие файлы .mdd и .css необязательны.",
|
||||
"Dictionary name": "Название словаря",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Этот звук невозможно воспроизвести здесь — словарь использует устаревший формат. Попробуйте словарь с аудио Opus, MP3 или WAV.",
|
||||
"File uploaded: {{title}}": "Файл загружен: {{title}}",
|
||||
"File downloaded: {{title}}": "Файл скачан: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Удалена облачная копия файла: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Не удалось загрузить файл: {{title}}",
|
||||
"Failed to download file: {{title}}": "Не удалось скачать файл: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Не удалось удалить копию файла в облаке: {{title}}",
|
||||
"{{percentage}}% used": "Использовано {{percentage}}%",
|
||||
"Set PIN…": "Установить PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Запрашивать 4-значный PIN при открытии Readest",
|
||||
"Change PIN…": "Изменить PIN…",
|
||||
"Disable PIN…": "Отключить PIN…",
|
||||
"Sync passphrase ready": "Секретная фраза синхронизации готова",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Это окончательно удалит зашифрованные учётные данные, которые мы синхронизируем (например, пароли каталога OPDS), на каждом устройстве. Локальные копии сохраняются. Вам потребуется ввести секретную фразу синхронизации заново или задать новую. Продолжить?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Секретная фраза синхронизации забыта — все зашифрованные поля очищены",
|
||||
"Sync passphrase": "Секретная фраза синхронизации",
|
||||
"Set passphrase": "Задать секретную фразу",
|
||||
"Forgot passphrase": "Забыли секретную фразу",
|
||||
"Incorrect PIN": "Неверный PIN",
|
||||
"App locked": "Приложение заблокировано",
|
||||
"Enter your PIN": "Введите PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest заблокирован. Введите 4-значный PIN, чтобы продолжить.",
|
||||
"PIN code": "PIN-код",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Если вы забудете PIN, вы потеряете доступ к этому устройству. Чтобы сбросить его, потребуется очистить данные приложения.",
|
||||
"Passphrase must be at least 8 characters": "Секретная фраза должна содержать не менее 8 символов",
|
||||
"Passphrases do not match": "Секретные фразы не совпадают",
|
||||
"Set sync passphrase": "Задать секретную фразу синхронизации",
|
||||
"Enter sync passphrase": "Введите секретную фразу синхронизации",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Секретная фраза синхронизации шифрует ваши конфиденциальные поля (например, учётные данные каталога OPDS) перед синхронизацией. Мы никогда не видим эту фразу. Выберите что-то запоминающееся — без неё восстановление невозможно.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Введите секретную фразу синхронизации, которую вы задали на другом устройстве, чтобы расшифровать синхронизированные учётные данные.",
|
||||
"Confirm passphrase": "Подтвердите секретную фразу",
|
||||
"Unlock": "Разблокировать",
|
||||
"Set PIN": "Установить PIN",
|
||||
"Change PIN": "Изменить PIN",
|
||||
"Disable PIN": "Отключить PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Введите текущий PIN, а затем выберите новый 4-значный PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Введите текущий PIN, чтобы отключить блокировку приложения.",
|
||||
"PIN must be {{length}} digits": "PIN должен состоять из {{length}} цифр",
|
||||
"PINs do not match": "PIN-коды не совпадают",
|
||||
"Current PIN": "Текущий PIN",
|
||||
"New PIN": "Новый PIN",
|
||||
"Confirm new PIN": "Подтвердить новый PIN",
|
||||
"Manage Sync": "Управление синхронизацией",
|
||||
"Imported book files and library metadata": "Импортированные файлы книг и метаданные библиотеки",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Последняя позиция чтения, закладки и настройки для каждой книги",
|
||||
"Highlights and notes": "Выделения и заметки",
|
||||
"Fonts": "Шрифты",
|
||||
"Custom font files": "Пользовательские файлы шрифтов",
|
||||
"Backgrounds": "Фоны",
|
||||
"Custom background textures": "Пользовательские текстуры фона",
|
||||
"OPDS catalogs": "Каталоги OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Сохранённые URL каталогов и (зашифрованные) учётные данные",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Неверная парольная фраза синхронизации — не удалось расшифровать синхронизированные учётные данные",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Данные парольной фразы синхронизации на сервере были сброшены. Перешифровка учётных данных с новой парольной фразой…",
|
||||
"Failed to decrypt synced credentials": "Не удалось расшифровать синхронизированные учётные данные",
|
||||
"Imported dictionary bundles and settings": "Импортированные пакеты словарей и настройки",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Выберите, что синхронизируется между вашими устройствами. При отключении категории это устройство перестаёт отправлять и получать записи такого типа. То, что уже на сервере, остаётся без изменений, а при повторном включении синхронизация возобновится с того места, где вы остановились.",
|
||||
"Data Sync": "Синхронизация данных",
|
||||
"Manage Fonts": "Управление шрифтами",
|
||||
"App settings": "Настройки приложения",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Тема, цвета выделений, интеграции (KOSync, Readwise, Hardcover) и порядок словарей",
|
||||
"Required while Dictionaries sync is enabled": "Требуется, пока включена синхронизация Словарей",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Сброс через {{hours}} ч {{minutes}} мин",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Выберите 4-значный PIN-код. Вам нужно будет вводить его каждый раз при открытии Readest. Восстановить забытый PIN-код невозможно. Очистка данных приложения — единственный способ его сбросить.",
|
||||
"Credentials": "Учётные данные",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Токены, имена пользователей и пароли для OPDS, KOReader, Hardcover и Readwise. Если отключено, учётные данные остаются только на этом устройстве и никогда не отправляются.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Конфиденциальные синхронизируемые поля шифруются перед загрузкой. Задайте парольную фразу сейчас или позже, когда понадобится шифрование.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Сохранено в этой учётной записи. Вы получите запрос при расшифровке учётных данных.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Прогресс чтения на этом устройстве отличается от «{{deviceName}}».",
|
||||
"This device": "Это устройство",
|
||||
"Red": "Красный",
|
||||
"Yellow": "Жёлтый",
|
||||
"Green": "Зелёный",
|
||||
"Blue": "Синий",
|
||||
"Violet": "Фиолетовый",
|
||||
"Edit color": "Изменить цвет",
|
||||
"Add custom color": "Добавить свой цвет",
|
||||
"Add label": "Добавить метку",
|
||||
"Choose color": "Выбрать цвет",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Подключено к Hardcover. Последняя синхронизация {{time}}.",
|
||||
"Integrations": "Интеграции",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Подключено к Readwise. Последняя синхронизация {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Просматривайте и скачивайте книги из онлайн-каталогов.",
|
||||
"Connected as {{user}}": "Подключено как {{user}}",
|
||||
"Not connected": "Не подключено",
|
||||
"{{count}} catalog_one": "{{count}} каталог",
|
||||
"{{count}} catalog_few": "{{count}} каталога",
|
||||
"{{count}} catalog_many": "{{count}} каталогов",
|
||||
"{{count}} catalog_other": "{{count}} каталога",
|
||||
"No catalogs": "Нет каталогов",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Подключите Readest к внешним сервисам для синхронизации, выделений и каталогов.",
|
||||
"Reading Sync": "Синхронизация чтения",
|
||||
"Content Sources": "Источники контента",
|
||||
"Scroll tabs": "Прокрутить вкладки",
|
||||
"Catalog actions": "Действия каталога",
|
||||
"File Content": "Содержимое файла",
|
||||
"Start your library": "Создайте свою библиотеку",
|
||||
"Pick a book from your device to add it to your library.": "Выберите книгу с устройства, чтобы добавить её в библиотеку.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Перетащите книгу в любое место этого окна или выберите её на компьютере.",
|
||||
"Sign in to sync your library": "Войдите, чтобы синхронизировать библиотеку"
|
||||
}
|
||||
|
||||
@@ -117,7 +117,6 @@
|
||||
"Failed to delete book: {{title}}": "පොත මකා දැමීමට අසමත්: {{title}}",
|
||||
"Failed to delete cloud backup of the book: {{title}}": "පොතේ cloud backup මකා දැමීමට අසමත්: {{title}}",
|
||||
"Failed to delete local copy of the book: {{title}}": "පොතේ දේශීය පිටපත මකා දැමීමට අසමත්: {{title}}",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "ඔබේ පුස්තකාලයට සාදරයෙන් පිළිගනිමු. ඔබට මෙහි ඔබේ පොත් ආයාත කර ඕනෑම වේලාවක කියවිය හැක.",
|
||||
"Copied to notebook": "සටහන් පොතට පිටපත් කරන ලදී",
|
||||
"No annotations to export": "නිර්යාත කිරීමට සටහන් නැත",
|
||||
"Exported from Readest": "Readest වෙතින් නිර්යාත කරන ලදී",
|
||||
@@ -155,13 +154,9 @@
|
||||
"Small": "කුඩා",
|
||||
"Large": "විශාල",
|
||||
"Sync Conflict": "සමමුහුර්ත ගැටුම",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "\"{{deviceName}}\" වෙතින් කියවීමේ ප්රගතිය සමමුහුර්ත කරන්නද?",
|
||||
"another device": "වෙනත් උපකරණයක්",
|
||||
"Local Progress": "දේශීය ප්රගතිය",
|
||||
"Remote Progress": "දුරස්ථ ප්රගතිය",
|
||||
"Failed to connect": "සම්බන්ධ වීමට අසමත්",
|
||||
"Disconnected": "විසන්ධි වුණි",
|
||||
"KOReader Sync Settings": "KOReader සමමුහුර්ත සැකසුම්",
|
||||
"Sync as {{userDisplayName}}": "{{userDisplayName}} ලෙස සමමුහුර්ත කරන්න",
|
||||
"Sync Server Connected": "සමමුහුර්ත සේවාදායකය සම්බන්ධ විය",
|
||||
"Sync Strategy": "සමමුහුර්ත උපාය",
|
||||
@@ -170,7 +165,6 @@
|
||||
"Send changes only": "වෙනස්කම් පමණක් යවන්න",
|
||||
"Receive changes only": "වෙනස්කම් පමණක් ලබන්න",
|
||||
"Checksum Method": "පරීක්ෂණ ක්රමය",
|
||||
"File Content (recommended)": "ගොනු අන්තර්ගතය (නිර්දේශිත)",
|
||||
"File Name": "ගොනුවේ නම",
|
||||
"Device Name": "උපකරණයේ නම",
|
||||
"Connect to your KOReader Sync server.": "ඔබේ KOReader සමමුහුර්ත සේවාදායකයට සම්බන්ධ වන්න.",
|
||||
@@ -330,7 +324,6 @@
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: හඬ 1",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: හඬ {{count}}",
|
||||
"Sign in to Sync": "සමමුහුර්ත කිරීම සඳහා ඇතුල් වන්න",
|
||||
"Synced at {{time}}": "{{time}} වේලාවේ සමමුහුර්ත විය",
|
||||
"Never synced": "කිසි විටෙක සමමුහුර්ත නොවිණි",
|
||||
"Reading Progress Synced": "කියවීමේ ප්රගතිය සමමුහුර්ත විය",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "{{total}} න් {{page}} පිටුව ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "ඇඳුම",
|
||||
"Squiggly": "වැලි රේඛාව",
|
||||
"Outline": "පරිසීමාව",
|
||||
"Save Current Color": "දැන් ඇති වර්ණය සුරකින්න",
|
||||
"Quick Colors": "ක්ෂණික වර්ණ",
|
||||
"Highlighter": "ඉස්මතු කරන්නා",
|
||||
"Save Book Cover": "පොත් ආවරණය සුරකින්න",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "තේරීමෙන් පසු පෙළ සටහන් කරන්න",
|
||||
"Search text after selection": "තේරීමෙන් පසු පෙළ සෙවීම",
|
||||
"Look up text in dictionary after selection": "තේරීමෙන් පසු ශබ්දකෝෂයේ පෙළ සෙවීම",
|
||||
"Look up text in Wikipedia after selection": "තේරීමෙන් පසු විකිපීඩියාවේ පෙළ සෙවීම",
|
||||
"Translate text after selection": "තේරීමෙන් පසු පෙළ පරිවර්තනය කරන්න",
|
||||
"Read text aloud after selection": "තේරීමෙන් පසු පෙළ උච්චාරණය කරන්න",
|
||||
"Proofread text after selection": "තේරීමෙන් පසු පෙළ සංශෝධනය කරන්න",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "පොත අපනයනය කිරීමට අසමත් විය.",
|
||||
"Export Book": "පොත අපනයනය කරන්න",
|
||||
"Whole word:": "සම්පූර්ණ වචනය:",
|
||||
"Error": "දෝෂය",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "ලිපිය පූරණය කළ නොහැක. {{link}} හි කෙලින්ම සෙවීමට උත්සාහ කරන්න.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "වචනය පූරණය කළ නොහැක. {{link}} හි කෙලින්ම සෙවීමට උත්සාහ කරන්න.",
|
||||
"Date Published": "ප්රකාශන දිනය",
|
||||
"Only for TTS:": "TTS සඳහා පමණක්:",
|
||||
"Uploaded": "උඩුගත කරන ලදී",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "අවලංගු Readwise ප්රවේශ ටෝකනය",
|
||||
"Disconnected from Readwise": "Readwise වෙතින් විසන්ධි විය",
|
||||
"Never": "කවදාවත් නැහැ",
|
||||
"Readwise Settings": "Readwise සැකසුම්",
|
||||
"Connected to Readwise": "Readwise වෙත සම්බන්ධ විය",
|
||||
"Last synced: {{time}}": "අවසානයට සමමුහුර්ත කළේ: {{time}}",
|
||||
"Sync Enabled": "සමමුහුර්ත කිරීම සබල කර ඇත",
|
||||
"Disconnect": "විසන්ධි කරන්න",
|
||||
"Connect your Readwise account to sync highlights.": "විශේෂ අවස්ථා සමමුහුර්ත කිරීමට ඔබගේ Readwise ගිණුම සම්බන්ධ කරන්න.",
|
||||
"Get your access token at": "ඔබගේ ප්රවේශ ටෝකනය මෙතැනින් ලබා ගන්න",
|
||||
"Access Token": "ප්රවේශ ටෝකනය",
|
||||
"Paste your Readwise access token": "ඔබගේ Readwise ප්රවේශ ටෝකනය මෙහි අලවන්න",
|
||||
"Config": "වින්යාසය",
|
||||
"Readwise Sync": "Readwise සමමුහුර්තකරණය",
|
||||
"Push Highlights": "විශේෂ අවස්ථා යොමු කරන්න",
|
||||
"Highlights synced to Readwise": "විශේෂ අවස්ථා Readwise සමඟ සමමුහුර්ත විය",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "තේරීම පිටපත් කරන්න",
|
||||
"Translate Selection": "තේරීම පරිවර්තනය කරන්න",
|
||||
"Dictionary Lookup": "ශබ්දකෝෂයේ සොයන්න",
|
||||
"Wikipedia Lookup": "විකිපීඩියාවේ සොයන්න",
|
||||
"Read Aloud Selection": "තේරීම ශබ්ද නගා කියවන්න",
|
||||
"Proofread Selection": "තේරීම සෝදුපත් කරන්න",
|
||||
"Open Settings": "සැකසුම් විවෘත කරන්න",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "සෙවීමට ඇදගන්න",
|
||||
"Punctuation Delay": "විරාම ලකුණු ප්රමාදය",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "ඉදිරියට යාමට පෙර මෙම OPDS සම්බන්ධතාවය වෙබ් යෙදුමේ Readest සේවාදායක හරහා ප්රොක්සි කරන බව තහවුරු කරන්න.",
|
||||
"Custom Headers": "අභිරුචි ශීර්ෂ",
|
||||
"Custom Headers (optional)": "අභිරුචි ශීර්ෂ (විකල්ප)",
|
||||
"Add one header per line using \"Header-Name: value\".": "\"Header-Name: value\" භාවිතයෙන් පේළියකට එක ශීර්ෂයක් එක් කරන්න.",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "මෙම OPDS සම්බන්ධතාවය වෙබ් යෙදුමේ Readest සේවාදායක හරහා ප්රොක්සි කරන බව මට තේරෙනවා. මෙම අක්තපත්ර හෝ ශීර්ෂ සමඟ Readest විශ්වාස නොකරන්නේ නම්, මම ස්වදේශීය යෙදුම භාවිතා කළ යුතුය.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcover වෙත සම්බන්ධ විය නොහැක. ඔබේ ජාල සම්බන්ධතාවය පරීක්ෂා කරන්න.",
|
||||
"Invalid Hardcover API token": "අවලංගු Hardcover API ටෝකනය",
|
||||
"Disconnected from Hardcover": "Hardcover වෙතින් විසන්ධි විය",
|
||||
"Hardcover Settings": "Hardcover සැකසීම්",
|
||||
"Connected to Hardcover": "Hardcover වෙත සම්බන්ධයි",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "කියවීමේ ප්රගතිය සහ සටහන් සමමුහුර්ත කිරීමට ඔබේ Hardcover ගිණුම සම්බන්ධ කරන්න.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "hardcover.app → සැකසීම් → API වෙතින් ඔබේ API ටෝකනය ලබාගන්න.",
|
||||
"API Token": "API ටෝකනය",
|
||||
"Paste your Hardcover API token": "ඔබේ Hardcover API ටෝකනය අලවන්න",
|
||||
"Hardcover sync enabled for this book": "මෙම පොත සඳහා Hardcover සමමුහුර්තකරණය සක්රීයයි",
|
||||
"Hardcover sync disabled for this book": "මෙම පොත සඳහා Hardcover සමමුහුර්තකරණය අක්රීයයි",
|
||||
"Hardcover Sync": "Hardcover සමමුහුර්තකරණය",
|
||||
"Enable for This Book": "මෙම පොත සඳහා සක්රීය කරන්න",
|
||||
"Push Notes": "සටහන් යවන්න",
|
||||
"Enable Hardcover sync for this book first.": "පළමුව මෙම පොත සඳහා Hardcover සමමුහුර්තකරණය සක්රීය කරන්න.",
|
||||
"No annotations or excerpts to sync for this book.": "මෙම පොත සඳහා සමමුහුර්ත කිරීමට සටහන් හෝ උපුටා ගැනීම් නැත.",
|
||||
"Configure Hardcover in Settings first.": "පළමුව සැකසීම් තුළ Hardcover වින්යාස කරන්න.",
|
||||
"No new Hardcover note changes to sync.": "සමමුහුර්ත කිරීමට නව Hardcover සටහන් වෙනස්කම් නැත.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "හයිෆන් බෙදන්න",
|
||||
"Apply Theme Colors to PDF": "PDF වෙත තේමා වර්ණ යොදන්න",
|
||||
"Name": "නම",
|
||||
"Unavailable": "ලබාගත නොහැක",
|
||||
"Remove": "ඉවත් කරන්න",
|
||||
"Edit OPDS Catalog": "OPDS නාමාවලිය සංස්කරණය",
|
||||
"Save Changes": "වෙනස්කම් සුරකින්න",
|
||||
"Use Book Layout": "පොතේ සැකැස්ම භාවිත කරන්න"
|
||||
"Use Book Layout": "පොතේ සැකැස්ම භාවිත කරන්න",
|
||||
"End of this section. Continue to the next.": "මෙම කොටසේ අවසානයයි. ඊළඟ කොටසට ඉදිරියට යන්න.",
|
||||
"Auto-download": "ස්වයංක්රීය බාගත කිරීම",
|
||||
"Auto-download new items": "නව අයිතම ස්වයංක්රීයව බාගත කරන්න",
|
||||
"Automatically download new publications when the app syncs": "යෙදුම සමමුහුර්ත වන විට නව ප්රකාශන ස්වයංක්රීයව බාගත කරන්න",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "OPDS වෙතින් නව අයිතමයක් බාගත කරන ලදී",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDS වෙතින් නව අයිතම {{count}}ක් බාගත කරන ලදී",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "OPDS නාමාවලියක් සමමුහුර්ත කිරීමට අසමත් විය",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "OPDS නාමාවලි {{count}}ක් සමමුහුර්ත කිරීමට අසමත් විය",
|
||||
"Last synced {{when}}": "අවසන් වරට සමමුහුර්ත කළේ {{when}}",
|
||||
"Failed downloads": "අසාර්ථක බාගත කිරීම්",
|
||||
"No failed downloads": "අසාර්ථක බාගත කිරීම් නැත",
|
||||
"Attempts: {{count}}_one": "උත්සාහයන්: {{count}}",
|
||||
"Attempts: {{count}}_other": "උත්සාහයන්: {{count}}",
|
||||
"Skip": "මඟ හරින්න",
|
||||
"Skip all": "සියල්ල මඟ හරින්න",
|
||||
"Retry all": "සියල්ල නැවත උත්සාහ කරන්න",
|
||||
"{{count}} failed_one": "{{count}} අසාර්ථකයි",
|
||||
"{{count}} failed_other": "{{count}} අසාර්ථකයි",
|
||||
"(none)": "(කිසිවක් නැත)",
|
||||
"Identifiers": "හඳුනාගැනීම්",
|
||||
"Read (Stream)": "කියවන්න (ස්ට්රීම්)",
|
||||
"Failed to start stream": "ස්ට්රීම් ආරම්භ කිරීම අසාර්ථකයි",
|
||||
"No dictionaries enabled": "ශබ්දකෝෂ සක්රීය කර නැත",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "සැකසීම් → භාෂාව → ශබ්දකෝෂ වෙත ගොස් ශබ්දකෝෂයක් සක්රීය කරන්න.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "නැවත සකස් කිරීමට අදින්න",
|
||||
"Built-in": "සාමාන්ය",
|
||||
"Bundle is missing on this device. Re-import to use it.": "මෙම උපාංගයේ බණ්ඩලය නැත. භාවිතයට නැවත ආයාත කරන්න.",
|
||||
"This dictionary format is not supported.": "මෙම ශබ්දකෝෂ ආකෘතියට සහාය නොදක්වයි.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "ශබ්දකෝෂ {{count}}ක් ආයාත කළා",
|
||||
"Imported {{count}} dictionary_other": "ශබ්දකෝෂ {{count}}ක් ආයාත කළා",
|
||||
"Skipped incomplete bundles: {{names}}": "අසම්පූර්ණ බණ්ඩල මඟ හරින ලදී: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "ශබ්දකෝෂය ආයාත කිරීමට අසමත් විය: {{message}}",
|
||||
"Dictionaries": "ශබ්දකෝෂ",
|
||||
"Delete Dictionary": "ශබ්දකෝෂය මකන්න",
|
||||
"Importing…": "ආයාත වෙමින්…",
|
||||
"Import Dictionary": "ශබ්දකෝෂයක් ආයාත කරන්න",
|
||||
"No dictionaries available.": "ලබා ගත හැකි ශබ්දකෝෂ නැත.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict බණ්ඩලවලට .ifo, .idx සහ .dict.dz ගොනු අවශ්යය (.syn විකල්ප).",
|
||||
"Select all the bundle files together when importing.": "ආයාත කරන විට බණ්ඩලේ සියලු ගොනු එකවර තෝරන්න.",
|
||||
"Manage Dictionaries": "ශබ්දකෝෂ කළමනාකරණය",
|
||||
"Select Dictionary Files": "ශබ්දකෝෂ ගොනු තෝරන්න",
|
||||
"Read on Wikipedia →": "Wikipedia හි කියවන්න →",
|
||||
"This link can't be opened": "මෙම සබැඳිය විවෘත කළ නොහැක",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "අනුසටහන් සබැඳියට අවශ්ය තොරතුරු නොමැත. මුල් සබැඳිය කපා ඇතිවා විය හැක.",
|
||||
"Go to Readest": "Readest වෙත යන්න",
|
||||
"Open-source ebook reader for everyone, on every device.": "හැම කෙනෙකුට, හැම උපාංගයකම — විවෘත මූල කේත ඉ-පොත් කියවනය.",
|
||||
"Open in Readest": "Readest තුළ විවෘත කරන්න",
|
||||
"If Readest didn't open automatically, choose an option below:": "Readest ස්වයංක්රීයව විවෘත නොවුණි නම්, පහත විකල්පයක් තෝරන්න:",
|
||||
"Continue reading where you left off.": "ඔබ නැවතුණු තැනින් ම කියවීම ආරම්භ කරන්න.",
|
||||
"Readest logo": "Readest ලාංඡනය",
|
||||
"Opening Readest...": "Readest විවෘත කරමින්…",
|
||||
"Open in Readest app": "Readest යෙදුමෙහි විවෘත කරන්න",
|
||||
"Continue in browser": "බ්රවුසරයේ දිගටම යන්න",
|
||||
"Don't have Readest?": "Readest නැද්ද?",
|
||||
"Book not in your library": "පොත ඔබේ පුස්තකාලයේ නැත",
|
||||
"Share Book": "පොත බෙදාගන්න",
|
||||
"Could not create share link": "බෙදාගැනීමේ සබැඳිය සෑදිය නොහැක",
|
||||
"Link copied": "සබැඳිය පිටපත් කළා",
|
||||
"Could not copy link": "සබැඳිය පිටපත් කළ නොහැක",
|
||||
"Share revoked": "බෙදාගැනීම අවලංගු කළා",
|
||||
"Could not revoke share": "බෙදාගැනීම අවලංගු කළ නොහැක",
|
||||
"Uploading book…": "පොත උඩුගත කරමින්…",
|
||||
"Generating…": "සාදමින්…",
|
||||
"Generate share link": "බෙදාගැනීමේ සබැඳිය සාදන්න",
|
||||
"Share URL": "බෙදාගැනීමේ URL",
|
||||
"Copy link": "සබැඳිය පිටපත් කරන්න",
|
||||
"Copied": "පිටපත් කළා",
|
||||
"Share via…": "හරහා බෙදාගන්න…",
|
||||
"Expires {{date}}": "{{date}} දින කල් ඉකුත් වේ",
|
||||
"Revoking…": "අවලංගු කරමින්…",
|
||||
"Revoke share": "බෙදාගැනීම අවලංගු කරන්න",
|
||||
"Sign in to share books": "පොත් බෙදාගැනීමට පුරනය වන්න",
|
||||
"Expiring soon": "ඉක්මනින් කල් ඉකුත් වේ",
|
||||
"Missing share token": "බෙදාගැනීමේ ටෝකනය නොමැත",
|
||||
"Could not add to your library": "ඔබගේ පුස්තකාලයට එක් කළ නොහැක",
|
||||
"This share link is no longer available": "මෙම බෙදාගැනීමේ සබැඳිය තවදුරටත් නොමැත",
|
||||
"The original link may have expired or been revoked.": "මුල් සබැඳිය කල් ඉකුත් වී හෝ අවලංගු වී ඇත.",
|
||||
"Get Readest": "Readest ලබාගන්න",
|
||||
"Loading shared book…": "බෙදාගත් පොත පූරණය වෙමින්…",
|
||||
"Adding…": "එක් කරමින්…",
|
||||
"Add to my library": "මගේ පුස්තකාලයට එක් කරන්න",
|
||||
"Could not load your shares": "ඔබගේ බෙදාගැනීම් පූරණය කළ නොහැක",
|
||||
"Revoked": "අවලංගු",
|
||||
"Expired": "කල් ඉකුත්",
|
||||
"Shared books": "බෙදාගත් පොත්",
|
||||
"You haven't shared any books yet": "ඔබ තවම පොත් කිසිවක් බෙදාගෙන නැත",
|
||||
"Open a book and tap Share to send it to a friend.": "පොතක් විවෘත කර එය මිතුරෙකුට යවන්න බෙදාගන්න ටැප් කරන්න.",
|
||||
"{{count}} active_one": "සක්රිය {{count}}ක්",
|
||||
"{{count}} active_other": "සක්රිය {{count}}ක්",
|
||||
"{{count}} downloads_one": "බාගත {{count}}ක්",
|
||||
"{{count}} downloads_other": "බාගත {{count}}ක්",
|
||||
"starts at saved page": "සුරකින ලද පිටුවෙන් ආරම්භ වේ",
|
||||
"More actions": "තවත් ක්රියා",
|
||||
"Loading…": "පූරණය වෙමින්…",
|
||||
"Load more": "තවත් පූරණය කරන්න",
|
||||
"Could not load shared book": "බෙදාගත් පොත පූරණය කළ නොහැක",
|
||||
"The share link is missing required information.": "බෙදාගැනීමේ සබැඳියෙහි අවශ්ය තොරතුරු නොමැත.",
|
||||
"Please check your connection and try again.": "කරුණාකර ඔබගේ සම්බන්ධතාවය පරීක්ෂා කර නැවත උත්සාහ කරන්න.",
|
||||
"Sign in to import shared books": "බෙදාගත් පොත් ආයාත කිරීමට පුරනය වන්න",
|
||||
"Already in your library": "දැනටමත් ඔබගේ පුස්තකාලයේ ඇත",
|
||||
"Added to your library": "ඔබගේ පුස්තකාලයට එක් කළා",
|
||||
"Could not import shared book": "බෙදාගත් පොත ආයාත කළ නොහැක",
|
||||
"Manage Shared Links": "බෙදාගැනීමේ සබැඳි කළමනාකරණය",
|
||||
"Expires in": "කල් ඉකුත් වේ",
|
||||
"{{count}} days_one": "දින 1",
|
||||
"{{count}} days_other": "දින {{count}}",
|
||||
"Expires in {{count}} days_one": "දින 1කින් කල් ඉකුත් වේ",
|
||||
"Expires in {{count}} days_other": "දින {{count}}කින් කල් ඉකුත් වේ",
|
||||
"Expires in {{count}} hours_one": "පැය 1කින් කල් ඉකුත් වේ",
|
||||
"Expires in {{count}} hours_other": "පැය {{count}}කින් කල් ඉකුත් වේ",
|
||||
"Open in app": "යෙදුමෙන් විවෘත කරන්න",
|
||||
"Shared with you": "ඔබ සමඟ බෙදාගත්",
|
||||
"Downloading… {{percent}}%": "බාගත කරමින්… {{percent}}%",
|
||||
"Import progress": "ආයාත ප්රගතිය",
|
||||
"Share reading progress": "කියවීමේ ප්රගතිය බෙදාගන්න",
|
||||
"Includes your reading progress": "ඔබේ කියවීමේ ප්රගතිය ඇතුළත්",
|
||||
"Synced {{time}}": "{{time}} සමමුහුර්ත කළේ",
|
||||
"Sync Info": "සමමුහුර්ත තොරතුරු",
|
||||
"Last Synced": "අවසන් සමමුහුර්තය",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT පැකේජ සඳහා .index ගොනුවක් සහ .dict.dz ගොනුවක් අවශ්ය වේ.",
|
||||
"Slob bundles need a .slob file.": "Slob පැකේජ සඳහා .slob ගොනුවක් අවශ්ය වේ.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL අච්චුව http(s):// වලින් ආරම්භ විය යුතු අතර %WORD% අඩංගු විය යුතුය.",
|
||||
"Web": "වෙබ්",
|
||||
"Add Web Search": "වෙබ් සෙවුම එක් කරන්න",
|
||||
"Edit Web Search": "වෙබ් සෙවුම සංස්කරණය කරන්න",
|
||||
"e.g. Google": "උදා. Google",
|
||||
"URL Template": "URL අච්චුව",
|
||||
"Use %WORD% where the looked-up word should appear.": "සොයන වචනය දිස්විය යුතු තැන %WORD% භාවිතා කරන්න.",
|
||||
"Open the search result in your browser:": "ඔබේ බ්රවුසරයේ සෙවුම් ප්රතිඵලය විවෘත කරන්න:",
|
||||
"Open in {{name}}": "{{name}} වල විවෘත කරන්න",
|
||||
"Book Fingerprint": "පොතේ ඇඟිලි සලකුණ",
|
||||
"Search the web": "වෙබයේ සොයන්න",
|
||||
"App deeplink (readest://)": "යෙදුම් ගැඹුරු සබැඳිය (readest://)",
|
||||
"Universal web link (https://)": "සර්වත්ර වෙබ් සබැඳිය (https://)",
|
||||
"Name cannot be empty.": "නම හිස් විය නොහැක.",
|
||||
"Replaced {{count}} existing dictionary_one": "පවතින ශබ්දකෝෂ {{count}}ක් ප්රතිස්ථාපනය කරන ලදී",
|
||||
"Replaced {{count}} existing dictionary_other": "පවතින ශබ්දකෝෂ {{count}}ක් ප්රතිස්ථාපනය කරන ලදී",
|
||||
"Cancel Edit": "සංස්කරණය අවලංගු කරන්න",
|
||||
"Edit Dictionary": "ශබ්දකෝෂය සංස්කරණය කරන්න",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict පැකේජ .mdx ගොනු භාවිතා කරයි; සහායක .mdd සහ .css ගොනු විකල්පීය වේ.",
|
||||
"Dictionary name": "ශබ්දකෝෂයේ නම",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "මෙම ශබ්දය මෙහි වාදනය කළ නොහැක — ශබ්දකෝෂය යල් පැන ගිය ආකෘතියක් භාවිතා කරයි. Opus, MP3 හෝ WAV ශබ්ද සහිත එකක් උත්සාහ කරන්න.",
|
||||
"File uploaded: {{title}}": "ගොනුව උඩුගත විය: {{title}}",
|
||||
"File downloaded: {{title}}": "ගොනුව බාගන්නා ලදී: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "ගොනුවේ cloud පිටපත මකා දමන ලදී: {{title}}",
|
||||
"Failed to upload file: {{title}}": "ගොනුව උඩුගත කිරීමට අසමත්: {{title}}",
|
||||
"Failed to download file: {{title}}": "ගොනුව බාගැනීමට අසමත්: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "ගොනුවේ cloud පිටපත මකා දැමීමට අසමත්: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% භාවිතයි",
|
||||
"Set PIN…": "PIN සකසන්න…",
|
||||
"Require a 4-digit PIN to open Readest": "Readest විවෘත කිරීමට ඉලක්කම් 4ක PIN එකක් ඉල්ලන්න",
|
||||
"Change PIN…": "PIN වෙනස් කරන්න…",
|
||||
"Disable PIN…": "PIN අක්රිය කරන්න…",
|
||||
"Sync passphrase ready": "සමමුහුර්ත මුරපදය සූදානම්",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "මෙය සෑම උපාංගයකම අප සමමුහුර්ත කරන සංකේතාංකිත අක්තපත්ර (උදා., OPDS නාමාවලි මුරපද) ස්ථිරවම මකා දමයි. දේශීය පිටපත් රැකේ. ඔබට සමමුහුර්ත මුරපදය නැවත ඇතුළත් කිරීමට හෝ අලුත් එකක් සැකසීමට සිදුවේ. ඉදිරියට යන්නද?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "සමමුහුර්ත මුරපදය අමතක විය — සියලුම සංකේතාංකිත ක්ෂේත්ර හිස් කරන ලදී",
|
||||
"Sync passphrase": "සමමුහුර්ත මුරපදය",
|
||||
"Set passphrase": "මුරපදය සකසන්න",
|
||||
"Forgot passphrase": "මුරපදය අමතකද",
|
||||
"Incorrect PIN": "වැරදි PIN",
|
||||
"App locked": "යෙදුම අගුළු දමා ඇත",
|
||||
"Enter your PIN": "ඔබගේ PIN ඇතුළත් කරන්න",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest අගුළු දමා ඇත. ඉදිරියට යාමට ඔබගේ ඉලක්කම් 4ක PIN ඇතුළත් කරන්න.",
|
||||
"PIN code": "PIN කේතය",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PIN අමතක වීම ඔබව මෙම උපාංගයෙන් අගුළු දමයි. එය යළි පිහිටුවීමට යෙදුමේ දත්ත හිස් කිරීමට අවශ්ය වේ.",
|
||||
"Passphrase must be at least 8 characters": "මුරපදය අවම වශයෙන් අක්ෂර 8 ක් විය යුතුය",
|
||||
"Passphrases do not match": "මුරපද ගැළපෙන්නේ නැත",
|
||||
"Set sync passphrase": "සමමුහුර්ත මුරපදය සකසන්න",
|
||||
"Enter sync passphrase": "සමමුහුර්ත මුරපදය ඇතුළත් කරන්න",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "සමමුහුර්ත මුරපදයක් ඔබේ සංවේදී ක්ෂේත්ර (OPDS නාමාවලි අක්තපත්ර වැනි) සමමුහුර්ත වීමට පෙර සංකේතාංකනය කරයි. අපි කිසිදා මෙම මුරපදය නොදකිමු. මතක තබාගත හැකි දෙයක් තෝරන්න — එය නොමැතිව ප්රතිසාධනයක් නොමැත.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "ඔබේ සමමුහුර්ත අක්තපත්ර විකේතනය කිරීමට වෙනත් උපාංගයක ඔබ සැකසූ සමමුහුර්ත මුරපදය ඇතුළත් කරන්න.",
|
||||
"Confirm passphrase": "මුරපදය තහවුරු කරන්න",
|
||||
"Unlock": "අගුළු හරින්න",
|
||||
"Set PIN": "PIN සකසන්න",
|
||||
"Change PIN": "PIN වෙනස් කරන්න",
|
||||
"Disable PIN": "PIN අක්රිය කරන්න",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "ඔබගේ වත්මන් PIN ඇතුළත් කර, පසුව නව ඉලක්කම් 4ක PIN එකක් තෝරන්න.",
|
||||
"Enter your current PIN to disable the app lock.": "යෙදුම් අගුල අක්රිය කිරීමට ඔබගේ වත්මන් PIN ඇතුළත් කරන්න.",
|
||||
"PIN must be {{length}} digits": "PIN ඉලක්කම් {{length}}ක් විය යුතුය",
|
||||
"PINs do not match": "PINs නොගැලපේ",
|
||||
"Current PIN": "වත්මන් PIN",
|
||||
"New PIN": "නව PIN",
|
||||
"Confirm new PIN": "නව PIN තහවුරු කරන්න",
|
||||
"Manage Sync": "සමමුහූර්තය කළමනාකරණය",
|
||||
"Imported book files and library metadata": "ආයාතිත පොත් ගොනු සහ පුස්තකාල පාර-දත්ත",
|
||||
"Last-read position, bookmarks, and per-book preferences": "අවසන් වරට කියවූ ස්ථානය, පිටු සලකුණු සහ එක් එක් පොතේ අභිප්රේත",
|
||||
"Highlights and notes": "උද්දීපන සහ සටහන්",
|
||||
"Fonts": "අකුරු",
|
||||
"Custom font files": "අභිරුචි අකුරු ගොනු",
|
||||
"Backgrounds": "පසුබිම්",
|
||||
"Custom background textures": "අභිරුචි පසුබිම් වයන",
|
||||
"OPDS catalogs": "OPDS නාමාවලි",
|
||||
"Saved catalog URLs and (encrypted) credentials": "සුරකින ලද නාමාවලි URL සහ (සංකේතන කළ) අක්තපත්ර",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "වැරදි සමමුහූර්ත මුරපදය — සමමුහූර්ත කළ අක්තපත්ර විකේතනය කළ නොහැක",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "සේවාදායකයේ සමමුහූර්ත මුරපද දත්ත යළි සැකසීය. නව මුරපදය යටතේ ඔබේ අක්තපත්ර යළි සංකේතනය වෙමින්…",
|
||||
"Failed to decrypt synced credentials": "සමමුහූර්ත කළ අක්තපත්ර විකේතනය කිරීමට අසමත් විය",
|
||||
"Imported dictionary bundles and settings": "ආයාතිත ශබ්දකෝෂ පැකේජ සහ සැකසීම්",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "ඔබේ උපාංග අතර කුමක් සමමුහූර්ත කළ යුතුද යන්න තෝරන්න. කාණ්ඩයක් අක්රිය කිරීමෙන් මෙම උපාංගයෙන් එම වර්ගයේ පේළි යැවීම හෝ ලැබීම නවතී. සේවාදායකයේ දැනටමත් ඇති දේ එලෙසම පවතී, නැවත සක්රිය කළ විට ඔබ නැවැත්වූ තැනින් යළි ආරම්භ වේ.",
|
||||
"Data Sync": "දත්ත සමමුහූර්තය",
|
||||
"Manage Fonts": "අකුරු කළමනාකරණය",
|
||||
"App settings": "යෙදුමේ සැකසුම්",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "තේමාව, උද්දීපන වර්ණ, ඒකාබද්ධතා (KOSync, Readwise, Hardcover) සහ ශබ්දකෝෂ අනුපිළිවෙල",
|
||||
"Required while Dictionaries sync is enabled": "ශබ්දකෝෂ සමමුහූර්තය සක්රිය වී ඇති විට අවශ්යයි",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} පැ {{minutes}} මි කින් යළි පිහිටුවයි",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "අංක 4ක PIN එකක් තෝරන්න. ඔබ Readest විවෘත කරන සෑම විටම ඔබට එය ඇතුළත් කිරීමට අවශ්ය වේ. අමතක වූ PIN එකක් ලබා ගැනීමට ක්රමයක් නැත. එය යළි පිහිටුවීමට ඇති එකම ක්රමය යෙදුම් දත්ත මකා දැමීමයි.",
|
||||
"Credentials": "අක්තපත්ර",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, සහ Readwise සඳහා ටෝකන, පරිශීලක නාම සහ මුරපද. අක්රිය කළ විට, අක්තපත්ර මෙම උපාංගයේ පමණක් රැඳී පවතින අතර කිසිදා උඩුගත නොකෙරේ.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "සංවේදී සමමුහූර්ත ක්ෂේත්ර උඩුගත කිරීමට පෙර සංකේතනය වේ. සංකේතනය අවශ්ය වූ විට දැන් හෝ පසුව මුර වැකියක් සකසන්න.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "මෙම ගිණුමට සුරකින ලදී. අක්තපත්ර විකේතනය කිරීමේදී ඔබෙන් එය ඉල්ලනු ලැබේ.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "මෙම උපාංගයේ කියවීමේ ප්රගතිය \"{{deviceName}}\" වලින් වෙනස් වේ.",
|
||||
"This device": "මෙම උපාංගය",
|
||||
"Red": "රතු",
|
||||
"Yellow": "කහ",
|
||||
"Green": "කොළ",
|
||||
"Blue": "නිල්",
|
||||
"Violet": "දම්",
|
||||
"Edit color": "වර්ණය සංස්කරණය කරන්න",
|
||||
"Add custom color": "අභිමත වර්ණයක් එක් කරන්න",
|
||||
"Add label": "ලේබලයක් එක් කරන්න",
|
||||
"Choose color": "වර්ණයක් තෝරන්න",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcover වෙත සම්බන්ධිතයි. අවසන් සමමුහුර්ත කිරීම {{time}}.",
|
||||
"Integrations": "ඒකාබද්ධ කිරීම්",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwise වෙත සම්බන්ධිතයි. අවසන් සමමුහුර්ත කිරීම {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "ඔන්ලයින් නාමාවලි වලින් පොත් පිරික්සා බාගත කරන්න.",
|
||||
"Connected as {{user}}": "{{user}} ලෙස සම්බන්ධිතයි",
|
||||
"Not connected": "සම්බන්ධ වී නැත",
|
||||
"{{count}} catalog_one": "නාමාවලි {{count}}",
|
||||
"{{count}} catalog_other": "නාමාවලි {{count}}",
|
||||
"No catalogs": "නාමාවලි නැත",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "සමමුහුර්ත කිරීම, ඉස්මතු කිරීම් සහ නාමාවලි සඳහා Readest බාහිර සේවාවන්ට සම්බන්ධ කරන්න.",
|
||||
"Reading Sync": "කියවීමේ සමමුහුර්ත කිරීම",
|
||||
"Content Sources": "අන්තර්ගත මූලාශ්ර",
|
||||
"Scroll tabs": "ටැබ් අනුචලනය කරන්න",
|
||||
"Catalog actions": "නාමාවලි ක්රියා",
|
||||
"File Content": "ගොනුවේ අන්තර්ගතය",
|
||||
"Start your library": "ඔබේ පුස්තකාලය ආරම්භ කරන්න",
|
||||
"Pick a book from your device to add it to your library.": "ඔබේ පුස්තකාලයට එක් කිරීමට ඔබේ උපාංගයෙන් පොතක් තෝරන්න.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "මෙම කවුළුවේ ඕනෑම තැනක පොතක් දමන්න, නැතහොත් ඔබේ පරිගණකයෙන් එකක් තෝරන්න.",
|
||||
"Sign in to sync your library": "ඔබේ පුස්තකාලය සමමුහුර්ත කිරීමට පුරනය වන්න"
|
||||
}
|
||||
|
||||
@@ -133,7 +133,6 @@
|
||||
"Cloud File Transfers": "Prenosi datotek v oblaku",
|
||||
"{{activeCount}} active, {{pendingCount}} pending": "{{activeCount}} aktivnih, {{pendingCount}} na čakanju",
|
||||
"{{failedCount}} failed": "{{failedCount}} spodletelih",
|
||||
"Synced at {{time}}": "Sinhronizirano ob {{time}}",
|
||||
"Never synced": "Nikoli sinhronizirano",
|
||||
"Account": "Račun",
|
||||
"Sign In": "Prijava",
|
||||
@@ -223,7 +222,6 @@
|
||||
"Failed to delete local copy of the book: {{title}}": "Brisanje lokalne kopije knjige ni uspelo: {{title}}",
|
||||
"Library Header": "Glava knjižnice",
|
||||
"Library Sync Progress": "Napredek sinhronizacije knjižnice",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Dobrodošli v vaši knjižnici. Tukaj lahko uvozite svoje knjige in jih berete kadarkoli.",
|
||||
"URL must start with http:// or https://": "URL se mora začeti s http:// ali https://",
|
||||
"Adding LAN addresses is not supported in the web app version.": "Dodajanje naslovov LAN v različici spletne aplikacije ni podprto.",
|
||||
"Invalid OPDS catalog. Please check the URL.": "Neveljaven OPDS katalog. Prosimo, preverite URL.",
|
||||
@@ -297,7 +295,6 @@
|
||||
"Dictionary": "Slovar",
|
||||
"Look up text in dictionary after selection": "Poišči besedilo v slovarju po izbiri",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Look up text in Wikipedia after selection": "Poišči besedilo v Wikipediji po izbiri",
|
||||
"Translate": "Prevedi",
|
||||
"Translate text after selection": "Prevedi besedilo po izbiri",
|
||||
"Speak": "Govori",
|
||||
@@ -399,9 +396,6 @@
|
||||
"System Language": "Sistemski jezik",
|
||||
"No translation available.": "Prevod ni na voljo.",
|
||||
"Translated by {{provider}}.": "Prevedeno s {{provider}}.",
|
||||
"Error": "Napaka",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Članka ni mogoče naložiti. Poskusite iskati neposredno na {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Besede ni mogoče naložiti. Poskusite iskati neposredno na {{link}}.",
|
||||
"Remove Bookmark": "Odstrani zaznamek",
|
||||
"Add Bookmark": "Dodaj zaznamek",
|
||||
"Books Content": "Vsebina knjig",
|
||||
@@ -435,13 +429,9 @@
|
||||
"Zoomed": "Povečano",
|
||||
"Zoom level": "Raven povečave",
|
||||
"Sync Conflict": "Spor pri sinhronizaciji",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Želite sinhronizirati napredek branja iz naprave \"{{deviceName}}\"?",
|
||||
"another device": "druga naprava",
|
||||
"Local Progress": "Lokalni napredek",
|
||||
"Remote Progress": "Oddaljeni napredek",
|
||||
"Failed to connect": "Povezava ni uspela",
|
||||
"Disconnected": "Povezava prekinjena",
|
||||
"KOReader Sync Settings": "Nastavitve KOReader Sync",
|
||||
"Sync as {{userDisplayName}}": "Sinhroniziraj kot {{userDisplayName}}",
|
||||
"Sync Server Connected": "Strežnik za sinhronizacijo povezan",
|
||||
"Sync Strategy": "Strategija sinhronizacije",
|
||||
@@ -450,7 +440,6 @@
|
||||
"Send changes only": "Pošlji samo spremembe",
|
||||
"Receive changes only": "Prejmi samo spremembe",
|
||||
"Checksum Method": "Metoda kontrolne vsote",
|
||||
"File Content (recommended)": "Vsebina datoteke (priporočeno)",
|
||||
"File Name": "Ime datoteke",
|
||||
"Device Name": "Ime naprave",
|
||||
"Connect to your KOReader Sync server.": "Povežite se s svojim KOReader Sync strežnikom.",
|
||||
@@ -503,9 +492,6 @@
|
||||
"Invalid Readwise access token": "Neveljaven žeton za dostop do Readwise",
|
||||
"Disconnected from Readwise": "Povezava z Readwise prekinjena",
|
||||
"Never": "Nikoli",
|
||||
"Readwise Settings": "Nastavitve Readwise",
|
||||
"Connected to Readwise": "Povezano z Readwise",
|
||||
"Last synced: {{time}}": "Zadnja sinhronizacija: {{time}}",
|
||||
"Sync Enabled": "Sinhronizacija omogočena",
|
||||
"Disconnect": "Prekini povezavo",
|
||||
"Connect your Readwise account to sync highlights.": "Povežite svoj Readwise račun za sinhronizacijo označb.",
|
||||
@@ -552,7 +538,6 @@
|
||||
"Exit Parallel Read": "Zapusti vzporedno branje",
|
||||
"Enter Parallel Read": "Vstopi v vzporedno branje",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Config": "Konfiguracija",
|
||||
"Push Progress": "Pošlji napredek",
|
||||
"Pull Progress": "Prejmi napredek",
|
||||
"Readwise Sync": "Readwise Sync",
|
||||
@@ -890,7 +875,6 @@
|
||||
"Strikethrough": "Prečrtano",
|
||||
"Squiggly": "Vijugasto",
|
||||
"Outline": "Obroba",
|
||||
"Save Current Color": "Shrani trenutno barvo",
|
||||
"Quick Colors": "Hitre barve",
|
||||
"Override Book Color": "Prezri barvo knjige",
|
||||
"None": "Brez",
|
||||
@@ -1145,7 +1129,6 @@
|
||||
"Copy Selection": "Kopiraj izbiro",
|
||||
"Translate Selection": "Prevedi izbiro",
|
||||
"Dictionary Lookup": "Iskanje v slovarju",
|
||||
"Wikipedia Lookup": "Iskanje na Wikipediji",
|
||||
"Read Aloud Selection": "Preberi izbiro na glas",
|
||||
"Proofread Selection": "Lektoriraj izbiro",
|
||||
"Open Settings": "Odpri nastavitve",
|
||||
@@ -1181,25 +1164,18 @@
|
||||
"Drag to seek": "Povlecite za iskanje",
|
||||
"Punctuation Delay": "Zamik ločil",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Pred nadaljevanjem potrdite, da bo ta povezava OPDS preusmerjena prek strežnikov Readest v spletni aplikaciji.",
|
||||
"Custom Headers": "Glave po meri",
|
||||
"Custom Headers (optional)": "Glave po meri (neobvezno)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Dodajte eno glavo na vrstico v obliki \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Razumem, da bo ta povezava OPDS preusmerjena prek strežnikov Readest v spletni aplikaciji. Če ne zaupam Readest s temi poverilnicami ali glavami, moram uporabiti izvorno aplikacijo.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Povezava s Hardcover ni mogoča. Preverite omrežno povezavo.",
|
||||
"Invalid Hardcover API token": "Neveljaven žeton API za Hardcover",
|
||||
"Disconnected from Hardcover": "Prekinjeno s Hardcover",
|
||||
"Hardcover Settings": "Nastavitve Hardcover",
|
||||
"Connected to Hardcover": "Povezano s Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Povežite svoj račun Hardcover za sinhronizacijo napredka branja in zapiskov.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Pridobite žeton API na hardcover.app → Nastavitve → API.",
|
||||
"API Token": "Žeton API",
|
||||
"Paste your Hardcover API token": "Prilepite žeton API za Hardcover",
|
||||
"Hardcover sync enabled for this book": "Sinhronizacija Hardcover je omogočena za to knjigo",
|
||||
"Hardcover sync disabled for this book": "Sinhronizacija Hardcover je onemogočena za to knjigo",
|
||||
"Hardcover Sync": "Sinhronizacija Hardcover",
|
||||
"Enable for This Book": "Omogoči za to knjigo",
|
||||
"Push Notes": "Pošlji zapiske",
|
||||
"Enable Hardcover sync for this book first.": "Najprej omogočite sinhronizacijo Hardcover za to knjigo.",
|
||||
"No annotations or excerpts to sync for this book.": "Za to knjigo ni opomb ali izpiskov za sinhronizacijo.",
|
||||
"Configure Hardcover in Settings first.": "Najprej nastavite Hardcover v nastavitvah.",
|
||||
"No new Hardcover note changes to sync.": "Ni novih sprememb zapiskov Hardcover za sinhronizacijo.",
|
||||
@@ -1213,9 +1189,278 @@
|
||||
"Split Hyphens": "Razdeli vezaje",
|
||||
"Apply Theme Colors to PDF": "Uporabi barve teme za PDF",
|
||||
"Name": "Ime",
|
||||
"Unavailable": "Nedosegljivo",
|
||||
"Remove": "Odstrani",
|
||||
"Edit OPDS Catalog": "Uredi katalog OPDS",
|
||||
"Save Changes": "Shrani spremembe",
|
||||
"Use Book Layout": "Uporabi postavitev knjige"
|
||||
"Use Book Layout": "Uporabi postavitev knjige",
|
||||
"End of this section. Continue to the next.": "Konec tega razdelka. Nadaljujte z naslednjim.",
|
||||
"Auto-download": "Samodejni prenos",
|
||||
"Auto-download new items": "Samodejno prenesi nove vsebine",
|
||||
"Automatically download new publications when the app syncs": "Samodejno prenesi nove vsebine, ko se aplikacija sinhronizira",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "Prenesena je {{count}} nova vsebina iz OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_two": "Preneseni sta {{count}} novi vsebini iz OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_few": "Prenesene so {{count}} nove vsebine iz OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Preneseno je {{count}} novih vsebin iz OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Sinhronizacija {{count}} kataloga OPDS ni uspela",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_two": "Sinhronizacija {{count}} katalogov OPDS ni uspela",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_few": "Sinhronizacija {{count}} katalogov OPDS ni uspela",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Sinhronizacija {{count}} katalogov OPDS ni uspela",
|
||||
"Last synced {{when}}": "Zadnja sinhronizacija {{when}}",
|
||||
"Failed downloads": "Neuspeli prenosi",
|
||||
"No failed downloads": "Ni neuspelih prenosov",
|
||||
"Attempts: {{count}}_one": "Poskusi: {{count}}",
|
||||
"Attempts: {{count}}_two": "Poskusi: {{count}}",
|
||||
"Attempts: {{count}}_few": "Poskusi: {{count}}",
|
||||
"Attempts: {{count}}_other": "Poskusi: {{count}}",
|
||||
"Skip": "Preskoči",
|
||||
"Skip all": "Preskoči vse",
|
||||
"Retry all": "Poskusi znova vse",
|
||||
"{{count}} failed_one": "{{count}} ni uspela",
|
||||
"{{count}} failed_two": "{{count}} nista uspeli",
|
||||
"{{count}} failed_few": "{{count}} niso uspele",
|
||||
"{{count}} failed_other": "{{count}} jih ni uspelo",
|
||||
"(none)": "(brez)",
|
||||
"Identifiers": "Identifikatorji",
|
||||
"Read (Stream)": "Beri (pretok)",
|
||||
"Failed to start stream": "Pretoka ni bilo mogoče zagnati",
|
||||
"No dictionaries enabled": "Ni omogočenih slovarjev",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Omogoči slovar v Nastavitve → Jezik → Slovarji.",
|
||||
"Wiktionary": "Wikislovar",
|
||||
"Drag to reorder": "Povleci za prerazporeditev",
|
||||
"Built-in": "Vgrajeno",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Sveženj manjka na tej napravi. Ponovno uvozi za uporabo.",
|
||||
"This dictionary format is not supported.": "Ta oblika slovarja ni podprta.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "Uvožen {{count}} slovar",
|
||||
"Imported {{count}} dictionary_two": "Uvožena {{count}} slovarja",
|
||||
"Imported {{count}} dictionary_few": "Uvoženi {{count}} slovarji",
|
||||
"Imported {{count}} dictionary_other": "Uvoženih {{count}} slovarjev",
|
||||
"Skipped incomplete bundles: {{names}}": "Preskočeni nepopolni svežnji: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Uvoz slovarja ni uspel: {{message}}",
|
||||
"Dictionaries": "Slovarji",
|
||||
"Delete Dictionary": "Izbriši slovar",
|
||||
"Importing…": "Uvažanje …",
|
||||
"Import Dictionary": "Uvozi slovar",
|
||||
"No dictionaries available.": "Ni razpoložljivih slovarjev.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Svežnji StarDict potrebujejo datoteke .ifo, .idx in .dict.dz (.syn neobvezno).",
|
||||
"Select all the bundle files together when importing.": "Pri uvozu izberi vse datoteke svežnja skupaj.",
|
||||
"Manage Dictionaries": "Upravljanje slovarjev",
|
||||
"Select Dictionary Files": "Izberi datoteke slovarja",
|
||||
"Read on Wikipedia →": "Beri v Wikipediji →",
|
||||
"This link can't be opened": "Te povezave ni mogoče odpreti",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Povezavi opombe manjkajo zahtevani podatki. Izvirna povezava je morda skrajšana.",
|
||||
"Go to Readest": "Pojdi na Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Odprtokodni bralnik e-knjig za vse, na vsaki napravi.",
|
||||
"Open in Readest": "Odpri v Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Če se Readest ni odprl samodejno, izberi možnost spodaj:",
|
||||
"Continue reading where you left off.": "Berite naprej od mesta, kjer ste prej končali.",
|
||||
"Readest logo": "Logotip Readest",
|
||||
"Opening Readest...": "Odpiranje Readest…",
|
||||
"Open in Readest app": "Odpri v aplikaciji Readest",
|
||||
"Continue in browser": "Nadaljuj v brskalniku",
|
||||
"Don't have Readest?": "Še nimaš programa Readest?",
|
||||
"Book not in your library": "Knjiga ni v tvoji knjižnici",
|
||||
"Share Book": "Deli knjigo",
|
||||
"Could not create share link": "Povezave za deljenje ni bilo mogoče ustvariti",
|
||||
"Link copied": "Povezava kopirana",
|
||||
"Could not copy link": "Povezave ni bilo mogoče kopirati",
|
||||
"Share revoked": "Deljenje preklicano",
|
||||
"Could not revoke share": "Deljenja ni bilo mogoče preklicati",
|
||||
"Uploading book…": "Prenašanje knjige…",
|
||||
"Generating…": "Ustvarjanje…",
|
||||
"Generate share link": "Ustvari povezavo za deljenje",
|
||||
"Share URL": "URL za deljenje",
|
||||
"Copy link": "Kopiraj povezavo",
|
||||
"Copied": "Kopirano",
|
||||
"Share via…": "Deli prek…",
|
||||
"Expires {{date}}": "Poteče {{date}}",
|
||||
"Revoking…": "Preklicovanje…",
|
||||
"Revoke share": "Prekliči deljenje",
|
||||
"Sign in to share books": "Prijavite se za deljenje knjig",
|
||||
"Expiring soon": "Kmalu poteče",
|
||||
"Missing share token": "Manjka žeton za deljenje",
|
||||
"Could not add to your library": "Knjige ni bilo mogoče dodati v knjižnico",
|
||||
"This share link is no longer available": "Ta povezava za deljenje ni več na voljo",
|
||||
"The original link may have expired or been revoked.": "Prvotna povezava je morda potekla ali bila preklicana.",
|
||||
"Get Readest": "Prenesi Readest",
|
||||
"Loading shared book…": "Nalaganje deljene knjige…",
|
||||
"Adding…": "Dodajanje…",
|
||||
"Add to my library": "Dodaj v mojo knjižnico",
|
||||
"Could not load your shares": "Vaših delitev ni bilo mogoče naložiti",
|
||||
"Revoked": "Preklicano",
|
||||
"Expired": "Poteklo",
|
||||
"Shared books": "Deljene knjige",
|
||||
"You haven't shared any books yet": "Še niste delili nobenih knjig",
|
||||
"Open a book and tap Share to send it to a friend.": "Odprite knjigo in tapnite Deli, da jo pošljete prijatelju.",
|
||||
"{{count}} active_one": "{{count}} aktivna",
|
||||
"{{count}} active_two": "{{count}} aktivni",
|
||||
"{{count}} active_few": "{{count}} aktivne",
|
||||
"{{count}} active_other": "{{count}} aktivnih",
|
||||
"{{count}} downloads_one": "{{count}} prenos",
|
||||
"{{count}} downloads_two": "{{count}} prenosa",
|
||||
"{{count}} downloads_few": "{{count}} prenosi",
|
||||
"{{count}} downloads_other": "{{count}} prenosov",
|
||||
"starts at saved page": "začne pri shranjeni strani",
|
||||
"More actions": "Več dejanj",
|
||||
"Loading…": "Nalaganje…",
|
||||
"Load more": "Naloži več",
|
||||
"Could not load shared book": "Deljene knjige ni bilo mogoče naložiti",
|
||||
"The share link is missing required information.": "V povezavi za deljenje manjkajo zahtevani podatki.",
|
||||
"Please check your connection and try again.": "Preverite povezavo in poskusite znova.",
|
||||
"Sign in to import shared books": "Prijavite se za uvoz deljenih knjig",
|
||||
"Already in your library": "Že je v vaši knjižnici",
|
||||
"Added to your library": "Dodano v vašo knjižnico",
|
||||
"Could not import shared book": "Deljene knjige ni bilo mogoče uvoziti",
|
||||
"Manage Shared Links": "Upravljanje povezav za deljenje",
|
||||
"Expires in": "Poteče čez",
|
||||
"{{count}} days_one": "{{count}} dan",
|
||||
"{{count}} days_two": "{{count}} dneva",
|
||||
"{{count}} days_few": "{{count}} dnevi",
|
||||
"{{count}} days_other": "{{count}} dni",
|
||||
"Expires in {{count}} days_one": "Poteče čez {{count}} dan",
|
||||
"Expires in {{count}} days_two": "Poteče čez {{count}} dni",
|
||||
"Expires in {{count}} days_few": "Poteče čez {{count}} dni",
|
||||
"Expires in {{count}} days_other": "Poteče čez {{count}} dni",
|
||||
"Expires in {{count}} hours_one": "Poteče čez {{count}} uro",
|
||||
"Expires in {{count}} hours_two": "Poteče čez {{count}} uri",
|
||||
"Expires in {{count}} hours_few": "Poteče čez {{count}} ure",
|
||||
"Expires in {{count}} hours_other": "Poteče čez {{count}} ur",
|
||||
"Open in app": "Odpri v aplikaciji",
|
||||
"Shared with you": "Deljeno z vami",
|
||||
"Downloading… {{percent}}%": "Prenašanje… {{percent}} %",
|
||||
"Import progress": "Napredek uvoza",
|
||||
"Share reading progress": "Deli napredek branja",
|
||||
"Includes your reading progress": "Vključuje vaš napredek branja",
|
||||
"Synced {{time}}": "Sinhronizirano {{time}}",
|
||||
"Sync Info": "Informacije o sinhronizaciji",
|
||||
"Last Synced": "Zadnja sinhronizacija",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Paketi DICT potrebujejo datoteko .index in datoteko .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Paketi Slob potrebujejo datoteko .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Predloga URL se mora začeti z http(s):// in vsebovati %WORD%.",
|
||||
"Web": "Splet",
|
||||
"Add Web Search": "Dodaj spletno iskanje",
|
||||
"Edit Web Search": "Uredi spletno iskanje",
|
||||
"e.g. Google": "npr. Google",
|
||||
"URL Template": "Predloga URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Uporabite %WORD% tam, kjer naj se pojavi iskana beseda.",
|
||||
"Open the search result in your browser:": "Odprite rezultat iskanja v brskalniku:",
|
||||
"Open in {{name}}": "Odpri v {{name}}",
|
||||
"Book Fingerprint": "Prstni odtis knjige",
|
||||
"Search the web": "Iskanje po spletu",
|
||||
"App deeplink (readest://)": "Globoka povezava aplikacije (readest://)",
|
||||
"Universal web link (https://)": "Univerzalna spletna povezava (https://)",
|
||||
"Name cannot be empty.": "Ime ne sme biti prazno.",
|
||||
"Replaced {{count}} existing dictionary_one": "Zamenjan {{count}} obstoječi slovar",
|
||||
"Replaced {{count}} existing dictionary_two": "Zamenjana {{count}} obstoječa slovarja",
|
||||
"Replaced {{count}} existing dictionary_few": "Zamenjani {{count}} obstoječi slovarji",
|
||||
"Replaced {{count}} existing dictionary_other": "Zamenjanih {{count}} obstoječih slovarjev",
|
||||
"Cancel Edit": "Prekliči urejanje",
|
||||
"Edit Dictionary": "Uredi slovar",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Paketi MDict uporabljajo datoteke .mdx; spremne datoteke .mdd in .css so neobvezne.",
|
||||
"Dictionary name": "Ime slovarja",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Tega zvoka tukaj ni mogoče predvajati — slovar uporablja zastarelo obliko. Poskusite slovar z zvokom Opus, MP3 ali WAV.",
|
||||
"File uploaded: {{title}}": "Datoteka naložena: {{title}}",
|
||||
"File downloaded: {{title}}": "Datoteka prenesena: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Izbrisana kopija datoteke v oblaku: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Nalaganje datoteke ni uspelo: {{title}}",
|
||||
"Failed to download file: {{title}}": "Prenos datoteke ni uspel: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Brisanje kopije datoteke v oblaku ni uspelo: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}} % uporabljeno",
|
||||
"Set PIN…": "Nastavi PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Za odpiranje Readest zahtevaj 4-mestni PIN",
|
||||
"Change PIN…": "Spremeni PIN…",
|
||||
"Disable PIN…": "Onemogoči PIN…",
|
||||
"Sync passphrase ready": "Sinhronizacijsko geslo pripravljeno",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "S tem boste trajno izbrisali šifrirane poverilnice, ki jih sinhroniziramo (npr. gesla kataloga OPDS), v vseh napravah. Lokalne kopije se ohranijo. Znova boste morali vnesti sinhronizacijsko geslo ali nastaviti novo. Nadaljujem?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Sinhronizacijsko geslo pozabljeno — vsa šifrirana polja so izbrisana",
|
||||
"Sync passphrase": "Sinhronizacijsko geslo",
|
||||
"Set passphrase": "Nastavi geslo",
|
||||
"Forgot passphrase": "Pozabljeno geslo",
|
||||
"Incorrect PIN": "Napačen PIN",
|
||||
"App locked": "Aplikacija je zaklenjena",
|
||||
"Enter your PIN": "Vnesite svoj PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest je zaklenjen. Vnesite svoj 4-mestni PIN, da nadaljujete.",
|
||||
"PIN code": "Koda PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Če pozabite PIN, boste zaklenjeni iz te naprave. Za ponastavitev boste morali počistiti podatke aplikacije.",
|
||||
"Passphrase must be at least 8 characters": "Geslo mora imeti vsaj 8 znakov",
|
||||
"Passphrases do not match": "Gesli se ne ujemata",
|
||||
"Set sync passphrase": "Nastavi sinhronizacijsko geslo",
|
||||
"Enter sync passphrase": "Vnesite sinhronizacijsko geslo",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Sinhronizacijsko geslo šifrira vaša občutljiva polja (na primer poverilnice kataloga OPDS), preden se sinhronizirajo. Tega gesla nikoli ne vidimo. Izberite nekaj nepozabnega — brez njega ni obnovitve.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Vnesite sinhronizacijsko geslo, ki ste ga nastavili v drugi napravi, da dešifrirate sinhronizirane poverilnice.",
|
||||
"Confirm passphrase": "Potrdi geslo",
|
||||
"Unlock": "Odkleni",
|
||||
"Set PIN": "Nastavi PIN",
|
||||
"Change PIN": "Spremeni PIN",
|
||||
"Disable PIN": "Onemogoči PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Vnesite svoj trenutni PIN in nato izberite nov 4-mestni PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Vnesite svoj trenutni PIN, da onemogočite zaklep aplikacije.",
|
||||
"PIN must be {{length}} digits": "PIN mora vsebovati {{length}} števk",
|
||||
"PINs do not match": "PIN-i se ne ujemajo",
|
||||
"Current PIN": "Trenutni PIN",
|
||||
"New PIN": "Nov PIN",
|
||||
"Confirm new PIN": "Potrdite nov PIN",
|
||||
"Manage Sync": "Upravljaj sinhronizacijo",
|
||||
"Imported book files and library metadata": "Uvožene datoteke knjig in metapodatki knjižnice",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Zadnji položaj branja, zaznamki in nastavitve za posamezno knjigo",
|
||||
"Highlights and notes": "Označbe in opombe",
|
||||
"Fonts": "Pisave",
|
||||
"Custom font files": "Datoteke pisav po meri",
|
||||
"Backgrounds": "Ozadja",
|
||||
"Custom background textures": "Teksture ozadja po meri",
|
||||
"OPDS catalogs": "Katalogi OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Shranjeni naslovi URL katalogov in (šifrirana) poverilnice",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Napačno sinhronizacijsko geslo — sinhroniziranih poverilnic ni bilo mogoče dešifrirati",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Podatki o sinhronizacijskem geslu na strežniku so bili ponastavljeni. Vaše poverilnice se ponovno šifrirajo z novim geslom…",
|
||||
"Failed to decrypt synced credentials": "Dešifriranje sinhroniziranih poverilnic ni uspelo",
|
||||
"Imported dictionary bundles and settings": "Uvoženi paketi slovarjev in nastavitve",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Izberi, kaj naj se sinhronizira med tvojimi napravami. Onemogočanje kategorije ustavi to napravo, da bi pošiljala ali prejemala vnose te vrste. Kar je že na strežniku, ostane nespremenjeno, ob ponovnem omogočanju pa se sinhronizacija nadaljuje tam, kjer si končal.",
|
||||
"Data Sync": "Sinhronizacija podatkov",
|
||||
"Manage Fonts": "Upravljanje pisav",
|
||||
"App settings": "Nastavitve aplikacije",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, barve označb, integracije (KOSync, Readwise, Hardcover) in vrstni red slovarjev",
|
||||
"Required while Dictionaries sync is enabled": "Zahtevano, dokler je sinhronizacija Slovarjev omogočena",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Ponastavi se čez {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Izberite 4-mestno kodo PIN. Vnesti jo boste morali vsakič, ko boste odprli Readest. Pozabljene kode PIN ni mogoče obnoviti. Edini način za ponastavitev je brisanje podatkov aplikacije.",
|
||||
"Credentials": "Poverilnice",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Žetoni, uporabniška imena in gesla za OPDS, KOReader, Hardcover in Readwise. Ko je onemogočeno, poverilnice ostanejo le na tej napravi in se nikoli ne naložijo.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Občutljiva sinhronizirana polja so pred nalaganjem šifrirana. Nastavite geselsko frazo zdaj ali pozneje, ko bo šifriranje potrebno.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Shranjeno v tem računu. Pozvani boste, ko bo treba dešifrirati poverilnice.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Napredek branja na tej napravi se razlikuje od »{{deviceName}}«.",
|
||||
"This device": "Ta naprava",
|
||||
"Red": "Rdeča",
|
||||
"Yellow": "Rumena",
|
||||
"Green": "Zelena",
|
||||
"Blue": "Modra",
|
||||
"Violet": "Vijolična",
|
||||
"Edit color": "Uredi barvo",
|
||||
"Add custom color": "Dodaj barvo po meri",
|
||||
"Add label": "Dodaj oznako",
|
||||
"Choose color": "Izberi barvo",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Povezano s Hardcover. Zadnja sinhronizacija {{time}}.",
|
||||
"Integrations": "Integracije",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Povezano z Readwise. Zadnja sinhronizacija {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Brskajte in prenašajte knjige iz spletnih katalogov.",
|
||||
"Connected as {{user}}": "Povezano kot {{user}}",
|
||||
"Not connected": "Ni povezave",
|
||||
"{{count}} catalog_one": "{{count}} katalog",
|
||||
"{{count}} catalog_two": "{{count}} kataloga",
|
||||
"{{count}} catalog_few": "{{count}} katalogi",
|
||||
"{{count}} catalog_other": "{{count}} katalogov",
|
||||
"No catalogs": "Ni katalogov",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Povežite Readest z zunanjimi storitvami za sinhronizacijo, oznake in kataloge.",
|
||||
"Reading Sync": "Sinhronizacija branja",
|
||||
"Content Sources": "Viri vsebin",
|
||||
"Scroll tabs": "Drsenje zavihkov",
|
||||
"Catalog actions": "Dejanja kataloga",
|
||||
"File Content": "Vsebina datoteke",
|
||||
"Start your library": "Začnite svojo knjižnico",
|
||||
"Pick a book from your device to add it to your library.": "Izberite knjigo iz svoje naprave, da jo dodate v svojo knjižnico.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Spustite knjigo kjer koli v tem oknu ali jo izberite iz svojega računalnika.",
|
||||
"Sign in to sync your library": "Prijavite se za sinhronizacijo svoje knjižnice"
|
||||
}
|
||||
|
||||
@@ -148,7 +148,6 @@
|
||||
"Failed to delete cloud backup of the book: {{title}}": "Kunde inte radera molnkopia av bok: {{title}}",
|
||||
"Failed to delete local copy of the book: {{title}}": "Kunde inte radera lokal kopia av bok: {{title}}",
|
||||
"Library Header": "Bibliotekshuvud",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Välkommen till ditt bibliotek. Du kan importera dina böcker här och läsa dem när som helst.",
|
||||
"Copied to notebook": "Kopierat till anteckningsbok",
|
||||
"No annotations to export": "Inga anteckningar att exportera",
|
||||
"Exported from Readest": "Exporterad från Readest",
|
||||
@@ -199,13 +198,9 @@
|
||||
"Header Bar": "Sidhuvud",
|
||||
"View Options": "Visningsalternativ",
|
||||
"Sync Conflict": "Synkkonflikt",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Synka läsframsteg från \"{{deviceName}}\"?",
|
||||
"another device": "annan enhet",
|
||||
"Local Progress": "Lokalt framsteg",
|
||||
"Remote Progress": "Fjärrframsteg",
|
||||
"Failed to connect": "Kunde inte ansluta",
|
||||
"Disconnected": "Frånkopplad",
|
||||
"KOReader Sync Settings": "KOReader-synkinställningar",
|
||||
"Sync as {{userDisplayName}}": "Synka som {{userDisplayName}}",
|
||||
"Sync Server Connected": "Synkserver ansluten",
|
||||
"Sync Strategy": "Synkstrategi",
|
||||
@@ -214,7 +209,6 @@
|
||||
"Send changes only": "Skicka endast ändringar",
|
||||
"Receive changes only": "Ta endast emot ändringar",
|
||||
"Checksum Method": "Kontrollsummemetod",
|
||||
"File Content (recommended)": "Filinnehåll (rekommenderas)",
|
||||
"File Name": "Filnamn",
|
||||
"Device Name": "Enhetsnamn",
|
||||
"Connect to your KOReader Sync server.": "Anslut till din KOReader-synkserver.",
|
||||
@@ -301,7 +295,6 @@
|
||||
"Separate Cover Page": "Separat omslagssida",
|
||||
"Scrolled Mode": "Rullningsläge",
|
||||
"Sign in to Sync": "Logga in för synk",
|
||||
"Synced at {{time}}": "Synkad {{time}}",
|
||||
"Never synced": "Aldrig synkad",
|
||||
"Invert Image In Dark Mode": "Invertera bild i mörkt läge",
|
||||
"Reading Progress Synced": "Läsframsteg synkat",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "Genomstrykning",
|
||||
"Squiggly": "Vågig linje",
|
||||
"Outline": "Kontur",
|
||||
"Save Current Color": "Spara aktuell färg",
|
||||
"Quick Colors": "Snabba färger",
|
||||
"Highlighter": "Markeringspenna",
|
||||
"Save Book Cover": "Spara bokomslag",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "Anteckna text efter markering",
|
||||
"Search text after selection": "Sök text efter markering",
|
||||
"Look up text in dictionary after selection": "Slå upp text i ordbok efter markering",
|
||||
"Look up text in Wikipedia after selection": "Slå upp text i Wikipedia efter markering",
|
||||
"Translate text after selection": "Översätt text efter markering",
|
||||
"Read text aloud after selection": "Läs upp text efter markering",
|
||||
"Proofread text after selection": "Korrekturläs text efter markering",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "Det gick inte att exportera boken.",
|
||||
"Export Book": "Exportera bok",
|
||||
"Whole word:": "Hela ordet:",
|
||||
"Error": "Fel",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Kan inte ladda artikeln. Försök söka direkt på {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Kan inte ladda ordet. Försök söka direkt på {{link}}.",
|
||||
"Date Published": "Publiceringsdatum",
|
||||
"Only for TTS:": "Endast för TTS:",
|
||||
"Uploaded": "Uppladdad",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "Ogiltig Readwise-åtkomsttoken",
|
||||
"Disconnected from Readwise": "Frånkopplad från Readwise",
|
||||
"Never": "Aldrig",
|
||||
"Readwise Settings": "Readwise-inställningar",
|
||||
"Connected to Readwise": "Ansluten till Readwise",
|
||||
"Last synced: {{time}}": "Senast synkroniserad: {{time}}",
|
||||
"Sync Enabled": "Synkronisering aktiverad",
|
||||
"Disconnect": "Koppla från",
|
||||
"Connect your Readwise account to sync highlights.": "Anslut ditt Readwise-konto för att synkronisera markeringar.",
|
||||
"Get your access token at": "Hämta din åtkomsttoken på",
|
||||
"Access Token": "Åtkomsttoken",
|
||||
"Paste your Readwise access token": "Klistra in din Readwise-åtkomsttoken",
|
||||
"Config": "Konfiguration",
|
||||
"Readwise Sync": "Readwise-synkronisering",
|
||||
"Push Highlights": "Skicka markeringar",
|
||||
"Highlights synced to Readwise": "Markeringar synkroniserade till Readwise",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "Kopiera urval",
|
||||
"Translate Selection": "Översätt urval",
|
||||
"Dictionary Lookup": "Slå upp i ordbok",
|
||||
"Wikipedia Lookup": "Slå upp på Wikipedia",
|
||||
"Read Aloud Selection": "Läs upp urval",
|
||||
"Proofread Selection": "Korrekturläs urval",
|
||||
"Open Settings": "Öppna inställningar",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "Dra för att söka",
|
||||
"Punctuation Delay": "Skiljeteckenfördröjning",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Bekräfta att denna OPDS-anslutning kommer att dirigeras via Readest-servrar i webbappen innan du fortsätter.",
|
||||
"Custom Headers": "Anpassade rubriker",
|
||||
"Custom Headers (optional)": "Anpassade rubriker (valfritt)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Lägg till en rubrik per rad med formatet \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Jag förstår att denna OPDS-anslutning kommer att dirigeras via Readest-servrar i webbappen. Om jag inte litar på Readest med dessa autentiseringsuppgifter eller rubriker bör jag använda den inbyggda appen istället.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Kan inte ansluta till Hardcover. Kontrollera din nätverksanslutning.",
|
||||
"Invalid Hardcover API token": "Ogiltig Hardcover API-token",
|
||||
"Disconnected from Hardcover": "Frånkopplad från Hardcover",
|
||||
"Hardcover Settings": "Hardcover-inställningar",
|
||||
"Connected to Hardcover": "Ansluten till Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Anslut ditt Hardcover-konto för att synkronisera läsframsteg och anteckningar.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Hämta din API-token från hardcover.app → Inställningar → API.",
|
||||
"API Token": "API-token",
|
||||
"Paste your Hardcover API token": "Klistra in din Hardcover API-token",
|
||||
"Hardcover sync enabled for this book": "Hardcover-synkronisering aktiverad för den här boken",
|
||||
"Hardcover sync disabled for this book": "Hardcover-synkronisering inaktiverad för den här boken",
|
||||
"Hardcover Sync": "Hardcover-synkronisering",
|
||||
"Enable for This Book": "Aktivera för den här boken",
|
||||
"Push Notes": "Skicka anteckningar",
|
||||
"Enable Hardcover sync for this book first.": "Aktivera först Hardcover-synkronisering för den här boken.",
|
||||
"No annotations or excerpts to sync for this book.": "Inga anteckningar eller utdrag att synkronisera för den här boken.",
|
||||
"Configure Hardcover in Settings first.": "Konfigurera först Hardcover i inställningarna.",
|
||||
"No new Hardcover note changes to sync.": "Inga nya ändringar av Hardcover-anteckningar att synkronisera.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "Dela bindestreck",
|
||||
"Apply Theme Colors to PDF": "Tillämpa temafärger på PDF",
|
||||
"Name": "Namn",
|
||||
"Unavailable": "Inte tillgängligt",
|
||||
"Remove": "Ta bort",
|
||||
"Edit OPDS Catalog": "Redigera OPDS-katalog",
|
||||
"Save Changes": "Spara ändringar",
|
||||
"Use Book Layout": "Använd bokens layout"
|
||||
"Use Book Layout": "Använd bokens layout",
|
||||
"End of this section. Continue to the next.": "Slut på det här avsnittet. Fortsätt till nästa.",
|
||||
"Auto-download": "Autoladda ner",
|
||||
"Auto-download new items": "Hämta nya objekt automatiskt",
|
||||
"Automatically download new publications when the app syncs": "Hämta nya publikationer automatiskt när appen synkroniserar",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "{{count}} nytt objekt nedladdat från OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "{{count}} nya objekt nedladdade från OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Det gick inte att synkronisera {{count}} OPDS-katalog",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Det gick inte att synkronisera {{count}} OPDS-kataloger",
|
||||
"Last synced {{when}}": "Senast synkroniserad {{when}}",
|
||||
"Failed downloads": "Misslyckade hämtningar",
|
||||
"No failed downloads": "Inga misslyckade hämtningar",
|
||||
"Attempts: {{count}}_one": "Försök: {{count}}",
|
||||
"Attempts: {{count}}_other": "Försök: {{count}}",
|
||||
"Skip": "Hoppa över",
|
||||
"Skip all": "Hoppa över alla",
|
||||
"Retry all": "Försök igen för alla",
|
||||
"{{count}} failed_one": "{{count}} misslyckades",
|
||||
"{{count}} failed_other": "{{count}} misslyckades",
|
||||
"(none)": "(ingen)",
|
||||
"Identifiers": "Identifierare",
|
||||
"Read (Stream)": "Läs (ström)",
|
||||
"Failed to start stream": "Det gick inte att starta strömmen",
|
||||
"No dictionaries enabled": "Inga ordböcker aktiverade",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Aktivera en ordbok i Inställningar → Språk → Ordböcker.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Dra för att ändra ordning",
|
||||
"Built-in": "Inbyggt",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Paketet saknas på den här enheten. Importera igen för att använda.",
|
||||
"This dictionary format is not supported.": "Det här ordboksformatet stöds inte.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} ordbok importerad",
|
||||
"Imported {{count}} dictionary_other": "{{count}} ordböcker importerade",
|
||||
"Skipped incomplete bundles: {{names}}": "Ofullständiga paket hoppades över: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Misslyckades att importera ordbok: {{message}}",
|
||||
"Dictionaries": "Ordböcker",
|
||||
"Delete Dictionary": "Ta bort ordbok",
|
||||
"Importing…": "Importerar…",
|
||||
"Import Dictionary": "Importera ordbok",
|
||||
"No dictionaries available.": "Inga ordböcker tillgängliga.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict-paket kräver .ifo-, .idx- och .dict.dz-filer (.syn valfri).",
|
||||
"Select all the bundle files together when importing.": "Markera alla paketfiler tillsammans när du importerar.",
|
||||
"Manage Dictionaries": "Hantera ordböcker",
|
||||
"Select Dictionary Files": "Välj ordboksfiler",
|
||||
"Read on Wikipedia →": "Läs på Wikipedia →",
|
||||
"This link can't be opened": "Det går inte att öppna länken",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Anteckningslänken saknar nödvändig information. Den ursprungliga länken kan ha kapats.",
|
||||
"Go to Readest": "Gå till Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Öppen källkods e-bokläsare för alla, på alla enheter.",
|
||||
"Open in Readest": "Öppna i Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Om Readest inte öppnades automatiskt, välj ett alternativ nedan:",
|
||||
"Continue reading where you left off.": "Fortsätt läsa där du slutade.",
|
||||
"Readest logo": "Readest-logotyp",
|
||||
"Opening Readest...": "Öppnar Readest…",
|
||||
"Open in Readest app": "Öppna i Readest-appen",
|
||||
"Continue in browser": "Fortsätt i webbläsaren",
|
||||
"Don't have Readest?": "Saknar du Readest?",
|
||||
"Book not in your library": "Boken finns inte i ditt bibliotek",
|
||||
"Share Book": "Dela bok",
|
||||
"Could not create share link": "Det gick inte att skapa delningslänken",
|
||||
"Link copied": "Länk kopierad",
|
||||
"Could not copy link": "Det gick inte att kopiera länken",
|
||||
"Share revoked": "Delning återkallad",
|
||||
"Could not revoke share": "Det gick inte att återkalla delningen",
|
||||
"Uploading book…": "Laddar upp bok…",
|
||||
"Generating…": "Genererar…",
|
||||
"Generate share link": "Skapa delningslänk",
|
||||
"Share URL": "Delnings-URL",
|
||||
"Copy link": "Kopiera länk",
|
||||
"Copied": "Kopierad",
|
||||
"Share via…": "Dela via…",
|
||||
"Expires {{date}}": "Upphör {{date}}",
|
||||
"Revoking…": "Återkallar…",
|
||||
"Revoke share": "Återkalla delning",
|
||||
"Sign in to share books": "Logga in för att dela böcker",
|
||||
"Expiring soon": "Upphör snart",
|
||||
"Missing share token": "Delningstoken saknas",
|
||||
"Could not add to your library": "Det gick inte att lägga till i ditt bibliotek",
|
||||
"This share link is no longer available": "Den här delningslänken är inte längre tillgänglig",
|
||||
"The original link may have expired or been revoked.": "Den ursprungliga länken kan ha löpt ut eller återkallats.",
|
||||
"Get Readest": "Hämta Readest",
|
||||
"Loading shared book…": "Laddar delad bok…",
|
||||
"Adding…": "Lägger till…",
|
||||
"Add to my library": "Lägg till i mitt bibliotek",
|
||||
"Could not load your shares": "Det gick inte att ladda dina delningar",
|
||||
"Revoked": "Återkallad",
|
||||
"Expired": "Upphörd",
|
||||
"Shared books": "Delade böcker",
|
||||
"You haven't shared any books yet": "Du har inte delat några böcker än",
|
||||
"Open a book and tap Share to send it to a friend.": "Öppna en bok och tryck på Dela för att skicka den till en vän.",
|
||||
"{{count}} active_one": "{{count}} aktiv",
|
||||
"{{count}} active_other": "{{count}} aktiva",
|
||||
"{{count}} downloads_one": "{{count}} nedladdning",
|
||||
"{{count}} downloads_other": "{{count}} nedladdningar",
|
||||
"starts at saved page": "börjar på sparad sida",
|
||||
"More actions": "Fler åtgärder",
|
||||
"Loading…": "Laddar…",
|
||||
"Load more": "Ladda mer",
|
||||
"Could not load shared book": "Det gick inte att ladda den delade boken",
|
||||
"The share link is missing required information.": "Delningslänken saknar nödvändig information.",
|
||||
"Please check your connection and try again.": "Kontrollera din anslutning och försök igen.",
|
||||
"Sign in to import shared books": "Logga in för att importera delade böcker",
|
||||
"Already in your library": "Finns redan i ditt bibliotek",
|
||||
"Added to your library": "Tillagd i ditt bibliotek",
|
||||
"Could not import shared book": "Det gick inte att importera den delade boken",
|
||||
"Manage Shared Links": "Hantera delningslänkar",
|
||||
"Expires in": "Upphör om",
|
||||
"{{count}} days_one": "1 dag",
|
||||
"{{count}} days_other": "{{count}} dagar",
|
||||
"Expires in {{count}} days_one": "Upphör om 1 dag",
|
||||
"Expires in {{count}} days_other": "Upphör om {{count}} dagar",
|
||||
"Expires in {{count}} hours_one": "Upphör om 1 timme",
|
||||
"Expires in {{count}} hours_other": "Upphör om {{count}} timmar",
|
||||
"Open in app": "Öppna i appen",
|
||||
"Shared with you": "Delat med dig",
|
||||
"Downloading… {{percent}}%": "Laddar ner… {{percent}} %",
|
||||
"Import progress": "Importförlopp",
|
||||
"Share reading progress": "Dela läsförloppet",
|
||||
"Includes your reading progress": "Inkluderar ditt läsförlopp",
|
||||
"Synced {{time}}": "Synkroniserades {{time}}",
|
||||
"Sync Info": "Synkroniseringsinformation",
|
||||
"Last Synced": "Senast synkroniserad",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT-paket kräver en .index-fil och en .dict.dz-fil.",
|
||||
"Slob bundles need a .slob file.": "Slob-paket kräver en .slob-fil.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL-mallen måste börja med http(s):// och innehålla %WORD%.",
|
||||
"Web": "Webb",
|
||||
"Add Web Search": "Lägg till webbsökning",
|
||||
"Edit Web Search": "Redigera webbsökning",
|
||||
"e.g. Google": "t.ex. Google",
|
||||
"URL Template": "URL-mall",
|
||||
"Use %WORD% where the looked-up word should appear.": "Använd %WORD% där det uppslagna ordet ska visas.",
|
||||
"Open the search result in your browser:": "Öppna sökresultatet i din webbläsare:",
|
||||
"Open in {{name}}": "Öppna i {{name}}",
|
||||
"Book Fingerprint": "Bokens fingeravtryck",
|
||||
"Search the web": "Sök på webben",
|
||||
"App deeplink (readest://)": "App-djuplänk (readest://)",
|
||||
"Universal web link (https://)": "Universell webblänk (https://)",
|
||||
"Name cannot be empty.": "Namnet får inte vara tomt.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} befintlig ordbok ersatt",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} befintliga ordböcker ersatta",
|
||||
"Cancel Edit": "Avbryt redigering",
|
||||
"Edit Dictionary": "Redigera ordbok",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict-paket använder .mdx-filer; medföljande .mdd- och .css-filer är valfria.",
|
||||
"Dictionary name": "Ordbokens namn",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Det här ljudet kan inte spelas upp här — ordboken använder ett föråldrat format. Prova en ordbok med Opus-, MP3- eller WAV-ljud.",
|
||||
"File uploaded: {{title}}": "Fil uppladdad: {{title}}",
|
||||
"File downloaded: {{title}}": "Fil nedladdad: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Raderade molnkopia av fil: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Kunde inte ladda upp fil: {{title}}",
|
||||
"Failed to download file: {{title}}": "Kunde inte ladda ner fil: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Kunde inte radera molnkopia av fil: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}} % använt",
|
||||
"Set PIN…": "Ange PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Kräv en 4-siffrig PIN för att öppna Readest",
|
||||
"Change PIN…": "Ändra PIN…",
|
||||
"Disable PIN…": "Inaktivera PIN…",
|
||||
"Sync passphrase ready": "Synkroniseringslösenfras redo",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Detta tar permanent bort de krypterade autentiseringsuppgifterna som vi synkroniserar (t.ex. lösenord för OPDS-kataloger) på alla enheter. Lokala kopior bevaras. Du behöver ange synkroniseringslösenfrasen igen eller välja en ny. Fortsätta?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Synkroniseringslösenfrasen glömdes — alla krypterade fält rensade",
|
||||
"Sync passphrase": "Synkroniseringslösenfras",
|
||||
"Set passphrase": "Ange lösenfras",
|
||||
"Forgot passphrase": "Glömt lösenfras",
|
||||
"Incorrect PIN": "Felaktig PIN",
|
||||
"App locked": "Appen är låst",
|
||||
"Enter your PIN": "Ange din PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest är låst. Ange din 4-siffriga PIN för att fortsätta.",
|
||||
"PIN code": "PIN-kod",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Om du glömmer din PIN låses du ute från den här enheten. Du måste rensa appens data för att återställa den.",
|
||||
"Passphrase must be at least 8 characters": "Lösenfrasen måste vara minst 8 tecken",
|
||||
"Passphrases do not match": "Lösenfraserna matchar inte",
|
||||
"Set sync passphrase": "Ange synkroniseringslösenfras",
|
||||
"Enter sync passphrase": "Ange synkroniseringslösenfras",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "En synkroniseringslösenfras krypterar dina känsliga fält (som OPDS-katalogautentiseringsuppgifter) innan de synkroniseras. Vi ser aldrig den här lösenfrasen. Välj något minnesvärt — det går inte att återställa utan den.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Ange synkroniseringslösenfrasen du angav på en annan enhet för att dekryptera dina synkroniserade autentiseringsuppgifter.",
|
||||
"Confirm passphrase": "Bekräfta lösenfras",
|
||||
"Unlock": "Lås upp",
|
||||
"Set PIN": "Ange PIN",
|
||||
"Change PIN": "Ändra PIN",
|
||||
"Disable PIN": "Inaktivera PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Ange din nuvarande PIN och välj sedan en ny 4-siffrig PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Ange din nuvarande PIN för att inaktivera applåset.",
|
||||
"PIN must be {{length}} digits": "PIN måste vara {{length}} siffror",
|
||||
"PINs do not match": "PIN-koderna stämmer inte överens",
|
||||
"Current PIN": "Nuvarande PIN",
|
||||
"New PIN": "Ny PIN",
|
||||
"Confirm new PIN": "Bekräfta ny PIN",
|
||||
"Manage Sync": "Hantera synkronisering",
|
||||
"Imported book files and library metadata": "Importerade bokfiler och biblioteksmetadata",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Senast lästa position, bokmärken och inställningar per bok",
|
||||
"Highlights and notes": "Markeringar och anteckningar",
|
||||
"Fonts": "Teckensnitt",
|
||||
"Custom font files": "Anpassade teckensnittsfiler",
|
||||
"Backgrounds": "Bakgrunder",
|
||||
"Custom background textures": "Anpassade bakgrundstexturer",
|
||||
"OPDS catalogs": "OPDS-kataloger",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Sparade katalog-URL:er och (krypterade) inloggningsuppgifter",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Fel synklösenfras — synkroniserade inloggningsuppgifter kunde inte dekrypteras",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Synklösenfrasdata på servern återställdes. Krypterar om dina inloggningsuppgifter med den nya lösenfrasen…",
|
||||
"Failed to decrypt synced credentials": "Det gick inte att dekryptera synkroniserade inloggningsuppgifter",
|
||||
"Imported dictionary bundles and settings": "Importerade ordbokspaket och inställningar",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Välj vad som synkroniseras mellan dina enheter. Att inaktivera en kategori gör att den här enheten slutar skicka eller ta emot poster av den typen. Det som redan finns på servern lämnas orört, och när du aktiverar igen fortsätter synkroniseringen där du slutade.",
|
||||
"Data Sync": "Datasynkronisering",
|
||||
"Manage Fonts": "Hantera teckensnitt",
|
||||
"App settings": "Appinställningar",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, markeringsfärger, integrationer (KOSync, Readwise, Hardcover) och ordbokens ordning",
|
||||
"Required while Dictionaries sync is enabled": "Krävs så länge synkronisering av Ordböcker är aktiverad",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Återställs om {{hours}} tim {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Välj en 4-siffrig PIN-kod. Du kommer att behöva ange den varje gång du öppnar Readest. Det finns inget sätt att återställa en glömd PIN-kod. Att rensa appdata är det enda sättet att återställa den.",
|
||||
"Credentials": "Inloggningsuppgifter",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, användarnamn och lösenord för OPDS, KOReader, Hardcover och Readwise. När inaktiverat förblir inloggningsuppgifterna endast på denna enhet och laddas aldrig upp.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Känsliga synkroniserade fält krypteras före uppladdning. Ange en lösenfras nu eller senare när kryptering behövs.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Sparad på det här kontot. Du blir tillfrågad när inloggningsuppgifter ska dekrypteras.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Läsförloppet på den här enheten skiljer sig från \"{{deviceName}}\".",
|
||||
"This device": "Den här enheten",
|
||||
"Red": "Röd",
|
||||
"Yellow": "Gul",
|
||||
"Green": "Grön",
|
||||
"Blue": "Blå",
|
||||
"Violet": "Violett",
|
||||
"Edit color": "Redigera färg",
|
||||
"Add custom color": "Lägg till anpassad färg",
|
||||
"Add label": "Lägg till etikett",
|
||||
"Choose color": "Välj färg",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Ansluten till Hardcover. Senast synkroniserad {{time}}.",
|
||||
"Integrations": "Integrationer",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Ansluten till Readwise. Senast synkroniserad {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Bläddra i och ladda ner böcker från onlinekataloger.",
|
||||
"Connected as {{user}}": "Ansluten som {{user}}",
|
||||
"Not connected": "Inte ansluten",
|
||||
"{{count}} catalog_one": "{{count}} katalog",
|
||||
"{{count}} catalog_other": "{{count}} kataloger",
|
||||
"No catalogs": "Inga kataloger",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Anslut Readest till externa tjänster för synkronisering, markeringar och kataloger.",
|
||||
"Reading Sync": "Lässynkronisering",
|
||||
"Content Sources": "Innehållskällor",
|
||||
"Scroll tabs": "Bläddra mellan flikar",
|
||||
"Catalog actions": "Katalogåtgärder",
|
||||
"File Content": "Filinnehåll",
|
||||
"Start your library": "Starta ditt bibliotek",
|
||||
"Pick a book from your device to add it to your library.": "Välj en bok från din enhet att lägga till i ditt bibliotek.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Släpp en bok var som helst på det här fönstret, eller välj en från din dator.",
|
||||
"Sign in to sync your library": "Logga in för att synkronisera ditt bibliotek"
|
||||
}
|
||||
|
||||
@@ -117,7 +117,6 @@
|
||||
"Failed to delete book: {{title}}": "புத்தகத்தை நீக்க முடியவில்லை: {{title}}",
|
||||
"Failed to delete cloud backup of the book: {{title}}": "புத்தகத்தின் cloud backup நீக்க முடியவில்லை: {{title}}",
|
||||
"Failed to delete local copy of the book: {{title}}": "புத்தகத்தின் உள்ளூர் நகல் நீக்க முடியவில்லை: {{title}}",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "உங்கள் நூலகத்திற்கு வரவேற்கிறோம். நீங்கள் இங்கே உங்கள் புத்தகங்களை இறக்குமதி செய்து எப்போது வேண்டுமானாலும் படிக்கலாம்.",
|
||||
"Copied to notebook": "குறிப்பேட்டில் நகலெடுக்கப்பட்டது",
|
||||
"No annotations to export": "ஏற்றுமதி செய்ய குறிப்புகள் இல்லை",
|
||||
"Exported from Readest": "Readest இல் இருந்து ஏற்றுமதி செய்யப்பட்டது",
|
||||
@@ -155,13 +154,9 @@
|
||||
"Small": "சிறிய",
|
||||
"Large": "பெரிய",
|
||||
"Sync Conflict": "ஒத்திசைவு முரண்பாடு",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "\"{{deviceName}}\" இல் இருந்து வாசிப்பு முன்னேற்றத்தை ஒத்திசைக்கவா?",
|
||||
"another device": "மற்றொரு சாதனம்",
|
||||
"Local Progress": "உள்ளூர் முன்னேற்றம்",
|
||||
"Remote Progress": "தொலை முன்னேற்றம்",
|
||||
"Failed to connect": "இணைக்க முடியவில்லை",
|
||||
"Disconnected": "துண்டிக்கப்பட்டது",
|
||||
"KOReader Sync Settings": "KOReader ஒத்திசைவு அமைப்புகள்",
|
||||
"Sync as {{userDisplayName}}": "{{userDisplayName}} ஆக ஒத்திசைக்கவும்",
|
||||
"Sync Server Connected": "ஒத்திசைவு சர்வர் இணைக்கப்பட்டது",
|
||||
"Sync Strategy": "ஒத்திசைவு உத்தி",
|
||||
@@ -170,7 +165,6 @@
|
||||
"Send changes only": "மாற்றங்களை மட்டும் அனுப்பவும்",
|
||||
"Receive changes only": "மாற்றங்களை மட்டும் பெறவும்",
|
||||
"Checksum Method": "சரிபார்ப்பு முறை",
|
||||
"File Content (recommended)": "கோப்பு உள்ளடக்கம் (பரிந்துரைக்கப்பட்டது)",
|
||||
"File Name": "கோப்பு பெயர்",
|
||||
"Device Name": "சாதன பெயர்",
|
||||
"Connect to your KOReader Sync server.": "உங்கள் KOReader ஒத்திசைவு சர்வருடன் இணையவும்.",
|
||||
@@ -330,7 +324,6 @@
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: 1 குரல்",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} குரல்கள்",
|
||||
"Sign in to Sync": "ஒத்திசைக்க உள்நுழையவும்",
|
||||
"Synced at {{time}}": "{{time}} இல் ஒத்திசைக்கப்பட்டது",
|
||||
"Never synced": "ஒத்திசைக்கப்படவில்லை",
|
||||
"Reading Progress Synced": "வாசிப்பு முன்னேற்றம் ஒத்திசைக்கப்பட்டது",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "{{total}} இல் {{page}} பக்கம் ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "குறிக்கோடு",
|
||||
"Squiggly": "சுருள் கோடு",
|
||||
"Outline": "வட்டம்",
|
||||
"Save Current Color": "தற்போதைய நிறத்தை சேமிக்கவும்",
|
||||
"Quick Colors": "விரைவு நிறங்கள்",
|
||||
"Highlighter": "ஹைலைட்டர்",
|
||||
"Save Book Cover": "புத்தகக் கோப்பைச் சேமிக்கவும்",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "உரையை தேர்வுக்குப் பிறகு கருத்துரை இடு",
|
||||
"Search text after selection": "உரையை தேர்வுக்குப் பிறகு தேடு",
|
||||
"Look up text in dictionary after selection": "தேர்வுக்குப் பிறகு அகராதியில் உரையைத் தேடு",
|
||||
"Look up text in Wikipedia after selection": "தேர்வுக்குப் பிறகு விக்கிப்பீடியாவில் உரையைத் தேடு",
|
||||
"Translate text after selection": "தேர்வுக்குப் பிறகு உரையை மொழிபெயர்",
|
||||
"Read text aloud after selection": "தேர்வுக்குப் பிறகு உரையை ஓதுக",
|
||||
"Proofread text after selection": "தேர்வுக்குப் பிறகு உரையை திருத்துக",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "புத்தகத்தை ஏற்றுமதி செய்ய இயலவில்லை.",
|
||||
"Export Book": "புத்தகத்தை ஏற்றுமதி செய்",
|
||||
"Whole word:": "முழு சொல்:",
|
||||
"Error": "பிழை",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "கட்டுரையை ஏற்ற முடியவில்லை. நேரடியாக {{link}} இல் தேடவும்.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "சொல்லை ஏற்ற முடியவில்லை. நேரடியாக {{link}} இல் தேடவும்.",
|
||||
"Date Published": "வெளியீட்டு தேதி",
|
||||
"Only for TTS:": "TTS க்கு மட்டும்:",
|
||||
"Uploaded": "பதிவேற்றப்பட்டது",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "தவறான Readwise அணுகல் டோக்கன்",
|
||||
"Disconnected from Readwise": "Readwise இலிருந்து துண்டிக்கப்பட்டது",
|
||||
"Never": "ஒருபோதும் இல்லை",
|
||||
"Readwise Settings": "Readwise அமைப்புகள்",
|
||||
"Connected to Readwise": "Readwise உடன் இணைக்கப்பட்டது",
|
||||
"Last synced: {{time}}": "கடைசியாக ஒத்திசைக்கப்பட்டது: {{time}}",
|
||||
"Sync Enabled": "ஒத்திசைவு இயக்கப்பட்டது",
|
||||
"Disconnect": "துண்டி",
|
||||
"Connect your Readwise account to sync highlights.": "சிறப்பம்சங்களை ஒத்திசைக்க உங்கள் Readwise கணக்கை இணைக்கவும்.",
|
||||
"Get your access token at": "உங்கள் அணுகல் டோக்கனை இங்கே பெறவும்",
|
||||
"Access Token": "அணுகல் டோக்கன்",
|
||||
"Paste your Readwise access token": "உங்கள் Readwise அணுகல் டோக்கனை ஒட்டவும்",
|
||||
"Config": "கட்டமைப்பு",
|
||||
"Readwise Sync": "Readwise ஒத்திசைவு",
|
||||
"Push Highlights": "சிறப்பம்சங்களை அனுப்பு",
|
||||
"Highlights synced to Readwise": "சிறப்பம்சங்கள் Readwise உடன் ஒத்திசைக்கப்பட்டன",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "தேர்வை நகலெடுக்கவும்",
|
||||
"Translate Selection": "தேர்வை மொழிபெயர்க்கவும்",
|
||||
"Dictionary Lookup": "அகராதியில் தேடுக",
|
||||
"Wikipedia Lookup": "விக்கிப்பீடியாவில் தேடுக",
|
||||
"Read Aloud Selection": "தேர்வை சத்தமாக படிக்கவும்",
|
||||
"Proofread Selection": "தேர்வை சரிபார்க்கவும்",
|
||||
"Open Settings": "அமைப்புகளைத் திறக்கவும்",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "தேட இழுக்கவும்",
|
||||
"Punctuation Delay": "நிறுத்தக்குறி தாமதம்",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "தொடர்வதற்கு முன், இந்த OPDS இணைப்பு வலை பயன்பாட்டில் Readest சேவையகங்கள் வழியாக ப்ராக்ஸி செய்யப்படும் என்பதை உறுதிப்படுத்தவும்.",
|
||||
"Custom Headers": "தனிப்பயன் தலைப்புகள்",
|
||||
"Custom Headers (optional)": "தனிப்பயன் தலைப்புகள் (விரும்பினால்)",
|
||||
"Add one header per line using \"Header-Name: value\".": "\"Header-Name: value\" வடிவமைப்பைப் பயன்படுத்தி ஒவ்வொரு வரியிலும் ஒரு தலைப்பைச் சேர்க்கவும்.",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "இந்த OPDS இணைப்பு வலை பயன்பாட்டில் Readest சேவையகங்கள் வழியாக ப்ராக்ஸி செய்யப்படும் என்பதை நான் புரிந்துகொள்கிறேன். இந்த சான்றுகள் அல்லது தலைப்புகளுடன் Readest-ஐ நம்பவில்லை என்றால், நான் நேட்டிவ் பயன்பாட்டைப் பயன்படுத்த வேண்டும்.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcover உடன் இணைக்க முடியவில்லை. உங்கள் நெட்வொர்க் இணைப்பைச் சரிபார்க்கவும்.",
|
||||
"Invalid Hardcover API token": "தவறான Hardcover API டோக்கன்",
|
||||
"Disconnected from Hardcover": "Hardcover இலிருந்து துண்டிக்கப்பட்டது",
|
||||
"Hardcover Settings": "Hardcover அமைப்புகள்",
|
||||
"Connected to Hardcover": "Hardcover உடன் இணைக்கப்பட்டது",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "வாசிப்பு முன்னேற்றம் மற்றும் குறிப்புகளை ஒத்திசைக்க உங்கள் Hardcover கணக்கை இணைக்கவும்.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "hardcover.app → அமைப்புகள் → API இலிருந்து உங்கள் API டோக்கனைப் பெறவும்.",
|
||||
"API Token": "API டோக்கன்",
|
||||
"Paste your Hardcover API token": "உங்கள் Hardcover API டோக்கனை ஒட்டவும்",
|
||||
"Hardcover sync enabled for this book": "இந்த புத்தகத்திற்கு Hardcover ஒத்திசைவு இயக்கப்பட்டது",
|
||||
"Hardcover sync disabled for this book": "இந்த புத்தகத்திற்கு Hardcover ஒத்திசைவு முடக்கப்பட்டது",
|
||||
"Hardcover Sync": "Hardcover ஒத்திசைவு",
|
||||
"Enable for This Book": "இந்த புத்தகத்திற்கு இயக்கு",
|
||||
"Push Notes": "குறிப்புகளை அனுப்பு",
|
||||
"Enable Hardcover sync for this book first.": "முதலில் இந்த புத்தகத்திற்கு Hardcover ஒத்திசைவை இயக்கவும்.",
|
||||
"No annotations or excerpts to sync for this book.": "இந்த புத்தகத்திற்கு ஒத்திசைக்க குறிப்புகள் அல்லது பகுதிகள் இல்லை.",
|
||||
"Configure Hardcover in Settings first.": "முதலில் அமைப்புகளில் Hardcover-ஐ கட்டமைக்கவும்.",
|
||||
"No new Hardcover note changes to sync.": "ஒத்திசைக்க புதிய Hardcover குறிப்பு மாற்றங்கள் இல்லை.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "ஹைபன்களைப் பிரி",
|
||||
"Apply Theme Colors to PDF": "PDF-க்கு தீம் நிறங்களைப் பயன்படுத்து",
|
||||
"Name": "பெயர்",
|
||||
"Unavailable": "கிடைக்கவில்லை",
|
||||
"Remove": "நீக்கு",
|
||||
"Edit OPDS Catalog": "OPDS பட்டியலைத் திருத்து",
|
||||
"Save Changes": "மாற்றங்களைச் சேமி",
|
||||
"Use Book Layout": "புத்தகத்தின் அமைப்பைப் பயன்படுத்து"
|
||||
"Use Book Layout": "புத்தகத்தின் அமைப்பைப் பயன்படுத்து",
|
||||
"End of this section. Continue to the next.": "இந்தப் பிரிவின் முடிவு. அடுத்ததற்குத் தொடரவும்.",
|
||||
"Auto-download": "தானியங்கி பதிவிறக்கம்",
|
||||
"Auto-download new items": "புதிய உருப்படிகளைத் தானாகப் பதிவிறக்கு",
|
||||
"Automatically download new publications when the app syncs": "பயன்பாடு ஒத்திசைக்கப்படும்போது புதிய வெளியீடுகளைத் தானாகப் பதிவிறக்கு",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "OPDS-இலிருந்து {{count}} புதிய உருப்படி பதிவிறக்கப்பட்டது",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDS-இலிருந்து {{count}} புதிய உருப்படிகள் பதிவிறக்கப்பட்டன",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "{{count}} OPDS பட்டியலை ஒத்திசைக்க முடியவில்லை",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "{{count}} OPDS பட்டியல்களை ஒத்திசைக்க முடியவில்லை",
|
||||
"Last synced {{when}}": "கடைசியாக ஒத்திசைக்கப்பட்டது {{when}}",
|
||||
"Failed downloads": "தோல்வியுற்ற பதிவிறக்கங்கள்",
|
||||
"No failed downloads": "தோல்வியுற்ற பதிவிறக்கங்கள் இல்லை",
|
||||
"Attempts: {{count}}_one": "முயற்சிகள்: {{count}}",
|
||||
"Attempts: {{count}}_other": "முயற்சிகள்: {{count}}",
|
||||
"Skip": "தவிர்",
|
||||
"Skip all": "அனைத்தையும் தவிர்",
|
||||
"Retry all": "அனைத்தையும் மீண்டும் முயற்சி செய்",
|
||||
"{{count}} failed_one": "{{count}} தோல்வி",
|
||||
"{{count}} failed_other": "{{count}} தோல்விகள்",
|
||||
"(none)": "(இல்லை)",
|
||||
"Identifiers": "அடையாளங்காட்டிகள்",
|
||||
"Read (Stream)": "படிக்க (ஸ்ட்ரீம்)",
|
||||
"Failed to start stream": "ஸ்ட்ரீமைத் தொடங்க முடியவில்லை",
|
||||
"No dictionaries enabled": "எந்த அகராதியும் இயக்கப்படவில்லை",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "அமைப்புகள் → மொழி → அகராதிகள் என்பதில் ஒரு அகராதியை இயக்கவும்.",
|
||||
"Wiktionary": "விக்சனரி",
|
||||
"Drag to reorder": "மறு வரிசைப்படுத்த இழுக்கவும்",
|
||||
"Built-in": "உள்ளமைந்த",
|
||||
"Bundle is missing on this device. Re-import to use it.": "இந்தச் சாதனத்தில் தொகுப்பு இல்லை. பயன்படுத்த மீண்டும் இறக்குமதி செய்யவும்.",
|
||||
"This dictionary format is not supported.": "இந்த அகராதி வடிவம் ஆதரிக்கப்படவில்லை.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} அகராதி இறக்குமதி செய்யப்பட்டது",
|
||||
"Imported {{count}} dictionary_other": "{{count}} அகராதிகள் இறக்குமதி செய்யப்பட்டன",
|
||||
"Skipped incomplete bundles: {{names}}": "முழுமையற்ற தொகுப்புகள் தவிர்க்கப்பட்டன: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "அகராதியை இறக்குமதி செய்வதில் தோல்வி: {{message}}",
|
||||
"Dictionaries": "அகராதிகள்",
|
||||
"Delete Dictionary": "அகராதியை நீக்கு",
|
||||
"Importing…": "இறக்குமதி செய்கிறது…",
|
||||
"Import Dictionary": "அகராதியை இறக்குமதி செய்",
|
||||
"No dictionaries available.": "அகராதிகள் கிடைக்கவில்லை.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict தொகுப்புகளுக்கு .ifo, .idx, .dict.dz கோப்புகள் தேவை (.syn விருப்பம்).",
|
||||
"Select all the bundle files together when importing.": "இறக்குமதி செய்யும்போது தொகுப்பின் அனைத்துக் கோப்புகளையும் ஒரே நேரத்தில் தேர்ந்தெடுக்கவும்.",
|
||||
"Manage Dictionaries": "அகராதிகளை நிர்வகி",
|
||||
"Select Dictionary Files": "அகராதிக் கோப்புகளைத் தேர்ந்தெடு",
|
||||
"Read on Wikipedia →": "விக்கிப்பீடியாவில் படிக்க →",
|
||||
"This link can't be opened": "இந்த இணைப்பைத் திறக்க முடியவில்லை",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "குறிப்பு இணைப்பில் தேவையான தகவல் இல்லை. அசல் இணைப்பு வெட்டப்பட்டிருக்கலாம்.",
|
||||
"Go to Readest": "Readest-க்குச் செல்",
|
||||
"Open-source ebook reader for everyone, on every device.": "எல்லோருக்கும், எல்லா சாதனங்களிலும் — திறந்த-மூல மின்னூல் வாசகி.",
|
||||
"Open in Readest": "Readest-இல் திற",
|
||||
"If Readest didn't open automatically, choose an option below:": "Readest தானாகத் திறக்கவில்லை எனில், கீழ் உள்ள விருப்பத்தைத் தேர்ந்தெடுக்கவும்:",
|
||||
"Continue reading where you left off.": "நிறுத்திய இடத்திலிருந்தே வாசிப்பைத் தொடரவும்.",
|
||||
"Readest logo": "Readest சின்னம்",
|
||||
"Opening Readest...": "Readest திறக்கப்படுகிறது…",
|
||||
"Open in Readest app": "Readest பயன்பாட்டில் திற",
|
||||
"Continue in browser": "உலாவியில் தொடரவும்",
|
||||
"Don't have Readest?": "Readest இல்லையா?",
|
||||
"Book not in your library": "புத்தகம் உங்கள் நூலகத்தில் இல்லை",
|
||||
"Share Book": "புத்தகத்தைப் பகிர்",
|
||||
"Could not create share link": "பகிர்வுக் இணைப்பை உருவாக்க முடியவில்லை",
|
||||
"Link copied": "இணைப்பு நகலெடுக்கப்பட்டது",
|
||||
"Could not copy link": "இணைப்பை நகலெடுக்க முடியவில்லை",
|
||||
"Share revoked": "பகிர்வு ரத்து செய்யப்பட்டது",
|
||||
"Could not revoke share": "பகிர்வை ரத்து செய்ய முடியவில்லை",
|
||||
"Uploading book…": "புத்தகத்தை பதிவேற்றுகிறது…",
|
||||
"Generating…": "உருவாக்குகிறது…",
|
||||
"Generate share link": "பகிர்வு இணைப்பை உருவாக்கு",
|
||||
"Share URL": "பகிர்வு URL",
|
||||
"Copy link": "இணைப்பை நகலெடு",
|
||||
"Copied": "நகலெடுக்கப்பட்டது",
|
||||
"Share via…": "மூலம் பகிர்…",
|
||||
"Expires {{date}}": "{{date}} அன்று காலாவதியாகும்",
|
||||
"Revoking…": "ரத்து செய்கிறது…",
|
||||
"Revoke share": "பகிர்வை ரத்து செய்",
|
||||
"Sign in to share books": "புத்தகங்களைப் பகிர உள்நுழையவும்",
|
||||
"Expiring soon": "விரைவில் காலாவதியாகும்",
|
||||
"Missing share token": "பகிர்வு டோக்கன் இல்லை",
|
||||
"Could not add to your library": "உங்கள் நூலகத்தில் சேர்க்க முடியவில்லை",
|
||||
"This share link is no longer available": "இந்தப் பகிர்வு இணைப்பு இனி கிடைக்காது",
|
||||
"The original link may have expired or been revoked.": "அசல் இணைப்பு காலாவதியாகியிருக்கலாம் அல்லது ரத்து செய்யப்பட்டிருக்கலாம்.",
|
||||
"Get Readest": "Readest பெறுக",
|
||||
"Loading shared book…": "பகிரப்பட்ட புத்தகத்தை ஏற்றுகிறது…",
|
||||
"Adding…": "சேர்க்கிறது…",
|
||||
"Add to my library": "எனது நூலகத்தில் சேர்",
|
||||
"Could not load your shares": "உங்கள் பகிர்வுகளை ஏற்ற முடியவில்லை",
|
||||
"Revoked": "ரத்து செய்யப்பட்டது",
|
||||
"Expired": "காலாவதியானது",
|
||||
"Shared books": "பகிரப்பட்ட புத்தகங்கள்",
|
||||
"You haven't shared any books yet": "நீங்கள் இதுவரை எந்தப் புத்தகத்தையும் பகிரவில்லை",
|
||||
"Open a book and tap Share to send it to a friend.": "புத்தகத்தைத் திறந்து நண்பருக்கு அனுப்ப பகிர் என்பதைத் தட்டவும்.",
|
||||
"{{count}} active_one": "{{count}} செயலில்",
|
||||
"{{count}} active_other": "{{count}} செயலில்",
|
||||
"{{count}} downloads_one": "{{count}} பதிவிறக்கம்",
|
||||
"{{count}} downloads_other": "{{count}} பதிவிறக்கங்கள்",
|
||||
"starts at saved page": "சேமிக்கப்பட்ட பக்கத்திலிருந்து தொடங்குகிறது",
|
||||
"More actions": "மேலும் செயல்கள்",
|
||||
"Loading…": "ஏற்றுகிறது…",
|
||||
"Load more": "மேலும் ஏற்று",
|
||||
"Could not load shared book": "பகிரப்பட்ட புத்தகத்தை ஏற்ற முடியவில்லை",
|
||||
"The share link is missing required information.": "பகிர்வு இணைப்பில் தேவையான தகவல் இல்லை.",
|
||||
"Please check your connection and try again.": "உங்கள் இணைப்பை சரிபார்த்து மீண்டும் முயற்சிக்கவும்.",
|
||||
"Sign in to import shared books": "பகிரப்பட்ட புத்தகங்களை இறக்குமதி செய்ய உள்நுழையவும்",
|
||||
"Already in your library": "ஏற்கனவே உங்கள் நூலகத்தில் உள்ளது",
|
||||
"Added to your library": "உங்கள் நூலகத்தில் சேர்க்கப்பட்டது",
|
||||
"Could not import shared book": "பகிரப்பட்ட புத்தகத்தை இறக்குமதி செய்ய முடியவில்லை",
|
||||
"Manage Shared Links": "பகிர்வு இணைப்புகளை நிர்வகி",
|
||||
"Expires in": "காலாவதியாகும்",
|
||||
"{{count}} days_one": "1 நாள்",
|
||||
"{{count}} days_other": "{{count}} நாட்கள்",
|
||||
"Expires in {{count}} days_one": "1 நாளில் காலாவதியாகும்",
|
||||
"Expires in {{count}} days_other": "{{count}} நாட்களில் காலாவதியாகும்",
|
||||
"Expires in {{count}} hours_one": "1 மணிநேரத்தில் காலாவதியாகும்",
|
||||
"Expires in {{count}} hours_other": "{{count}} மணிநேரத்தில் காலாவதியாகும்",
|
||||
"Open in app": "பயன்பாட்டில் திற",
|
||||
"Shared with you": "உங்களுடன் பகிரப்பட்டது",
|
||||
"Downloading… {{percent}}%": "பதிவிறக்கம்… {{percent}}%",
|
||||
"Import progress": "இறக்குமதி முன்னேற்றம்",
|
||||
"Share reading progress": "வாசிப்பு முன்னேற்றத்தைப் பகிரவும்",
|
||||
"Includes your reading progress": "உங்கள் வாசிப்பு முன்னேற்றத்தை உள்ளடக்கியது",
|
||||
"Synced {{time}}": "{{time}} ஒத்திசைக்கப்பட்டது",
|
||||
"Sync Info": "ஒத்திசைவு தகவல்",
|
||||
"Last Synced": "கடைசி ஒத்திசைவு",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT தொகுப்புகளுக்கு ஒரு .index கோப்பு மற்றும் ஒரு .dict.dz கோப்பு தேவை.",
|
||||
"Slob bundles need a .slob file.": "Slob தொகுப்புகளுக்கு ஒரு .slob கோப்பு தேவை.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL வார்ப்புரு http(s):// உடன் தொடங்க வேண்டும் மற்றும் %WORD% இருக்க வேண்டும்.",
|
||||
"Web": "வலை",
|
||||
"Add Web Search": "வலைத் தேடல் சேர்",
|
||||
"Edit Web Search": "வலைத் தேடலைத் திருத்து",
|
||||
"e.g. Google": "எ.கா. Google",
|
||||
"URL Template": "URL வார்ப்புரு",
|
||||
"Use %WORD% where the looked-up word should appear.": "தேடப்பட்ட சொல் தோன்ற வேண்டிய இடத்தில் %WORD% ஐ பயன்படுத்தவும்.",
|
||||
"Open the search result in your browser:": "உங்கள் உலாவியில் தேடல் முடிவைத் திற:",
|
||||
"Open in {{name}}": "{{name}} இல் திற",
|
||||
"Book Fingerprint": "புத்தக கைரேகை",
|
||||
"Search the web": "வலையில் தேடுக",
|
||||
"App deeplink (readest://)": "பயன்பாட்டு ஆழ் இணைப்பு (readest://)",
|
||||
"Universal web link (https://)": "அனைத்துக்கும் பொதுவான வலை இணைப்பு (https://)",
|
||||
"Name cannot be empty.": "பெயரை வெறுமையாக வைக்க இயலாது.",
|
||||
"Replaced {{count}} existing dictionary_one": "ஏற்கனவே உள்ள {{count}} அகராதி மாற்றப்பட்டது",
|
||||
"Replaced {{count}} existing dictionary_other": "ஏற்கனவே உள்ள {{count}} அகராதிகள் மாற்றப்பட்டன",
|
||||
"Cancel Edit": "திருத்துதலை ரத்து செய்",
|
||||
"Edit Dictionary": "அகராதியைத் திருத்து",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict தொகுப்புகள் .mdx கோப்புகளைப் பயன்படுத்துகின்றன; இணைந்த .mdd மற்றும் .css கோப்புகள் விருப்பமானவை.",
|
||||
"Dictionary name": "அகராதியின் பெயர்",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "இந்த ஒலியை இங்கே இயக்க இயலவில்லை — அகராதி காலாவதியான வடிவத்தைப் பயன்படுத்துகிறது. Opus, MP3 அல்லது WAV ஒலி உள்ள ஒன்றை முயற்சிக்கவும்.",
|
||||
"File uploaded: {{title}}": "கோப்பு பதிவேற்றப்பட்டது: {{title}}",
|
||||
"File downloaded: {{title}}": "கோப்பு பதிவிறக்கப்பட்டது: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "கோப்பின் cloud நகல் நீக்கப்பட்டது: {{title}}",
|
||||
"Failed to upload file: {{title}}": "கோப்பை பதிவேற்ற முடியவில்லை: {{title}}",
|
||||
"Failed to download file: {{title}}": "கோப்பை பதிவிறக்க முடியவில்லை: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "கோப்பின் cloud நகலை நீக்க முடியவில்லை: {{title}}",
|
||||
"{{percentage}}% used": "{{percentage}}% பயன்படுத்தப்பட்டது",
|
||||
"Set PIN…": "PIN ஐ அமை…",
|
||||
"Require a 4-digit PIN to open Readest": "Readest ஐ திறக்க 4-இலக்க PIN ஐ கேள்",
|
||||
"Change PIN…": "PIN ஐ மாற்று…",
|
||||
"Disable PIN…": "PIN ஐ முடக்கு…",
|
||||
"Sync passphrase ready": "ஒத்திசைவு கடவுச்சொற்றொடர் தயார்",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "இது ஒவ்வொரு சாதனத்திலும் நாங்கள் ஒத்திசைக்கும் குறியாக்கம் செய்யப்பட்ட சான்றுகளை (எ.கா., OPDS பட்டியல் கடவுச்சொற்கள்) நிரந்தரமாக நீக்குகிறது. உள்ளூர் நகல்கள் பாதுகாக்கப்படுகின்றன. நீங்கள் ஒத்திசைவு கடவுச்சொற்றொடரை மீண்டும் உள்ளிட வேண்டும் அல்லது புதியதை அமைக்க வேண்டும். தொடரவா?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "ஒத்திசைவு கடவுச்சொற்றொடர் மறக்கப்பட்டது — அனைத்து குறியாக்கம் செய்யப்பட்ட புலங்களும் அழிக்கப்பட்டன",
|
||||
"Sync passphrase": "ஒத்திசைவு கடவுச்சொற்றொடர்",
|
||||
"Set passphrase": "கடவுச்சொற்றொடரை அமைக்கவும்",
|
||||
"Forgot passphrase": "கடவுச்சொற்றொடரை மறந்துவிட்டீர்களா",
|
||||
"Incorrect PIN": "தவறான PIN",
|
||||
"App locked": "செயலி பூட்டப்பட்டுள்ளது",
|
||||
"Enter your PIN": "உங்கள் PIN ஐ உள்ளிடவும்",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest பூட்டப்பட்டுள்ளது. தொடர உங்கள் 4-இலக்க PIN ஐ உள்ளிடவும்.",
|
||||
"PIN code": "PIN குறியீடு",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PIN ஐ மறந்தால் இந்த சாதனத்திலிருந்து நீங்கள் வெளியேற்றப்படுவீர்கள். அதை மீட்டமைக்க செயலியின் தரவை அழிக்க வேண்டும்.",
|
||||
"Passphrase must be at least 8 characters": "கடவுச்சொற்றொடர் குறைந்தது 8 எழுத்துகளாக இருக்க வேண்டும்",
|
||||
"Passphrases do not match": "கடவுச்சொற்றொடர்கள் பொருந்தவில்லை",
|
||||
"Set sync passphrase": "ஒத்திசைவு கடவுச்சொற்றொடரை அமைக்கவும்",
|
||||
"Enter sync passphrase": "ஒத்திசைவு கடவுச்சொற்றொடரை உள்ளிடவும்",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "ஒத்திசைவு கடவுச்சொற்றொடர், ஒத்திசைக்கப்படுவதற்கு முன், உங்கள் முக்கியமான புலங்களை (OPDS பட்டியல் சான்றுகள் போன்றவை) குறியாக்கம் செய்கிறது. இந்த கடவுச்சொற்றொடரை நாங்கள் ஒருபோதும் காண்பதில்லை. நினைவில் கொள்ளக்கூடிய ஒன்றைத் தேர்ந்தெடுக்கவும் — அதன்றி மீட்டெடுப்பு இல்லை.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "உங்கள் ஒத்திசைக்கப்பட்ட சான்றுகளை விகுதியாக்க, மற்றொரு சாதனத்தில் நீங்கள் அமைத்த ஒத்திசைவு கடவுச்சொற்றொடரை உள்ளிடவும்.",
|
||||
"Confirm passphrase": "கடவுச்சொற்றொடரை உறுதிப்படுத்தவும்",
|
||||
"Unlock": "பூட்டை திறக்கவும்",
|
||||
"Set PIN": "PIN ஐ அமை",
|
||||
"Change PIN": "PIN ஐ மாற்று",
|
||||
"Disable PIN": "PIN ஐ முடக்கு",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "உங்கள் தற்போதைய PIN ஐ உள்ளிட்டு, பின்னர் புதிய 4-இலக்க PIN ஐ தேர்ந்தெடுக்கவும்.",
|
||||
"Enter your current PIN to disable the app lock.": "செயலி பூட்டை முடக்க உங்கள் தற்போதைய PIN ஐ உள்ளிடவும்.",
|
||||
"PIN must be {{length}} digits": "PIN {{length}} இலக்கங்களாக இருக்க வேண்டும்",
|
||||
"PINs do not match": "PIN கள் பொருந்தவில்லை",
|
||||
"Current PIN": "தற்போதைய PIN",
|
||||
"New PIN": "புதிய PIN",
|
||||
"Confirm new PIN": "புதிய PIN ஐ உறுதிப்படுத்து",
|
||||
"Manage Sync": "ஒத்திசைவை நிர்வகிக்க",
|
||||
"Imported book files and library metadata": "இறக்குமதி செய்யப்பட்ட புத்தக கோப்புகள் மற்றும் நூலக மெட்டாடேட்டா",
|
||||
"Last-read position, bookmarks, and per-book preferences": "கடைசியாக படித்த இடம், புக்மார்க்குகள் மற்றும் ஒவ்வொரு புத்தகத்திற்கான விருப்பங்கள்",
|
||||
"Highlights and notes": "ஹைலைட்டுகள் மற்றும் குறிப்புகள்",
|
||||
"Fonts": "எழுத்துருக்கள்",
|
||||
"Custom font files": "தனிப்பயன் எழுத்துரு கோப்புகள்",
|
||||
"Backgrounds": "பின்னணிகள்",
|
||||
"Custom background textures": "தனிப்பயன் பின்னணி அமைப்புகள்",
|
||||
"OPDS catalogs": "OPDS பட்டியல்கள்",
|
||||
"Saved catalog URLs and (encrypted) credentials": "சேமிக்கப்பட்ட பட்டியல் URLs மற்றும் (குறியாக்கப்பட்ட) சான்றுகள்",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "தவறான ஒத்திசைவு கடவுச்சொற்றொடர் — ஒத்திசைக்கப்பட்ட சான்றுகளை குறியாக்கம் நீக்க முடியவில்லை",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "சேவையகத்தில் ஒத்திசைவு கடவுச்சொற்றொடர் தரவு மீட்டமைக்கப்பட்டது. புதிய கடவுச்சொற்றொடர் மூலம் உங்கள் சான்றுகள் மீண்டும் குறியாக்கம் செய்யப்படுகின்றன…",
|
||||
"Failed to decrypt synced credentials": "ஒத்திசைக்கப்பட்ட சான்றுகளின் குறியாக்கத்தை நீக்க முடியவில்லை",
|
||||
"Imported dictionary bundles and settings": "இறக்குமதி செய்யப்பட்ட அகராதி பொதிகள் மற்றும் அமைப்புகள்",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "உங்கள் சாதனங்களுக்கு இடையே எது ஒத்திசைக்க வேண்டும் என்பதைத் தேர்ந்தெடுக்கவும். ஒரு பிரிவை முடக்கும்போது, அந்த வகை பதிவுகளை அனுப்புவதையும் பெறுவதையும் இந்த சாதனம் நிறுத்தும். சர்வரில் ஏற்கனவே உள்ளவை அப்படியே இருக்கும், மீண்டும் இயக்கும்போது நீங்கள் நிறுத்திய இடத்திலிருந்து தொடரும்.",
|
||||
"Data Sync": "தரவு ஒத்திசைவு",
|
||||
"Manage Fonts": "எழுத்துருக்களை நிர்வகி",
|
||||
"App settings": "ஆப் அமைப்புகள்",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "தீம், ஹைலைட் வண்ணங்கள், ஒருங்கிணைப்புகள் (KOSync, Readwise, Hardcover) மற்றும் அகராதி வரிசை",
|
||||
"Required while Dictionaries sync is enabled": "அகராதிகள் ஒத்திசைவு இயக்கத்தில் இருக்கும்போது தேவை",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} மணி {{minutes}} நிமிடத்தில் மீட்டமைக்கப்படும்",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4 இலக்க PIN ஒன்றைத் தேர்ந்தெடுக்கவும். Readest திறக்கும் ஒவ்வொரு முறையும் அதை உள்ளிட வேண்டும். மறந்துபோன PIN ஐ மீட்டெடுக்க வழியில்லை. அதை மீட்டமைக்க ஒரே வழி பயன்பாட்டுத் தரவை அழிப்பதே ஆகும்.",
|
||||
"Credentials": "அங்கீகாரத் தரவுகள்",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover மற்றும் Readwise-க்கான டோக்கன்கள், பயனர் பெயர்கள் மற்றும் கடவுச்சொற்கள். முடக்கப்பட்டிருக்கும் போது, அங்கீகாரத் தரவுகள் இந்த சாதனத்தில் மட்டுமே இருக்கும், ஒருபோதும் பதிவேற்றப்படாது.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "முக்கியமான ஒத்திசைக்கப்பட்ட புலங்கள் பதிவேற்றத்திற்கு முன் குறியாக்கம் செய்யப்படுகின்றன. குறியாக்கம் தேவைப்படும் போது இப்போது அல்லது பின்னர் கடவுச்சொற்றொடரை அமைக்கவும்.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "இந்த கணக்கில் சேமிக்கப்பட்டது. அங்கீகாரத் தரவுகளை மறைகுறியாக்கும்போது உங்களிடம் கேட்கப்படும்.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "இந்தச் சாதனத்தில் படிப்பு முன்னேற்றம் \"{{deviceName}}\" என்பதிலிருந்து வேறுபடுகிறது.",
|
||||
"This device": "இந்தச் சாதனம்",
|
||||
"Red": "சிவப்பு",
|
||||
"Yellow": "மஞ்சள்",
|
||||
"Green": "பச்சை",
|
||||
"Blue": "நீலம்",
|
||||
"Violet": "ஊதா",
|
||||
"Edit color": "நிறத்தைத் திருத்து",
|
||||
"Add custom color": "தனிப்பயன் நிறத்தைச் சேர்க்கவும்",
|
||||
"Add label": "லேபிளைச் சேர்க்கவும்",
|
||||
"Choose color": "நிறத்தைத் தேர்ந்தெடுக்கவும்",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcover உடன் இணைக்கப்பட்டது. கடைசி ஒத்திசைவு {{time}}.",
|
||||
"Integrations": "ஒருங்கிணைப்புகள்",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwise உடன் இணைக்கப்பட்டது. கடைசி ஒத்திசைவு {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "ஆன்லைன் பட்டியல்களில் இருந்து புத்தகங்களை உலாவி பதிவிறக்கவும்.",
|
||||
"Connected as {{user}}": "{{user}} ஆக இணைக்கப்பட்டது",
|
||||
"Not connected": "இணைக்கப்படவில்லை",
|
||||
"{{count}} catalog_one": "{{count}} பட்டியல்",
|
||||
"{{count}} catalog_other": "{{count}} பட்டியல்கள்",
|
||||
"No catalogs": "பட்டியல்கள் இல்லை",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "ஒத்திசைவு, ஹைலைட்கள் மற்றும் பட்டியல்களுக்காக Readest ஐ வெளிப்புற சேவைகளுடன் இணைக்கவும்.",
|
||||
"Reading Sync": "படிப்பு ஒத்திசைவு",
|
||||
"Content Sources": "உள்ளடக்க மூலங்கள்",
|
||||
"Scroll tabs": "தாவல்களை உருட்டவும்",
|
||||
"Catalog actions": "பட்டியல் செயல்கள்",
|
||||
"File Content": "கோப்பு உள்ளடக்கம்",
|
||||
"Start your library": "உங்கள் நூலகத்தைத் தொடங்குங்கள்",
|
||||
"Pick a book from your device to add it to your library.": "உங்கள் நூலகத்தில் சேர்க்க உங்கள் சாதனத்திலிருந்து ஒரு புத்தகத்தைத் தேர்ந்தெடுக்கவும்.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "இந்த சாளரத்தில் எங்கேனும் ஒரு புத்தகத்தை விடவும், அல்லது உங்கள் கணினியிலிருந்து ஒன்றைத் தேர்ந்தெடுக்கவும்.",
|
||||
"Sign in to sync your library": "உங்கள் நூலகத்தை ஒத்திசைக்க உள்நுழையவும்"
|
||||
}
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
"Book deleted: {{title}}": "ลบหนังสือแล้ว: {{title}}",
|
||||
"Failed to delete book: {{title}}": "ไม่สามารถลบหนังสือ: {{title}}",
|
||||
"Deleted cloud backup of the book: {{title}}": "ลบสำรองบนคลาวด์แล้ว: {{title}}",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "ยินดีต้อนรับสู่คลังหนังสือ คุณสามารถนำเข้าหนังสือและอ่านได้ตลอดเวลา",
|
||||
"Copied to notebook": "คัดลอกไปยังสมุดบันทึก",
|
||||
"No annotations to export": "ไม่มีบันทึกให้ส่งออก",
|
||||
"Exported from Readest": "ส่งออกจาก Readest",
|
||||
@@ -277,7 +276,6 @@
|
||||
"Fast": "เร็ว",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} เสียง",
|
||||
"Sign in to Sync": "เข้าสู่ระบบเพื่อซิงค์",
|
||||
"Synced at {{time}}": "ซิงค์เมื่อ {{time}}",
|
||||
"Never synced": "ไม่เคยซิงค์",
|
||||
"Reading Progress Synced": "ซิงค์ความคืบหน้าแล้ว",
|
||||
"Delete Your Account?": "ลบบัญชีของคุณ?",
|
||||
@@ -457,14 +455,12 @@
|
||||
"Remove from Cloud Only": "ลบจากคลาวด์เท่านั้น",
|
||||
"Remove from Device Only": "ลบจากอุปกรณ์เท่านั้น",
|
||||
"Disconnected": "ตัดการเชื่อมต่อ",
|
||||
"KOReader Sync Settings": "การตั้งค่าการซิงค์ KOReader",
|
||||
"Sync Strategy": "กลยุทธ์การซิงค์",
|
||||
"Ask on conflict": "ถามเมื่อเกิดความขัดแย้ง",
|
||||
"Always use latest": "ใช้เวอร์ชันล่าสุดเสมอ",
|
||||
"Send changes only": "ส่งการเปลี่ยนแปลงเท่านั้น",
|
||||
"Receive changes only": "รับการเปลี่ยนแปลงเท่านั้น",
|
||||
"Checksum Method": "วิธีการตรวจสอบความถูกต้อง",
|
||||
"File Content (recommended)": "เนื้อหาไฟล์ (แนะนำ)",
|
||||
"File Name": "ชื่อไฟล์",
|
||||
"Device Name": "ชื่ออุปกรณ์",
|
||||
"Connect to your KOReader Sync server.": "เชื่อมต่อกับเซิร์ฟเวอร์ KOReader Sync ของคุณ",
|
||||
@@ -475,10 +471,7 @@
|
||||
"Connect": "เชื่อมต่อ",
|
||||
"KOReader Sync": "KOReader Sync",
|
||||
"Sync Conflict": "ความขัดแย้งในการซิงค์",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "ซิงค์ความก้าวหน้าในการอ่านจาก \"{{deviceName}}\"?",
|
||||
"another device": "อุปกรณ์อื่น",
|
||||
"Local Progress": "ความก้าวหน้าในเครื่อง",
|
||||
"Remote Progress": "ความก้าวหน้าในคลาวด์",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "หน้า {{page}} จาก {{total}} ({{percentage}}%)",
|
||||
"Current position": "ตำแหน่งปัจจุบัน",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "ประมาณหน้า {{page}} จาก {{total}} ({{percentage}}%)",
|
||||
@@ -631,7 +624,6 @@
|
||||
"Strikethrough": "ขีดฆ่า",
|
||||
"Squiggly": "เส้นหยัก",
|
||||
"Outline": "เส้นขอบ",
|
||||
"Save Current Color": "บันทึกสีปัจจุบัน",
|
||||
"Quick Colors": "สีด่วน",
|
||||
"Highlighter": "ปากกาเน้นข้อความ",
|
||||
"Save Book Cover": "บันทึกปกหนังสือ",
|
||||
@@ -781,7 +773,6 @@
|
||||
"Annotate text after selection": "เพิ่มหมายเหตุข้อความหลังการเลือก",
|
||||
"Search text after selection": "ค้นหาข้อความหลังการเลือก",
|
||||
"Look up text in dictionary after selection": "ค้นหาข้อความในพจนานุกรมหลังการเลือก",
|
||||
"Look up text in Wikipedia after selection": "ค้นหาข้อความในวิกิพีเดียหลังการเลือก",
|
||||
"Translate text after selection": "แปลข้อความหลังการเลือก",
|
||||
"Read text aloud after selection": "อ่านข้อความออกเสียงหลังการเลือก",
|
||||
"Proofread text after selection": "ตรวจทานข้อความหลังการเลือก",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "ส่งออกหนังสือล้มเหลว",
|
||||
"Export Book": "ส่งออกหนังสือ",
|
||||
"Whole word:": "คำทั้งคำ:",
|
||||
"Error": "ข้อผิดพลาด",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "ไม่สามารถโหลดบทความได้ ลองค้นหาโดยตรงที่ {{link}}",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "ไม่สามารถโหลดคำได้ ลองค้นหาโดยตรงที่ {{link}}",
|
||||
"Date Published": "วันที่เผยแพร่",
|
||||
"Only for TTS:": "สำหรับ TTS เท่านั้น:",
|
||||
"Uploaded": "อัปโหลดแล้ว",
|
||||
@@ -1027,16 +1015,12 @@
|
||||
"Invalid Readwise access token": "โทเคนการเข้าถึง Readwise ไม่ถูกต้อง",
|
||||
"Disconnected from Readwise": "ยกเลิกการเชื่อมต่อกับ Readwise แล้ว",
|
||||
"Never": "ไม่เคย",
|
||||
"Readwise Settings": "การตั้งค่า Readwise",
|
||||
"Connected to Readwise": "เชื่อมต่อกับ Readwise แล้ว",
|
||||
"Last synced: {{time}}": "ซิงค์ล่าสุดเมื่อ: {{time}}",
|
||||
"Sync Enabled": "เปิดใช้งานการซิงค์",
|
||||
"Disconnect": "ยกเลิกการเชื่อมต่อ",
|
||||
"Connect your Readwise account to sync highlights.": "เชื่อมต่อบัญชี Readwise ของคุณเพื่อซิงค์ไฮไลต์",
|
||||
"Get your access token at": "รับโทเคนการเข้าถึงของคุณได้ที่",
|
||||
"Access Token": "โทเคนการเข้าถึง",
|
||||
"Paste your Readwise access token": "วางโทเคนการเข้าถึง Readwise ของคุณ",
|
||||
"Config": "การกำหนดค่า",
|
||||
"Readwise Sync": "การซิงค์ Readwise",
|
||||
"Push Highlights": "พุชไฮไลต์",
|
||||
"Highlights synced to Readwise": "ซิงค์ไฮไลต์ไปยัง Readwise แล้ว",
|
||||
@@ -1106,7 +1090,6 @@
|
||||
"Copy Selection": "คัดลอกข้อความที่เลือก",
|
||||
"Translate Selection": "แปลข้อความที่เลือก",
|
||||
"Dictionary Lookup": "ค้นหาในพจนานุกรม",
|
||||
"Wikipedia Lookup": "ค้นหาใน Wikipedia",
|
||||
"Read Aloud Selection": "อ่านออกเสียงข้อความที่เลือก",
|
||||
"Proofread Selection": "ตรวจทานข้อความที่เลือก",
|
||||
"Open Settings": "เปิดการตั้งค่า",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "ลากเพื่อค้นหา",
|
||||
"Punctuation Delay": "หน่วงเวลาเครื่องหมายวรรคตอน",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "กรุณายืนยันว่าการเชื่อมต่อ OPDS นี้จะถูกส่งผ่านเซิร์ฟเวอร์ Readest บนเว็บแอปก่อนดำเนินการต่อ",
|
||||
"Custom Headers": "ส่วนหัวที่กำหนดเอง",
|
||||
"Custom Headers (optional)": "ส่วนหัวที่กำหนดเอง (ไม่บังคับ)",
|
||||
"Add one header per line using \"Header-Name: value\".": "เพิ่มส่วนหัวหนึ่งรายการต่อบรรทัดโดยใช้ \"Header-Name: value\"",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "ฉันเข้าใจว่าการเชื่อมต่อ OPDS นี้จะถูกส่งผ่านเซิร์ฟเวอร์ Readest บนเว็บแอป หากฉันไม่ไว้วางใจ Readest กับข้อมูลรับรองหรือส่วนหัวเหล่านี้ ฉันควรใช้แอปเนทีฟแทน",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "ไม่สามารถเชื่อมต่อกับ Hardcover ได้ กรุณาตรวจสอบการเชื่อมต่อเครือข่ายของคุณ",
|
||||
"Invalid Hardcover API token": "โทเค็น API ของ Hardcover ไม่ถูกต้อง",
|
||||
"Disconnected from Hardcover": "ตัดการเชื่อมต่อจาก Hardcover แล้ว",
|
||||
"Hardcover Settings": "การตั้งค่า Hardcover",
|
||||
"Connected to Hardcover": "เชื่อมต่อกับ Hardcover แล้ว",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "เชื่อมต่อบัญชี Hardcover ของคุณเพื่อซิงค์ความคืบหน้าการอ่านและบันทึก",
|
||||
"Get your API token from hardcover.app → Settings → API.": "รับโทเค็น API ของคุณจาก hardcover.app → การตั้งค่า → API",
|
||||
"API Token": "โทเค็น API",
|
||||
"Paste your Hardcover API token": "วางโทเค็น API ของ Hardcover ของคุณ",
|
||||
"Hardcover sync enabled for this book": "เปิดใช้งานการซิงค์ Hardcover สำหรับหนังสือนี้แล้ว",
|
||||
"Hardcover sync disabled for this book": "ปิดใช้งานการซิงค์ Hardcover สำหรับหนังสือนี้แล้ว",
|
||||
"Hardcover Sync": "การซิงค์ Hardcover",
|
||||
"Enable for This Book": "เปิดใช้งานสำหรับหนังสือนี้",
|
||||
"Push Notes": "ส่งบันทึก",
|
||||
"Enable Hardcover sync for this book first.": "เปิดใช้งานการซิงค์ Hardcover สำหรับหนังสือนี้ก่อน",
|
||||
"No annotations or excerpts to sync for this book.": "ไม่มีคำอธิบายประกอบหรือข้อความคัดลอกที่จะซิงค์สำหรับหนังสือนี้",
|
||||
"Configure Hardcover in Settings first.": "กำหนดค่า Hardcover ในการตั้งค่าก่อน",
|
||||
"No new Hardcover note changes to sync.": "ไม่มีการเปลี่ยนแปลงบันทึก Hardcover ใหม่ที่จะซิงค์",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "แยกยัติภังค์",
|
||||
"Apply Theme Colors to PDF": "ใช้สีธีมกับ PDF",
|
||||
"Name": "ชื่อ",
|
||||
"Unavailable": "ไม่พร้อมใช้งาน",
|
||||
"Remove": "ลบ",
|
||||
"Edit OPDS Catalog": "แก้ไขแคตตาล็อก OPDS",
|
||||
"Save Changes": "บันทึกการเปลี่ยนแปลง",
|
||||
"Use Book Layout": "ใช้เลย์เอาต์ของหนังสือ"
|
||||
"Use Book Layout": "ใช้เลย์เอาต์ของหนังสือ",
|
||||
"End of this section. Continue to the next.": "สิ้นสุดส่วนนี้ ดำเนินการไปยังส่วนถัดไป",
|
||||
"Auto-download": "ดาวน์โหลดอัตโนมัติ",
|
||||
"Auto-download new items": "ดาวน์โหลดรายการใหม่อัตโนมัติ",
|
||||
"Automatically download new publications when the app syncs": "ดาวน์โหลดสิ่งพิมพ์ใหม่อัตโนมัติเมื่อแอปซิงค์",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "ดาวน์โหลด {{count}} รายการใหม่จาก OPDS แล้ว",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "ไม่สามารถซิงค์แคตตาล็อก OPDS {{count}} รายการได้",
|
||||
"Last synced {{when}}": "ซิงค์ครั้งล่าสุด {{when}}",
|
||||
"Failed downloads": "การดาวน์โหลดที่ล้มเหลว",
|
||||
"No failed downloads": "ไม่มีการดาวน์โหลดที่ล้มเหลว",
|
||||
"Attempts: {{count}}_other": "ความพยายาม: {{count}}",
|
||||
"Skip": "ข้าม",
|
||||
"Skip all": "ข้ามทั้งหมด",
|
||||
"Retry all": "ลองอีกครั้งทั้งหมด",
|
||||
"{{count}} failed_other": "{{count}} ล้มเหลว",
|
||||
"(none)": "(ไม่มี)",
|
||||
"Identifiers": "ตัวระบุ",
|
||||
"Read (Stream)": "อ่าน (สตรีม)",
|
||||
"Failed to start stream": "ไม่สามารถเริ่มสตรีมได้",
|
||||
"No dictionaries enabled": "ไม่มีพจนานุกรมที่เปิดใช้งาน",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "เปิดใช้พจนานุกรมที่ ตั้งค่า → ภาษา → พจนานุกรม",
|
||||
"Wiktionary": "วิกิพจนานุกรม",
|
||||
"Drag to reorder": "ลากเพื่อจัดลำดับใหม่",
|
||||
"Built-in": "ในตัว",
|
||||
"Bundle is missing on this device. Re-import to use it.": "ไม่พบบันเดิลบนอุปกรณ์นี้ นำเข้าใหม่เพื่อใช้งาน",
|
||||
"This dictionary format is not supported.": "ไม่รองรับรูปแบบพจนานุกรมนี้",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "นำเข้าพจนานุกรม {{count}} เล่ม",
|
||||
"Skipped incomplete bundles: {{names}}": "ข้ามบันเดิลที่ไม่สมบูรณ์: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "นำเข้าพจนานุกรมไม่สำเร็จ: {{message}}",
|
||||
"Dictionaries": "พจนานุกรม",
|
||||
"Delete Dictionary": "ลบพจนานุกรม",
|
||||
"Importing…": "กำลังนำเข้า…",
|
||||
"Import Dictionary": "นำเข้าพจนานุกรม",
|
||||
"No dictionaries available.": "ไม่มีพจนานุกรม",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "บันเดิล StarDict ต้องมีไฟล์ .ifo, .idx และ .dict.dz (.syn ไม่บังคับ)",
|
||||
"Select all the bundle files together when importing.": "เลือกไฟล์ทั้งหมดของบันเดิลพร้อมกันเมื่อทำการนำเข้า",
|
||||
"Manage Dictionaries": "จัดการพจนานุกรม",
|
||||
"Select Dictionary Files": "เลือกไฟล์พจนานุกรม",
|
||||
"Read on Wikipedia →": "อ่านบนวิกิพีเดีย →",
|
||||
"This link can't be opened": "ไม่สามารถเปิดลิงก์นี้ได้",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "ลิงก์คำอธิบายประกอบไม่มีข้อมูลที่จำเป็น ลิงก์เดิมอาจถูกตัดทอน",
|
||||
"Go to Readest": "ไปที่ Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "โปรแกรมอ่านอีบุ๊กโอเพนซอร์สสำหรับทุกคน บนทุกอุปกรณ์",
|
||||
"Open in Readest": "เปิดใน Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "หาก Readest ไม่เปิดโดยอัตโนมัติ ให้เลือกตัวเลือกด้านล่าง:",
|
||||
"Continue reading where you left off.": "อ่านต่อจากจุดที่ค้างไว้",
|
||||
"Readest logo": "โลโก้ Readest",
|
||||
"Opening Readest...": "กำลังเปิด Readest…",
|
||||
"Open in Readest app": "เปิดในแอป Readest",
|
||||
"Continue in browser": "ทำต่อในเบราว์เซอร์",
|
||||
"Don't have Readest?": "ยังไม่มี Readest?",
|
||||
"Book not in your library": "ไม่พบหนังสือนี้ในคลังของคุณ",
|
||||
"Share Book": "แชร์หนังสือ",
|
||||
"Could not create share link": "ไม่สามารถสร้างลิงก์แชร์ได้",
|
||||
"Link copied": "คัดลอกลิงก์แล้ว",
|
||||
"Could not copy link": "ไม่สามารถคัดลอกลิงก์ได้",
|
||||
"Share revoked": "ยกเลิกการแชร์แล้ว",
|
||||
"Could not revoke share": "ไม่สามารถยกเลิกการแชร์ได้",
|
||||
"Uploading book…": "กำลังอัปโหลดหนังสือ…",
|
||||
"Generating…": "กำลังสร้าง…",
|
||||
"Generate share link": "สร้างลิงก์แชร์",
|
||||
"Share URL": "URL แชร์",
|
||||
"Copy link": "คัดลอกลิงก์",
|
||||
"Copied": "คัดลอกแล้ว",
|
||||
"Share via…": "แชร์ผ่าน…",
|
||||
"Expires {{date}}": "หมดอายุ {{date}}",
|
||||
"Revoking…": "กำลังยกเลิก…",
|
||||
"Revoke share": "ยกเลิกการแชร์",
|
||||
"Sign in to share books": "เข้าสู่ระบบเพื่อแชร์หนังสือ",
|
||||
"Expiring soon": "จะหมดอายุเร็วๆ นี้",
|
||||
"Missing share token": "ไม่มีโทเค็นแชร์",
|
||||
"Could not add to your library": "ไม่สามารถเพิ่มลงในคลังของคุณได้",
|
||||
"This share link is no longer available": "ลิงก์แชร์นี้ไม่สามารถใช้งานได้อีก",
|
||||
"The original link may have expired or been revoked.": "ลิงก์ต้นฉบับอาจหมดอายุหรือถูกยกเลิกแล้ว",
|
||||
"Get Readest": "รับ Readest",
|
||||
"Loading shared book…": "กำลังโหลดหนังสือที่แชร์…",
|
||||
"Adding…": "กำลังเพิ่ม…",
|
||||
"Add to my library": "เพิ่มในคลังของฉัน",
|
||||
"Could not load your shares": "ไม่สามารถโหลดการแชร์ของคุณได้",
|
||||
"Revoked": "ยกเลิกแล้ว",
|
||||
"Expired": "หมดอายุ",
|
||||
"Shared books": "หนังสือที่แชร์",
|
||||
"You haven't shared any books yet": "คุณยังไม่ได้แชร์หนังสือใดๆ",
|
||||
"Open a book and tap Share to send it to a friend.": "เปิดหนังสือแล้วแตะ แชร์ เพื่อส่งให้เพื่อน",
|
||||
"{{count}} active_other": "ใช้งานอยู่ {{count}} รายการ",
|
||||
"{{count}} downloads_other": "ดาวน์โหลด {{count}} ครั้ง",
|
||||
"starts at saved page": "เริ่มที่หน้าที่บันทึกไว้",
|
||||
"More actions": "การดำเนินการเพิ่มเติม",
|
||||
"Loading…": "กำลังโหลด…",
|
||||
"Load more": "โหลดเพิ่ม",
|
||||
"Could not load shared book": "ไม่สามารถโหลดหนังสือที่แชร์ได้",
|
||||
"The share link is missing required information.": "ลิงก์แชร์ขาดข้อมูลที่จำเป็น",
|
||||
"Please check your connection and try again.": "โปรดตรวจสอบการเชื่อมต่อของคุณและลองอีกครั้ง",
|
||||
"Sign in to import shared books": "เข้าสู่ระบบเพื่อนำเข้าหนังสือที่แชร์",
|
||||
"Already in your library": "อยู่ในคลังของคุณแล้ว",
|
||||
"Added to your library": "เพิ่มลงในคลังของคุณแล้ว",
|
||||
"Could not import shared book": "ไม่สามารถนำเข้าหนังสือที่แชร์ได้",
|
||||
"Manage Shared Links": "จัดการลิงก์แชร์",
|
||||
"Expires in": "หมดอายุใน",
|
||||
"{{count}} days_other": "{{count}} วัน",
|
||||
"Expires in {{count}} days_other": "หมดอายุใน {{count}} วัน",
|
||||
"Expires in {{count}} hours_other": "หมดอายุใน {{count}} ชั่วโมง",
|
||||
"Open in app": "เปิดในแอป",
|
||||
"Shared with you": "แชร์กับคุณ",
|
||||
"Downloading… {{percent}}%": "กำลังดาวน์โหลด… {{percent}}%",
|
||||
"Import progress": "ความคืบหน้าการนำเข้า",
|
||||
"Share reading progress": "แชร์ความคืบหน้าการอ่าน",
|
||||
"Includes your reading progress": "รวมถึงความคืบหน้าการอ่านของคุณ",
|
||||
"Synced {{time}}": "ซิงค์เมื่อ {{time}}",
|
||||
"Sync Info": "ข้อมูลการซิงค์",
|
||||
"Last Synced": "ซิงค์ล่าสุด",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "ชุด DICT ต้องการไฟล์ .index และไฟล์ .dict.dz",
|
||||
"Slob bundles need a .slob file.": "ชุด Slob ต้องการไฟล์ .slob",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "เทมเพลต URL ต้องขึ้นต้นด้วย http(s):// และมี %WORD%",
|
||||
"Web": "เว็บ",
|
||||
"Add Web Search": "เพิ่มการค้นหาบนเว็บ",
|
||||
"Edit Web Search": "แก้ไขการค้นหาบนเว็บ",
|
||||
"e.g. Google": "เช่น Google",
|
||||
"URL Template": "เทมเพลต URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "ใช้ %WORD% ในตำแหน่งที่คำค้นหาควรปรากฏ",
|
||||
"Open the search result in your browser:": "เปิดผลลัพธ์การค้นหาในเบราว์เซอร์ของคุณ:",
|
||||
"Open in {{name}}": "เปิดใน {{name}}",
|
||||
"Book Fingerprint": "ลายนิ้วมือหนังสือ",
|
||||
"Search the web": "ค้นหาบนเว็บ",
|
||||
"App deeplink (readest://)": "ดีปลิงก์ของแอป (readest://)",
|
||||
"Universal web link (https://)": "ลิงก์เว็บสากล (https://)",
|
||||
"Name cannot be empty.": "ชื่อต้องไม่ว่างเปล่า",
|
||||
"Replaced {{count}} existing dictionary_other": "แทนที่พจนานุกรมเดิม {{count}} รายการแล้ว",
|
||||
"Cancel Edit": "ยกเลิกการแก้ไข",
|
||||
"Edit Dictionary": "แก้ไขพจนานุกรม",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "ชุด MDict ใช้ไฟล์ .mdx ส่วนไฟล์ .mdd และ .css ที่มาด้วยกันเป็นทางเลือก",
|
||||
"Dictionary name": "ชื่อพจนานุกรม",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "ไม่สามารถเล่นเสียงนี้ที่นี่ได้ — พจนานุกรมใช้รูปแบบที่ล้าสมัย ลองใช้พจนานุกรมที่มีเสียง Opus, MP3 หรือ WAV",
|
||||
"File uploaded: {{title}}": "อัปโหลดไฟล์แล้ว: {{title}}",
|
||||
"File downloaded: {{title}}": "ดาวน์โหลดไฟล์แล้ว: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "ลบสำเนาไฟล์บนคลาวด์แล้ว: {{title}}",
|
||||
"Failed to upload file: {{title}}": "ไม่สามารถอัปโหลดไฟล์: {{title}}",
|
||||
"Failed to download file: {{title}}": "ไม่สามารถดาวน์โหลดไฟล์: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "ไม่สามารถลบสำเนาไฟล์บนคลาวด์: {{title}}",
|
||||
"{{percentage}}% used": "ใช้ไปแล้ว {{percentage}}%",
|
||||
"Set PIN…": "ตั้งค่า PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "ต้องใช้ PIN 4 หลักเพื่อเปิด Readest",
|
||||
"Change PIN…": "เปลี่ยน PIN…",
|
||||
"Disable PIN…": "ปิดใช้งาน PIN…",
|
||||
"Sync passphrase ready": "วลีรหัสผ่านสำหรับซิงค์พร้อมแล้ว",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "การกระทำนี้จะลบข้อมูลรับรองที่เข้ารหัสซึ่งเราซิงค์ไว้ (เช่น รหัสผ่านของแคตตาล็อก OPDS) บนทุกอุปกรณ์อย่างถาวร สำเนาที่อยู่ในเครื่องจะถูกเก็บไว้ คุณจะต้องป้อนวลีรหัสผ่านสำหรับซิงค์อีกครั้งหรือตั้งค่าใหม่ ดำเนินการต่อหรือไม่?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "ลืมวลีรหัสผ่านสำหรับซิงค์ — ฟิลด์ที่เข้ารหัสทั้งหมดถูกล้างแล้ว",
|
||||
"Sync passphrase": "วลีรหัสผ่านสำหรับซิงค์",
|
||||
"Set passphrase": "ตั้งค่าวลีรหัสผ่าน",
|
||||
"Forgot passphrase": "ลืมวลีรหัสผ่าน",
|
||||
"Incorrect PIN": "PIN ไม่ถูกต้อง",
|
||||
"App locked": "แอปถูกล็อก",
|
||||
"Enter your PIN": "ใส่ PIN ของคุณ",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest ถูกล็อก ใส่ PIN 4 หลักของคุณเพื่อดำเนินการต่อ",
|
||||
"PIN code": "รหัส PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "การลืม PIN จะทำให้คุณถูกล็อกออกจากอุปกรณ์นี้ คุณต้องล้างข้อมูลแอปเพื่อรีเซ็ต",
|
||||
"Passphrase must be at least 8 characters": "วลีรหัสผ่านต้องมีอย่างน้อย 8 ตัวอักษร",
|
||||
"Passphrases do not match": "วลีรหัสผ่านไม่ตรงกัน",
|
||||
"Set sync passphrase": "ตั้งค่าวลีรหัสผ่านสำหรับซิงค์",
|
||||
"Enter sync passphrase": "ป้อนวลีรหัสผ่านสำหรับซิงค์",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "วลีรหัสผ่านสำหรับซิงค์จะเข้ารหัสฟิลด์ที่มีข้อมูลละเอียดอ่อนของคุณ (เช่น ข้อมูลรับรองแคตตาล็อก OPDS) ก่อนที่จะซิงค์ เราไม่เคยเห็นวลีรหัสผ่านนี้ เลือกสิ่งที่จดจำง่าย — ไม่มีการกู้คืนหากปราศจากวลีนี้",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "ป้อนวลีรหัสผ่านสำหรับซิงค์ที่คุณตั้งไว้บนอุปกรณ์อื่นเพื่อถอดรหัสข้อมูลรับรองที่ซิงค์ไว้",
|
||||
"Confirm passphrase": "ยืนยันวลีรหัสผ่าน",
|
||||
"Unlock": "ปลดล็อก",
|
||||
"Set PIN": "ตั้งค่า PIN",
|
||||
"Change PIN": "เปลี่ยน PIN",
|
||||
"Disable PIN": "ปิดใช้งาน PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "ใส่ PIN ปัจจุบัน จากนั้นเลือก PIN 4 หลักใหม่",
|
||||
"Enter your current PIN to disable the app lock.": "ใส่ PIN ปัจจุบันเพื่อปิดใช้งานการล็อกแอป",
|
||||
"PIN must be {{length}} digits": "PIN ต้องมี {{length}} หลัก",
|
||||
"PINs do not match": "PIN ไม่ตรงกัน",
|
||||
"Current PIN": "PIN ปัจจุบัน",
|
||||
"New PIN": "PIN ใหม่",
|
||||
"Confirm new PIN": "ยืนยัน PIN ใหม่",
|
||||
"Manage Sync": "จัดการการซิงค์",
|
||||
"Imported book files and library metadata": "ไฟล์หนังสือที่นำเข้าและข้อมูลเมตาของคลัง",
|
||||
"Last-read position, bookmarks, and per-book preferences": "ตำแหน่งที่อ่านล่าสุด บุ๊กมาร์ก และค่ากำหนดของแต่ละเล่ม",
|
||||
"Highlights and notes": "ไฮไลต์และบันทึก",
|
||||
"Fonts": "แบบอักษร",
|
||||
"Custom font files": "ไฟล์แบบอักษรที่กำหนดเอง",
|
||||
"Backgrounds": "พื้นหลัง",
|
||||
"Custom background textures": "พื้นผิวพื้นหลังที่กำหนดเอง",
|
||||
"OPDS catalogs": "แคตตาล็อก OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URL แคตตาล็อกที่บันทึกไว้และข้อมูลรับรอง (ที่เข้ารหัส)",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "วลีรหัสผ่านซิงค์ไม่ถูกต้อง — ไม่สามารถถอดรหัสข้อมูลรับรองที่ซิงค์ได้",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "ข้อมูลวลีรหัสผ่านซิงค์บนเซิร์ฟเวอร์ถูกรีเซ็ตแล้ว กำลังเข้ารหัสข้อมูลรับรองของคุณใหม่ด้วยวลีรหัสผ่านใหม่…",
|
||||
"Failed to decrypt synced credentials": "ไม่สามารถถอดรหัสข้อมูลรับรองที่ซิงค์ได้",
|
||||
"Imported dictionary bundles and settings": "ชุดพจนานุกรมที่นำเข้าและการตั้งค่า",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "เลือกสิ่งที่ซิงค์ระหว่างอุปกรณ์ของคุณ การปิดหมวดหมู่จะหยุดอุปกรณ์นี้จากการส่งหรือรับรายการประเภทนั้น สิ่งที่อยู่บนเซิร์ฟเวอร์อยู่แล้วจะไม่ถูกแตะต้อง การเปิดใช้งานอีกครั้งจะดำเนินการต่อจากจุดที่คุณหยุดไว้",
|
||||
"Data Sync": "ซิงค์ข้อมูล",
|
||||
"Manage Fonts": "จัดการแบบอักษร",
|
||||
"App settings": "การตั้งค่าแอป",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "ธีม สีไฮไลต์ การเชื่อมต่อ (KOSync, Readwise, Hardcover) และลำดับพจนานุกรม",
|
||||
"Required while Dictionaries sync is enabled": "จำเป็นเมื่อเปิดใช้การซิงค์พจนานุกรม",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "รีเซ็ตใน {{hours}} ชม. {{minutes}} นาที",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "เลือก PIN 4 หลัก คุณจะต้องป้อนทุกครั้งที่เปิด Readest ไม่มีวิธีกู้คืน PIN ที่ลืม การล้างข้อมูลแอปเป็นวิธีเดียวในการรีเซ็ต",
|
||||
"Credentials": "ข้อมูลรับรอง",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "โทเคน ชื่อผู้ใช้ และรหัสผ่านสำหรับ OPDS, KOReader, Hardcover และ Readwise เมื่อปิดใช้งาน ข้อมูลรับรองจะยังคงอยู่ในอุปกรณ์นี้เท่านั้นและจะไม่ถูกอัปโหลด",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "ฟิลด์ที่ซิงค์ที่มีความละเอียดอ่อนจะถูกเข้ารหัสก่อนอัปโหลด ตั้งวลีรหัสผ่านตอนนี้หรือภายหลังเมื่อจำเป็นต้องเข้ารหัส",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "บันทึกในบัญชีนี้แล้ว คุณจะได้รับแจ้งเมื่อจำเป็นต้องถอดรหัสข้อมูลรับรอง",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "ความคืบหน้าการอ่านบนอุปกรณ์นี้แตกต่างจาก \"{{deviceName}}\"",
|
||||
"This device": "อุปกรณ์นี้",
|
||||
"Red": "แดง",
|
||||
"Yellow": "เหลือง",
|
||||
"Green": "เขียว",
|
||||
"Blue": "น้ำเงิน",
|
||||
"Violet": "ม่วง",
|
||||
"Edit color": "แก้ไขสี",
|
||||
"Add custom color": "เพิ่มสีที่กำหนดเอง",
|
||||
"Add label": "เพิ่มป้ายกำกับ",
|
||||
"Choose color": "เลือกสี",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "เชื่อมต่อกับ Hardcover แล้ว ซิงค์ล่าสุด {{time}}",
|
||||
"Integrations": "การเชื่อมต่อ",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "เชื่อมต่อกับ Readwise แล้ว ซิงค์ล่าสุด {{time}}",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "เรียกดูและดาวน์โหลดหนังสือจากแคตตาล็อกออนไลน์",
|
||||
"Connected as {{user}}": "เชื่อมต่อในชื่อ {{user}}",
|
||||
"Not connected": "ไม่ได้เชื่อมต่อ",
|
||||
"{{count}} catalog_other": "แคตตาล็อก {{count}} รายการ",
|
||||
"No catalogs": "ไม่มีแคตตาล็อก",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "เชื่อมต่อ Readest กับบริการภายนอกเพื่อการซิงค์ ไฮไลต์ และแคตตาล็อก",
|
||||
"Reading Sync": "การซิงค์การอ่าน",
|
||||
"Content Sources": "แหล่งเนื้อหา",
|
||||
"Scroll tabs": "เลื่อนแท็บ",
|
||||
"Catalog actions": "การดำเนินการแคตตาล็อก",
|
||||
"File Content": "เนื้อหาไฟล์",
|
||||
"Start your library": "เริ่มต้นห้องสมุดของคุณ",
|
||||
"Pick a book from your device to add it to your library.": "เลือกหนังสือจากอุปกรณ์ของคุณเพื่อเพิ่มลงในห้องสมุดของคุณ",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "วางหนังสือที่ใดก็ได้บนหน้าต่างนี้ หรือเลือกจากคอมพิวเตอร์ของคุณ",
|
||||
"Sign in to sync your library": "ลงชื่อเข้าใช้เพื่อซิงค์ห้องสมุดของคุณ"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Güncellendi",
|
||||
"Version {{version}}": "Sürüm {{version}}",
|
||||
"Vertical Direction": "Dikey Yön",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Kütüphanenize hoş geldiniz. Buradan kitaplarınızı içe aktarabilir ve istediğiniz zaman okuyabilirsiniz.",
|
||||
"Wikipedia": "Vikipedi",
|
||||
"Writing Mode": "Yazma Modu",
|
||||
"Your Library": "Kütüphaneniz",
|
||||
@@ -299,7 +298,6 @@
|
||||
"No notes match your search": "Eşleşen not bulunamadı",
|
||||
"Search notes and excerpts...": "Notlarda ara...",
|
||||
"Sign in to Sync": "Giriş yap",
|
||||
"Synced at {{time}}": "{{time}}'de eşzlendi",
|
||||
"Never synced": "Hiç eşzlenmedi",
|
||||
"Show Remaining Time": "Kalan Süreyi Göster",
|
||||
"{{time}} min left in chapter": "{{time}} dakika bölümde kaldı",
|
||||
@@ -461,14 +459,12 @@
|
||||
"Remove from Cloud Only": "Sadece Buluttan Kaldır",
|
||||
"Remove from Device Only": "Sadece Cihazdan Kaldır",
|
||||
"Disconnected": "Bağlantı Kesildi",
|
||||
"KOReader Sync Settings": "KOReader Senkronizasyon Ayarları",
|
||||
"Sync Strategy": "Senkronizasyon Stratejisi",
|
||||
"Ask on conflict": "Çatışmada Sor",
|
||||
"Always use latest": "Her Zaman En Sonunu Kullan",
|
||||
"Send changes only": "Sadece Değişiklikleri Gönder",
|
||||
"Receive changes only": "Sadece Değişiklikleri Al",
|
||||
"Checksum Method": "Kontrol Toplamı Yöntemi",
|
||||
"File Content (recommended)": "Dosya İçeriği (önerilen)",
|
||||
"File Name": "Dosya Adı",
|
||||
"Device Name": "Cihaz Adı",
|
||||
"Connect to your KOReader Sync server.": "KOReader Senkronizasyon sunucunuza bağlanın.",
|
||||
@@ -479,10 +475,7 @@
|
||||
"Connect": "Bağlan",
|
||||
"KOReader Sync": "KOReader Senkronizasyon",
|
||||
"Sync Conflict": "Senkronizasyon Çatışması",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "\"{{deviceName}}\" cihazından okuma ilerlemesini senkronize etmek istiyor musunuz?",
|
||||
"another device": "başka bir cihaz",
|
||||
"Local Progress": "Yerel İlerleme",
|
||||
"Remote Progress": "Uzak İlerleme",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Sayfa {{page}} / {{total}} ({{percentage}}%)",
|
||||
"Current position": "Mevcut konum",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Yaklaşık sayfa {{page}} / {{total}} ({{percentage}}%)",
|
||||
@@ -635,7 +628,6 @@
|
||||
"Strikethrough": "Üstü Çizili",
|
||||
"Squiggly": "Dalgalı Çizgi",
|
||||
"Outline": "Kontur",
|
||||
"Save Current Color": "Mevcut Rengi Kaydet",
|
||||
"Quick Colors": "Hızlı Renkler",
|
||||
"Highlighter": "Vurgulayıcı",
|
||||
"Save Book Cover": "Kitap Kapağını Kaydet",
|
||||
@@ -791,7 +783,6 @@
|
||||
"Annotate text after selection": "Seçimden sonra metni not al",
|
||||
"Search text after selection": "Seçimden sonra metni ara",
|
||||
"Look up text in dictionary after selection": "Seçimden sonra metni sözlükte ara",
|
||||
"Look up text in Wikipedia after selection": "Seçimden sonra metni Vikipedya'da ara",
|
||||
"Translate text after selection": "Seçimden sonra metni çevir",
|
||||
"Read text aloud after selection": "Seçimden sonra metni sesli oku",
|
||||
"Proofread text after selection": "Seçimden sonra metni düzelt",
|
||||
@@ -838,9 +829,6 @@
|
||||
"Failed to export the book.": "Kitap dışa aktarılamadı.",
|
||||
"Export Book": "Kitabı Dışa Aktar",
|
||||
"Whole word:": "Tam kelime:",
|
||||
"Error": "Hata",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Makale yüklenemiyor. Doğrudan {{link}} üzerinde arama yapmayı deneyin.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Kelime yüklenemiyor. Doğrudan {{link}} üzerinde arama yapmayı deneyin.",
|
||||
"Date Published": "Yayın tarihi",
|
||||
"Only for TTS:": "Sadece TTS için:",
|
||||
"Uploaded": "Yüklendi",
|
||||
@@ -1039,16 +1027,12 @@
|
||||
"Invalid Readwise access token": "Geçersiz Readwise erişim kodu",
|
||||
"Disconnected from Readwise": "Readwise bağlantısı kesildi",
|
||||
"Never": "Asla",
|
||||
"Readwise Settings": "Readwise Ayarları",
|
||||
"Connected to Readwise": "Readwise'a Bağlandı",
|
||||
"Last synced: {{time}}": "Son senkronizasyon: {{time}}",
|
||||
"Sync Enabled": "Senkronizasyon Etkin",
|
||||
"Disconnect": "Bağlantıyı Kes",
|
||||
"Connect your Readwise account to sync highlights.": "Vurguları senkronize etmek için Readwise hesabınızı bağlayın.",
|
||||
"Get your access token at": "Erişim kodunuzu şuradan alın:",
|
||||
"Access Token": "Erişim Kodu",
|
||||
"Paste your Readwise access token": "Readwise erişim kodunuzu yapıştırın",
|
||||
"Config": "Yapılandırma",
|
||||
"Readwise Sync": "Readwise Senkronizasyonu",
|
||||
"Push Highlights": "Vurguları Gönder",
|
||||
"Highlights synced to Readwise": "Vurgular Readwise ile senkronize edildi",
|
||||
@@ -1119,7 +1103,6 @@
|
||||
"Copy Selection": "Seçimi kopyala",
|
||||
"Translate Selection": "Seçimi çevir",
|
||||
"Dictionary Lookup": "Sözlükte ara",
|
||||
"Wikipedia Lookup": "Wikipedia'da ara",
|
||||
"Read Aloud Selection": "Seçimi sesli oku",
|
||||
"Proofread Selection": "Seçimi düzelt",
|
||||
"Open Settings": "Ayarları aç",
|
||||
@@ -1155,25 +1138,18 @@
|
||||
"Drag to seek": "Aramak için sürükleyin",
|
||||
"Punctuation Delay": "Noktalama gecikmesi",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Devam etmeden önce bu OPDS bağlantısının web uygulamasında Readest sunucuları üzerinden yönlendirileceğini onaylayın.",
|
||||
"Custom Headers": "Özel Başlıklar",
|
||||
"Custom Headers (optional)": "Özel Başlıklar (isteğe bağlı)",
|
||||
"Add one header per line using \"Header-Name: value\".": "\"Header-Name: value\" biçimini kullanarak her satıra bir başlık ekleyin.",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Bu OPDS bağlantısının web uygulamasında Readest sunucuları üzerinden yönlendirileceğini anlıyorum. Bu kimlik bilgileri veya başlıklar konusunda Readest'e güvenmiyorsam, bunun yerine yerel uygulamayı kullanmalıyım.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Hardcover'a bağlanılamıyor. Lütfen ağ bağlantınızı kontrol edin.",
|
||||
"Invalid Hardcover API token": "Geçersiz Hardcover API belirteci",
|
||||
"Disconnected from Hardcover": "Hardcover bağlantısı kesildi",
|
||||
"Hardcover Settings": "Hardcover Ayarları",
|
||||
"Connected to Hardcover": "Hardcover'a bağlandı",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Okuma ilerlemenizi ve notlarınızı senkronize etmek için Hardcover hesabınızı bağlayın.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "API belirtecinizi hardcover.app → Ayarlar → API'den alın.",
|
||||
"API Token": "API Belirteci",
|
||||
"Paste your Hardcover API token": "Hardcover API belirtecinizi yapıştırın",
|
||||
"Hardcover sync enabled for this book": "Bu kitap için Hardcover senkronizasyonu etkinleştirildi",
|
||||
"Hardcover sync disabled for this book": "Bu kitap için Hardcover senkronizasyonu devre dışı bırakıldı",
|
||||
"Hardcover Sync": "Hardcover Senkronizasyonu",
|
||||
"Enable for This Book": "Bu Kitap İçin Etkinleştir",
|
||||
"Push Notes": "Notları Gönder",
|
||||
"Enable Hardcover sync for this book first.": "Önce bu kitap için Hardcover senkronizasyonunu etkinleştirin.",
|
||||
"No annotations or excerpts to sync for this book.": "Bu kitap için senkronize edilecek açıklama veya alıntı yok.",
|
||||
"Configure Hardcover in Settings first.": "Önce Ayarlar'da Hardcover'ı yapılandırın.",
|
||||
"No new Hardcover note changes to sync.": "Senkronize edilecek yeni Hardcover not değişikliği yok.",
|
||||
@@ -1187,9 +1163,254 @@
|
||||
"Split Hyphens": "Tireleri Böl",
|
||||
"Apply Theme Colors to PDF": "Tema Renklerini PDF'ye Uygula",
|
||||
"Name": "Ad",
|
||||
"Unavailable": "Kullanılamaz",
|
||||
"Remove": "Kaldır",
|
||||
"Edit OPDS Catalog": "OPDS Kataloğunu Düzenle",
|
||||
"Save Changes": "Değişiklikleri Kaydet",
|
||||
"Use Book Layout": "Kitap düzenini kullan"
|
||||
"Use Book Layout": "Kitap düzenini kullan",
|
||||
"End of this section. Continue to the next.": "Bu bölümün sonu. Sonrakine devam edin.",
|
||||
"Auto-download": "Otomatik indirme",
|
||||
"Auto-download new items": "Yeni öğeleri otomatik indir",
|
||||
"Automatically download new publications when the app syncs": "Uygulama eşitlendiğinde yeni yayınları otomatik olarak indir",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "OPDSden {{count}} yeni öğe indirildi",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "OPDSden {{count}} yeni öğe indirildi",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "{{count}} OPDS kataloğu eşitlenemedi",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "{{count}} OPDS kataloğu eşitlenemedi",
|
||||
"Last synced {{when}}": "Son senkronizasyon {{when}}",
|
||||
"Failed downloads": "Başarısız indirmeler",
|
||||
"No failed downloads": "Başarısız indirme yok",
|
||||
"Attempts: {{count}}_one": "Denemeler: {{count}}",
|
||||
"Attempts: {{count}}_other": "Denemeler: {{count}}",
|
||||
"Skip": "Atla",
|
||||
"Skip all": "Tümünü atla",
|
||||
"Retry all": "Tümünü yeniden dene",
|
||||
"{{count}} failed_one": "{{count}} başarısız",
|
||||
"{{count}} failed_other": "{{count}} başarısız",
|
||||
"(none)": "(yok)",
|
||||
"Identifiers": "Tanımlayıcılar",
|
||||
"Read (Stream)": "Oku (Akış)",
|
||||
"Failed to start stream": "Akış başlatılamadı",
|
||||
"No dictionaries enabled": "Etkin sözlük yok",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Ayarlar → Dil → Sözlükler kısmından bir sözlük etkinleştirin.",
|
||||
"Wiktionary": "Vikisözlük",
|
||||
"Drag to reorder": "Yeniden sıralamak için sürükleyin",
|
||||
"Built-in": "Yerleşik",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Paket bu cihazda yok. Kullanmak için yeniden içe aktarın.",
|
||||
"This dictionary format is not supported.": "Bu sözlük biçimi desteklenmiyor.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "{{count}} sözlük içe aktarıldı",
|
||||
"Imported {{count}} dictionary_other": "{{count}} sözlük içe aktarıldı",
|
||||
"Skipped incomplete bundles: {{names}}": "Eksik paketler atlandı: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Sözlük içe aktarılamadı: {{message}}",
|
||||
"Dictionaries": "Sözlükler",
|
||||
"Delete Dictionary": "Sözlüğü sil",
|
||||
"Importing…": "İçe aktarılıyor…",
|
||||
"Import Dictionary": "Sözlük içe aktar",
|
||||
"No dictionaries available.": "Kullanılabilir sözlük yok.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict paketleri .ifo, .idx ve .dict.dz dosyalarını gerektirir (.syn isteğe bağlı).",
|
||||
"Select all the bundle files together when importing.": "İçe aktarırken paketin tüm dosyalarını birlikte seçin.",
|
||||
"Manage Dictionaries": "Sözlükleri yönet",
|
||||
"Select Dictionary Files": "Sözlük dosyalarını seç",
|
||||
"Read on Wikipedia →": "Wikipedia'da oku →",
|
||||
"This link can't be opened": "Bu bağlantı açılamıyor",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Açıklama bağlantısında gerekli bilgiler eksik. Orijinal bağlantı kesilmiş olabilir.",
|
||||
"Go to Readest": "Readest'e git",
|
||||
"Open-source ebook reader for everyone, on every device.": "Herkes için, her cihazda; açık kaynak e-kitap okuyucusu.",
|
||||
"Open in Readest": "Readest'te aç",
|
||||
"If Readest didn't open automatically, choose an option below:": "Readest otomatik olarak açılmadıysa aşağıdan bir seçenek belirle:",
|
||||
"Continue reading where you left off.": "Kaldığın yerden okumaya devam et.",
|
||||
"Readest logo": "Readest logosu",
|
||||
"Opening Readest...": "Readest açılıyor…",
|
||||
"Open in Readest app": "Readest uygulamasında aç",
|
||||
"Continue in browser": "Tarayıcıda devam et",
|
||||
"Don't have Readest?": "Readest'iniz yok mu?",
|
||||
"Book not in your library": "Kitap, kitaplığınızda yok",
|
||||
"Share Book": "Kitabı paylaş",
|
||||
"Could not create share link": "Paylaşım bağlantısı oluşturulamadı",
|
||||
"Link copied": "Bağlantı kopyalandı",
|
||||
"Could not copy link": "Bağlantı kopyalanamadı",
|
||||
"Share revoked": "Paylaşım iptal edildi",
|
||||
"Could not revoke share": "Paylaşım iptal edilemedi",
|
||||
"Uploading book…": "Kitap yükleniyor…",
|
||||
"Generating…": "Oluşturuluyor…",
|
||||
"Generate share link": "Paylaşım bağlantısı oluştur",
|
||||
"Share URL": "Paylaşım URL’si",
|
||||
"Copy link": "Bağlantıyı kopyala",
|
||||
"Copied": "Kopyalandı",
|
||||
"Share via…": "Şununla paylaş…",
|
||||
"Expires {{date}}": "{{date}} tarihinde sona erer",
|
||||
"Revoking…": "İptal ediliyor…",
|
||||
"Revoke share": "Paylaşımı iptal et",
|
||||
"Sign in to share books": "Kitapları paylaşmak için oturum açın",
|
||||
"Expiring soon": "Yakında sona eriyor",
|
||||
"Missing share token": "Paylaşım belirteci eksik",
|
||||
"Could not add to your library": "Kütüphanenize eklenemedi",
|
||||
"This share link is no longer available": "Bu paylaşım bağlantısı artık kullanılamıyor",
|
||||
"The original link may have expired or been revoked.": "Orijinal bağlantının süresi dolmuş veya iptal edilmiş olabilir.",
|
||||
"Get Readest": "Readest'i edinin",
|
||||
"Loading shared book…": "Paylaşılan kitap yükleniyor…",
|
||||
"Adding…": "Ekleniyor…",
|
||||
"Add to my library": "Kütüphaneme ekle",
|
||||
"Could not load your shares": "Paylaşımlarınız yüklenemedi",
|
||||
"Revoked": "İptal edildi",
|
||||
"Expired": "Süresi doldu",
|
||||
"Shared books": "Paylaşılan kitaplar",
|
||||
"You haven't shared any books yet": "Henüz hiç kitap paylaşmadınız",
|
||||
"Open a book and tap Share to send it to a friend.": "Bir kitap açın ve arkadaşınıza göndermek için Paylaş’a dokunun.",
|
||||
"{{count}} active_one": "{{count}} etkin",
|
||||
"{{count}} active_other": "{{count}} etkin",
|
||||
"{{count}} downloads_one": "{{count}} indirme",
|
||||
"{{count}} downloads_other": "{{count}} indirme",
|
||||
"starts at saved page": "kayıtlı sayfadan başlar",
|
||||
"More actions": "Diğer işlemler",
|
||||
"Loading…": "Yükleniyor…",
|
||||
"Load more": "Daha fazla yükle",
|
||||
"Could not load shared book": "Paylaşılan kitap yüklenemedi",
|
||||
"The share link is missing required information.": "Paylaşım bağlantısında gerekli bilgiler eksik.",
|
||||
"Please check your connection and try again.": "Bağlantınızı kontrol edip tekrar deneyin.",
|
||||
"Sign in to import shared books": "Paylaşılan kitapları içe aktarmak için oturum açın",
|
||||
"Already in your library": "Zaten kütüphanenizde",
|
||||
"Added to your library": "Kütüphanenize eklendi",
|
||||
"Could not import shared book": "Paylaşılan kitap içe aktarılamadı",
|
||||
"Manage Shared Links": "Paylaşım bağlantılarını yönet",
|
||||
"Expires in": "Sona erer",
|
||||
"{{count}} days_one": "1 gün",
|
||||
"{{count}} days_other": "{{count}} gün",
|
||||
"Expires in {{count}} days_one": "1 gün içinde sona erer",
|
||||
"Expires in {{count}} days_other": "{{count}} gün içinde sona erer",
|
||||
"Expires in {{count}} hours_one": "1 saat içinde sona erer",
|
||||
"Expires in {{count}} hours_other": "{{count}} saat içinde sona erer",
|
||||
"Open in app": "Uygulamada aç",
|
||||
"Shared with you": "Sizinle paylaşıldı",
|
||||
"Downloading… {{percent}}%": "İndiriliyor… %{{percent}}",
|
||||
"Import progress": "İçe aktarma ilerlemesi",
|
||||
"Share reading progress": "Okuma ilerlemesini paylaş",
|
||||
"Includes your reading progress": "Okuma ilerlemenizi içerir",
|
||||
"Synced {{time}}": "{{time}} senkronize edildi",
|
||||
"Sync Info": "Senkronizasyon bilgisi",
|
||||
"Last Synced": "Son senkronizasyon",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT paketleri bir .index dosyası ve bir .dict.dz dosyası gerektirir.",
|
||||
"Slob bundles need a .slob file.": "Slob paketleri bir .slob dosyası gerektirir.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL şablonu http(s):// ile başlamalı ve %WORD% içermelidir.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Web Araması Ekle",
|
||||
"Edit Web Search": "Web Aramasını Düzenle",
|
||||
"e.g. Google": "örn. Google",
|
||||
"URL Template": "URL Şablonu",
|
||||
"Use %WORD% where the looked-up word should appear.": "Aranan kelimenin görünmesi gereken yerde %WORD% kullanın.",
|
||||
"Open the search result in your browser:": "Arama sonucunu tarayıcınızda açın:",
|
||||
"Open in {{name}}": "{{name}} ile aç",
|
||||
"Book Fingerprint": "Kitap parmak izi",
|
||||
"Search the web": "Web’de ara",
|
||||
"App deeplink (readest://)": "Uygulama derin bağlantısı (readest://)",
|
||||
"Universal web link (https://)": "Evrensel web bağlantısı (https://)",
|
||||
"Name cannot be empty.": "Ad boş olamaz.",
|
||||
"Replaced {{count}} existing dictionary_one": "{{count}} mevcut sözlük değiştirildi",
|
||||
"Replaced {{count}} existing dictionary_other": "{{count}} mevcut sözlük değiştirildi",
|
||||
"Cancel Edit": "Düzenlemeyi iptal et",
|
||||
"Edit Dictionary": "Sözlüğü düzenle",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict paketleri .mdx dosyalarını kullanır; eşlik eden .mdd ve .css dosyaları isteğe bağlıdır.",
|
||||
"Dictionary name": "Sözlük adı",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Bu ses burada oynatılamıyor — sözlük eski bir biçim kullanıyor. Opus, MP3 veya WAV sesi olan bir sözlük deneyin.",
|
||||
"File uploaded: {{title}}": "Dosya yüklendi: {{title}}",
|
||||
"File downloaded: {{title}}": "Dosya indirildi: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Dosyanın bulut kopyası silindi: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Dosya yüklenemedi: {{title}}",
|
||||
"Failed to download file: {{title}}": "Dosya indirilemedi: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Dosyanın bulut kopyasını silme başarısız oldu: {{title}}",
|
||||
"{{percentage}}% used": "%{{percentage}} kullanıldı",
|
||||
"Set PIN…": "PIN Belirle…",
|
||||
"Require a 4-digit PIN to open Readest": "Readest'i açmak için 4 haneli PIN iste",
|
||||
"Change PIN…": "PIN Değiştir…",
|
||||
"Disable PIN…": "PIN'i Devre Dışı Bırak…",
|
||||
"Sync passphrase ready": "Eşitleme parolası hazır",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Bu işlem, her cihazda eşitlediğimiz şifrelenmiş kimlik bilgilerini (ör. OPDS kataloğu parolaları) kalıcı olarak siler. Yerel kopyalar korunur. Eşitleme parolasını yeniden girmeniz veya yeni bir tane belirlemeniz gerekecek. Devam edilsin mi?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Eşitleme parolası unutuldu — tüm şifrelenmiş alanlar temizlendi",
|
||||
"Sync passphrase": "Eşitleme parolası",
|
||||
"Set passphrase": "Parolayı belirle",
|
||||
"Forgot passphrase": "Parolayı unuttum",
|
||||
"Incorrect PIN": "Yanlış PIN",
|
||||
"App locked": "Uygulama kilitli",
|
||||
"Enter your PIN": "PIN'inizi girin",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest kilitli. Devam etmek için 4 haneli PIN'inizi girin.",
|
||||
"PIN code": "PIN kodu",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "PIN'inizi unutmak sizi bu cihazdan kilitler. Sıfırlamak için uygulamanın verilerini temizlemeniz gerekir.",
|
||||
"Passphrase must be at least 8 characters": "Parola en az 8 karakter olmalıdır",
|
||||
"Passphrases do not match": "Parolalar eşleşmiyor",
|
||||
"Set sync passphrase": "Eşitleme parolasını belirle",
|
||||
"Enter sync passphrase": "Eşitleme parolasını girin",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Eşitleme parolası, hassas alanlarınızı (örneğin OPDS kataloğu kimlik bilgilerinizi) eşitlenmeden önce şifreler. Bu parolayı asla görmeyiz. Akılda kalıcı bir şey seçin — onsuz kurtarma yoktur.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Eşitlenen kimlik bilgilerinizin şifresini çözmek için başka bir cihazda belirlediğiniz eşitleme parolasını girin.",
|
||||
"Confirm passphrase": "Parolayı onayla",
|
||||
"Unlock": "Kilidi aç",
|
||||
"Set PIN": "PIN Belirle",
|
||||
"Change PIN": "PIN Değiştir",
|
||||
"Disable PIN": "PIN'i Devre Dışı Bırak",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Mevcut PIN'inizi girin, ardından yeni bir 4 haneli PIN seçin.",
|
||||
"Enter your current PIN to disable the app lock.": "Uygulama kilidini devre dışı bırakmak için mevcut PIN'inizi girin.",
|
||||
"PIN must be {{length}} digits": "PIN {{length}} haneli olmalıdır",
|
||||
"PINs do not match": "PIN'ler eşleşmiyor",
|
||||
"Current PIN": "Mevcut PIN",
|
||||
"New PIN": "Yeni PIN",
|
||||
"Confirm new PIN": "Yeni PIN'i onayla",
|
||||
"Manage Sync": "Eşitlemeyi yönet",
|
||||
"Imported book files and library metadata": "İçe aktarılan kitap dosyaları ve kütüphane meta verileri",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Son okuma konumu, yer imleri ve kitap başına tercihler",
|
||||
"Highlights and notes": "Vurgular ve notlar",
|
||||
"Fonts": "Yazı tipleri",
|
||||
"Custom font files": "Özel yazı tipi dosyaları",
|
||||
"Backgrounds": "Arka planlar",
|
||||
"Custom background textures": "Özel arka plan dokuları",
|
||||
"OPDS catalogs": "OPDS katalogları",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Kayıtlı katalog URL'leri ve (şifrelenmiş) kimlik bilgileri",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Yanlış eşitleme parolası — eşitlenmiş kimlik bilgileri çözülemedi",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Sunucudaki eşitleme parolası verisi sıfırlandı. Kimlik bilgileriniz yeni parolayla yeniden şifreleniyor…",
|
||||
"Failed to decrypt synced credentials": "Eşitlenmiş kimlik bilgileri çözülemedi",
|
||||
"Imported dictionary bundles and settings": "İçe aktarılan sözlük paketleri ve ayarlar",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Cihazlarınız arasında neyin eşitleneceğini seçin. Bir kategoriyi devre dışı bırakmak, bu cihazın o türden kayıtları göndermesini veya almasını durdurur. Sunucuda zaten bulunan veriler olduğu gibi kalır, yeniden etkinleştirdiğinizde eşitleme bıraktığınız yerden devam eder.",
|
||||
"Data Sync": "Veri eşitleme",
|
||||
"Manage Fonts": "Yazı tiplerini yönet",
|
||||
"App settings": "Uygulama ayarları",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Tema, vurgu renkleri, entegrasyonlar (KOSync, Readwise, Hardcover) ve sözlük sırası",
|
||||
"Required while Dictionaries sync is enabled": "Sözlük eşitlemesi etkinken gereklidir",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} sa {{minutes}} dk içinde sıfırlanır",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4 haneli bir PIN seçin. Readest'i her açtığınızda bunu girmeniz gerekecek. Unutulan bir PIN'i kurtarmanın yolu yoktur. Uygulama verilerini temizlemek, sıfırlamanın tek yoludur.",
|
||||
"Credentials": "Kimlik Bilgileri",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover ve Readwise için belirteçler, kullanıcı adları ve parolalar. Devre dışı bırakıldığında kimlik bilgileri yalnızca bu cihazda kalır ve hiçbir zaman karşıya yüklenmez.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Hassas senkronize alanlar yüklemeden önce şifrelenir. Şifreleme gerektiğinde şimdi ya da daha sonra bir parola tümcesi belirleyin.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Bu hesaba kaydedildi. Kimlik bilgileri şifresi çözülürken sizden istenecektir.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Bu cihazdaki okuma ilerlemesi \"{{deviceName}}\" cihazından farklı.",
|
||||
"This device": "Bu cihaz",
|
||||
"Red": "Kırmızı",
|
||||
"Yellow": "Sarı",
|
||||
"Green": "Yeşil",
|
||||
"Blue": "Mavi",
|
||||
"Violet": "Mor",
|
||||
"Edit color": "Rengi düzenle",
|
||||
"Add custom color": "Özel renk ekle",
|
||||
"Add label": "Etiket ekle",
|
||||
"Choose color": "Renk seç",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Hardcover'a bağlı. Son senkronizasyon {{time}}.",
|
||||
"Integrations": "Entegrasyonlar",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Readwise'a bağlı. Son senkronizasyon {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Çevrimiçi kataloglardan kitaplara göz atın ve indirin.",
|
||||
"Connected as {{user}}": "{{user}} olarak bağlandı",
|
||||
"Not connected": "Bağlı değil",
|
||||
"{{count}} catalog_one": "{{count}} katalog",
|
||||
"{{count}} catalog_other": "{{count}} katalog",
|
||||
"No catalogs": "Katalog yok",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Senkronizasyon, vurgular ve kataloglar için Readest'i harici hizmetlere bağlayın.",
|
||||
"Reading Sync": "Okuma senkronizasyonu",
|
||||
"Content Sources": "İçerik kaynakları",
|
||||
"Scroll tabs": "Sekmeleri kaydır",
|
||||
"Catalog actions": "Katalog eylemleri",
|
||||
"File Content": "Dosya içeriği",
|
||||
"Start your library": "Kütüphanenizi başlatın",
|
||||
"Pick a book from your device to add it to your library.": "Kütüphanenize eklemek için cihazınızdan bir kitap seçin.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Bu pencerede herhangi bir yere bir kitap bırakın veya bilgisayarınızdan birini seçin.",
|
||||
"Sign in to sync your library": "Kütüphanenizi senkronize etmek için oturum açın"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "Оновлено",
|
||||
"Version {{version}}": "Версія {{version}}",
|
||||
"Vertical Direction": "Вертикальний напрямок",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Ласкаво просимо до вашої бібліотеки. Ви можете імпортувати сюди свої книги та читати їх будь-коли.",
|
||||
"Wikipedia": "Вікіпедія",
|
||||
"Writing Mode": "Режим письма",
|
||||
"Your Library": "Ваша бібліотека",
|
||||
@@ -303,7 +302,6 @@
|
||||
"No notes match your search": "Нотаток не знайдено",
|
||||
"Search notes and excerpts...": "Шукати нотатки...",
|
||||
"Sign in to Sync": "Увійти",
|
||||
"Synced at {{time}}": "Синхр. о {{time}}",
|
||||
"Never synced": "Ніколи не синхр.",
|
||||
"Show Remaining Time": "Показати залишок часу",
|
||||
"{{time}} min left in chapter": "{{time}} хв до кінця розділу",
|
||||
@@ -469,14 +467,12 @@
|
||||
"Remove from Cloud Only": "Видалити тільки із хмари",
|
||||
"Remove from Device Only": "Видалити тільки із пристрою",
|
||||
"Disconnected": "Від'єднано",
|
||||
"KOReader Sync Settings": "Налаштування синхронізації KOReader",
|
||||
"Sync Strategy": "Стратегія синхронізації",
|
||||
"Ask on conflict": "Запитувати при конфлікті",
|
||||
"Always use latest": "Завжди використовувати найновішу",
|
||||
"Send changes only": "Відправити тільки зміни",
|
||||
"Receive changes only": "Отримати тільки зміни",
|
||||
"Checksum Method": "Метод контролю суми",
|
||||
"File Content (recommended)": "Вміст файлу (рекомендується)",
|
||||
"File Name": "Ім'я файлу",
|
||||
"Device Name": "Ім'я пристрою",
|
||||
"Connect to your KOReader Sync server.": "Під'єдайте свій сервер синхронізації KOReader.",
|
||||
@@ -487,10 +483,7 @@
|
||||
"Connect": "Під'єднатися",
|
||||
"KOReader Sync": "Синхронізація KOReader",
|
||||
"Sync Conflict": "Конфлікт синхронізації",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Синхронізувати прогрес читання із \"{{deviceName}}\"?",
|
||||
"another device": "інший пристрій",
|
||||
"Local Progress": "Локальний проґрес",
|
||||
"Remote Progress": "Проґрес у хмарі",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Сторінка {{page}} з {{total}} ({{percentage}}%)",
|
||||
"Current position": "Поточна позиція",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Приблизно сторінка {{page}} із {{total}} ({{percentage}}%)",
|
||||
@@ -643,7 +636,6 @@
|
||||
"Strikethrough": "Закреслення",
|
||||
"Squiggly": "Хвиляста лінія",
|
||||
"Outline": "Контур",
|
||||
"Save Current Color": "Зберегти поточний колір",
|
||||
"Quick Colors": "Швидкі кольори",
|
||||
"Highlighter": "Маркер",
|
||||
"Save Book Cover": "Зберегти обкладинку книги",
|
||||
@@ -811,7 +803,6 @@
|
||||
"Annotate text after selection": "Додати анотацію до тексту після виділення",
|
||||
"Search text after selection": "Шукати текст після виділення",
|
||||
"Look up text in dictionary after selection": "Шукати текст у словнику після виділення",
|
||||
"Look up text in Wikipedia after selection": "Шукати текст у Вікіпедії після виділення",
|
||||
"Translate text after selection": "Перекласти текст після виділення",
|
||||
"Read text aloud after selection": "Прочитати текст вголос після виділення",
|
||||
"Proofread text after selection": "Вичитати текст після виділення",
|
||||
@@ -858,9 +849,6 @@
|
||||
"Failed to export the book.": "Не вдалося експортувати книгу.",
|
||||
"Export Book": "Експортувати книгу",
|
||||
"Whole word:": "Ціле слово:",
|
||||
"Error": "Помилка",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Не вдалося завантажити статтю. Спробуйте шукати безпосередньо на {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Не вдалося завантажити слово. Спробуйте шукати безпосередньо на {{link}}.",
|
||||
"Date Published": "Дата публікації",
|
||||
"Only for TTS:": "Тільки для TTS:",
|
||||
"Uploaded": "Завантажено",
|
||||
@@ -1063,16 +1051,12 @@
|
||||
"Invalid Readwise access token": "Недійсний токен доступу Readwise",
|
||||
"Disconnected from Readwise": "Відключено від Readwise",
|
||||
"Never": "Ніколи",
|
||||
"Readwise Settings": "Налаштування Readwise",
|
||||
"Connected to Readwise": "Підключено до Readwise",
|
||||
"Last synced: {{time}}": "Остання синхронізація: {{time}}",
|
||||
"Sync Enabled": "Синхронізацію увімкнено",
|
||||
"Disconnect": "Відключити",
|
||||
"Connect your Readwise account to sync highlights.": "Підключіть свій обліковий запис Readwise, щоб синхронізувати виділення.",
|
||||
"Get your access token at": "Отримайте токен доступу за адресою",
|
||||
"Access Token": "Токен доступу",
|
||||
"Paste your Readwise access token": "Вставте ваш токен доступу Readwise",
|
||||
"Config": "Конфігурація",
|
||||
"Readwise Sync": "Синхронізація Readwise",
|
||||
"Push Highlights": "Надіслати виділення",
|
||||
"Highlights synced to Readwise": "Виділення синхронізовано з Readwise",
|
||||
@@ -1145,7 +1129,6 @@
|
||||
"Copy Selection": "Копіювати вибране",
|
||||
"Translate Selection": "Перекласти вибране",
|
||||
"Dictionary Lookup": "Пошук у словнику",
|
||||
"Wikipedia Lookup": "Пошук у Вікіпедії",
|
||||
"Read Aloud Selection": "Прочитати вибране вголос",
|
||||
"Proofread Selection": "Перевірити вибране",
|
||||
"Open Settings": "Відкрити налаштування",
|
||||
@@ -1181,25 +1164,18 @@
|
||||
"Drag to seek": "Перетягніть для пошуку",
|
||||
"Punctuation Delay": "Затримка на розділових знаках",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Підтвердіть, що це з'єднання OPDS буде проксовано через сервери Readest у веб-додатку, перш ніж продовжити.",
|
||||
"Custom Headers": "Користувацькі заголовки",
|
||||
"Custom Headers (optional)": "Користувацькі заголовки (необов'язково)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Додайте один заголовок на рядок у форматі \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Я розумію, що це з'єднання OPDS буде проксовано через сервери Readest у веб-додатку. Якщо я не довіряю Readest свої облікові дані або заголовки, мені слід використовувати рідний додаток.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Не вдалося підключитися до Hardcover. Перевірте мережеве з'єднання.",
|
||||
"Invalid Hardcover API token": "Недійсний API-токен Hardcover",
|
||||
"Disconnected from Hardcover": "Від'єднано від Hardcover",
|
||||
"Hardcover Settings": "Налаштування Hardcover",
|
||||
"Connected to Hardcover": "Підключено до Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Підключіть свій обліковий запис Hardcover для синхронізації прогресу читання та нотаток.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Отримайте API-токен на hardcover.app → Налаштування → API.",
|
||||
"API Token": "API-токен",
|
||||
"Paste your Hardcover API token": "Вставте ваш API-токен Hardcover",
|
||||
"Hardcover sync enabled for this book": "Синхронізацію Hardcover увімкнено для цієї книги",
|
||||
"Hardcover sync disabled for this book": "Синхронізацію Hardcover вимкнено для цієї книги",
|
||||
"Hardcover Sync": "Синхронізація Hardcover",
|
||||
"Enable for This Book": "Увімкнути для цієї книги",
|
||||
"Push Notes": "Надіслати нотатки",
|
||||
"Enable Hardcover sync for this book first.": "Спочатку увімкніть синхронізацію Hardcover для цієї книги.",
|
||||
"No annotations or excerpts to sync for this book.": "Немає анотацій або витягів для синхронізації для цієї книги.",
|
||||
"Configure Hardcover in Settings first.": "Спочатку налаштуйте Hardcover у параметрах.",
|
||||
"No new Hardcover note changes to sync.": "Немає нових змін нотаток Hardcover для синхронізації.",
|
||||
@@ -1213,9 +1189,278 @@
|
||||
"Split Hyphens": "Розділити дефіси",
|
||||
"Apply Theme Colors to PDF": "Застосувати кольори теми до PDF",
|
||||
"Name": "Ім'я",
|
||||
"Unavailable": "Недоступно",
|
||||
"Remove": "Видалити",
|
||||
"Edit OPDS Catalog": "Редагувати каталог OPDS",
|
||||
"Save Changes": "Зберегти зміни",
|
||||
"Use Book Layout": "Використовувати макет книги"
|
||||
"Use Book Layout": "Використовувати макет книги",
|
||||
"End of this section. Continue to the next.": "Кінець цього розділу. Продовжте до наступного.",
|
||||
"Auto-download": "Автозавантаження",
|
||||
"Auto-download new items": "Автоматично завантажувати нові елементи",
|
||||
"Automatically download new publications when the app syncs": "Автоматично завантажувати нові публікації під час синхронізації застосунку",
|
||||
"{{count}} new item(s) downloaded from OPDS_one": "Завантажено {{count}} новий елемент з OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_few": "Завантажено {{count}} нових елементи з OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_many": "Завантажено {{count}} нових елементів з OPDS",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Завантажено {{count}} нових елементів з OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_one": "Не вдалося синхронізувати {{count}} каталог OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_few": "Не вдалося синхронізувати {{count}} каталоги OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_many": "Не вдалося синхронізувати {{count}} каталогів OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Не вдалося синхронізувати {{count}} каталогів OPDS",
|
||||
"Last synced {{when}}": "Остання синхронізація {{when}}",
|
||||
"Failed downloads": "Невдалі завантаження",
|
||||
"No failed downloads": "Немає невдалих завантажень",
|
||||
"Attempts: {{count}}_one": "Спроби: {{count}}",
|
||||
"Attempts: {{count}}_few": "Спроби: {{count}}",
|
||||
"Attempts: {{count}}_many": "Спроби: {{count}}",
|
||||
"Attempts: {{count}}_other": "Спроби: {{count}}",
|
||||
"Skip": "Пропустити",
|
||||
"Skip all": "Пропустити всі",
|
||||
"Retry all": "Повторити всі",
|
||||
"{{count}} failed_one": "{{count}} помилка",
|
||||
"{{count}} failed_few": "{{count}} помилки",
|
||||
"{{count}} failed_many": "{{count}} помилок",
|
||||
"{{count}} failed_other": "{{count}} помилок",
|
||||
"(none)": "(немає)",
|
||||
"Identifiers": "Ідентифікатори",
|
||||
"Read (Stream)": "Читати (Потік)",
|
||||
"Failed to start stream": "Не вдалося запустити потік",
|
||||
"No dictionaries enabled": "Немає увімкнених словників",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Увімкніть словник у Налаштування → Мова → Словники.",
|
||||
"Wiktionary": "Вікісловник",
|
||||
"Drag to reorder": "Перетягніть, щоб змінити порядок",
|
||||
"Built-in": "Вбудований",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Пакет відсутній на цьому пристрої. Повторно імпортуйте для використання.",
|
||||
"This dictionary format is not supported.": "Цей формат словника не підтримується.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_one": "Імпортовано {{count}} словник",
|
||||
"Imported {{count}} dictionary_few": "Імпортовано {{count}} словники",
|
||||
"Imported {{count}} dictionary_many": "Імпортовано {{count}} словників",
|
||||
"Imported {{count}} dictionary_other": "Імпортовано {{count}} словників",
|
||||
"Skipped incomplete bundles: {{names}}": "Пропущено неповні пакети: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Не вдалося імпортувати словник: {{message}}",
|
||||
"Dictionaries": "Словники",
|
||||
"Delete Dictionary": "Видалити словник",
|
||||
"Importing…": "Імпорт…",
|
||||
"Import Dictionary": "Імпорт словника",
|
||||
"No dictionaries available.": "Немає доступних словників.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Пакети StarDict потребують файлів .ifo, .idx і .dict.dz (.syn — необов’язково).",
|
||||
"Select all the bundle files together when importing.": "Під час імпорту вибирайте всі файли пакета разом.",
|
||||
"Manage Dictionaries": "Керування словниками",
|
||||
"Select Dictionary Files": "Виберіть файли словника",
|
||||
"Read on Wikipedia →": "Читати у Вікіпедії →",
|
||||
"This link can't be opened": "Не вдалося відкрити посилання",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "У посиланні на анотацію бракує потрібної інформації. Можливо, початкове посилання було обрізане.",
|
||||
"Go to Readest": "Перейти до Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Електронна читалка з відкритим кодом — для всіх і на будь-якому пристрої.",
|
||||
"Open in Readest": "Відкрити в Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Якщо Readest не відкрився автоматично, оберіть варіант нижче:",
|
||||
"Continue reading where you left off.": "Продовжуйте читати з місця, де ви зупинилися.",
|
||||
"Readest logo": "Логотип Readest",
|
||||
"Opening Readest...": "Відкриваємо Readest…",
|
||||
"Open in Readest app": "Відкрити в застосунку Readest",
|
||||
"Continue in browser": "Продовжити у браузері",
|
||||
"Don't have Readest?": "Не маєте Readest?",
|
||||
"Book not in your library": "Книги немає у вашій бібліотеці",
|
||||
"Share Book": "Поділитися книгою",
|
||||
"Could not create share link": "Не вдалося створити посилання для поширення",
|
||||
"Link copied": "Посилання скопійовано",
|
||||
"Could not copy link": "Не вдалося скопіювати посилання",
|
||||
"Share revoked": "Доступ скасовано",
|
||||
"Could not revoke share": "Не вдалося скасувати доступ",
|
||||
"Uploading book…": "Завантаження книги…",
|
||||
"Generating…": "Створення…",
|
||||
"Generate share link": "Створити посилання",
|
||||
"Share URL": "URL для поширення",
|
||||
"Copy link": "Копіювати посилання",
|
||||
"Copied": "Скопійовано",
|
||||
"Share via…": "Поділитися через…",
|
||||
"Expires {{date}}": "Дійсна до {{date}}",
|
||||
"Revoking…": "Скасування…",
|
||||
"Revoke share": "Скасувати доступ",
|
||||
"Sign in to share books": "Увійдіть, щоб ділитися книгами",
|
||||
"Expiring soon": "Скоро закінчиться",
|
||||
"Missing share token": "Відсутній маркер доступу",
|
||||
"Could not add to your library": "Не вдалося додати до вашої бібліотеки",
|
||||
"This share link is no longer available": "Це посилання більше не доступне",
|
||||
"The original link may have expired or been revoked.": "Первинне посилання могло втратити чинність або бути скасоване.",
|
||||
"Get Readest": "Отримати Readest",
|
||||
"Loading shared book…": "Завантаження поширеної книги…",
|
||||
"Adding…": "Додавання…",
|
||||
"Add to my library": "Додати до моєї бібліотеки",
|
||||
"Could not load your shares": "Не вдалося завантажити ваші посилання",
|
||||
"Revoked": "Скасовано",
|
||||
"Expired": "Минув термін",
|
||||
"Shared books": "Поширені книги",
|
||||
"You haven't shared any books yet": "Ви ще не поділилися жодною книгою",
|
||||
"Open a book and tap Share to send it to a friend.": "Відкрийте книгу й торкніться «Поділитися», щоб надіслати її другові.",
|
||||
"{{count}} active_one": "{{count}} активне",
|
||||
"{{count}} active_few": "{{count}} активні",
|
||||
"{{count}} active_many": "{{count}} активних",
|
||||
"{{count}} active_other": "{{count}} активних",
|
||||
"{{count}} downloads_one": "{{count}} завантаження",
|
||||
"{{count}} downloads_few": "{{count}} завантаження",
|
||||
"{{count}} downloads_many": "{{count}} завантажень",
|
||||
"{{count}} downloads_other": "{{count}} завантажень",
|
||||
"starts at saved page": "починається зі збереженої сторінки",
|
||||
"More actions": "Більше дій",
|
||||
"Loading…": "Завантаження…",
|
||||
"Load more": "Завантажити більше",
|
||||
"Could not load shared book": "Не вдалося завантажити поширену книгу",
|
||||
"The share link is missing required information.": "У посиланні бракує необхідної інформації.",
|
||||
"Please check your connection and try again.": "Перевірте підключення та спробуйте ще раз.",
|
||||
"Sign in to import shared books": "Увійдіть, щоб імпортувати поширені книги",
|
||||
"Already in your library": "Уже у вашій бібліотеці",
|
||||
"Added to your library": "Додано до вашої бібліотеки",
|
||||
"Could not import shared book": "Не вдалося імпортувати поширену книгу",
|
||||
"Manage Shared Links": "Керування посиланнями",
|
||||
"Expires in": "Закінчується через",
|
||||
"{{count}} days_one": "{{count}} день",
|
||||
"{{count}} days_few": "{{count}} дні",
|
||||
"{{count}} days_many": "{{count}} днів",
|
||||
"{{count}} days_other": "{{count}} днів",
|
||||
"Expires in {{count}} days_one": "Дійсне ще {{count}} день",
|
||||
"Expires in {{count}} days_few": "Дійсне ще {{count}} дні",
|
||||
"Expires in {{count}} days_many": "Дійсне ще {{count}} днів",
|
||||
"Expires in {{count}} days_other": "Дійсне ще {{count}} днів",
|
||||
"Expires in {{count}} hours_one": "Дійсне ще {{count}} годину",
|
||||
"Expires in {{count}} hours_few": "Дійсне ще {{count}} години",
|
||||
"Expires in {{count}} hours_many": "Дійсне ще {{count}} годин",
|
||||
"Expires in {{count}} hours_other": "Дійсне ще {{count}} годин",
|
||||
"Open in app": "Відкрити в застосунку",
|
||||
"Shared with you": "Поділилися з вами",
|
||||
"Downloading… {{percent}}%": "Завантаження… {{percent}}%",
|
||||
"Import progress": "Хід імпорту",
|
||||
"Share reading progress": "Поділитися прогресом читання",
|
||||
"Includes your reading progress": "Містить ваш прогрес читання",
|
||||
"Synced {{time}}": "Синхронізовано {{time}}",
|
||||
"Sync Info": "Інформація про синхронізацію",
|
||||
"Last Synced": "Остання синхронізація",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Пакети DICT потребують файл .index і файл .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Пакети Slob потребують файл .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Шаблон URL має починатися з http(s):// та містити %WORD%.",
|
||||
"Web": "Веб",
|
||||
"Add Web Search": "Додати веб-пошук",
|
||||
"Edit Web Search": "Редагувати веб-пошук",
|
||||
"e.g. Google": "напр. Google",
|
||||
"URL Template": "Шаблон URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Використовуйте %WORD% там, де має з'явитися шукане слово.",
|
||||
"Open the search result in your browser:": "Відкрийте результат пошуку в браузері:",
|
||||
"Open in {{name}}": "Відкрити в {{name}}",
|
||||
"Book Fingerprint": "Відбиток книги",
|
||||
"Search the web": "Пошук в інтернеті",
|
||||
"App deeplink (readest://)": "Глибоке посилання застосунку (readest://)",
|
||||
"Universal web link (https://)": "Універсальне веб-посилання (https://)",
|
||||
"Name cannot be empty.": "Ім’я не може бути порожнім.",
|
||||
"Replaced {{count}} existing dictionary_one": "Замінено {{count}} наявний словник",
|
||||
"Replaced {{count}} existing dictionary_few": "Замінено {{count}} наявні словники",
|
||||
"Replaced {{count}} existing dictionary_many": "Замінено {{count}} наявних словників",
|
||||
"Replaced {{count}} existing dictionary_other": "Замінено {{count}} наявних словників",
|
||||
"Cancel Edit": "Скасувати редагування",
|
||||
"Edit Dictionary": "Редагувати словник",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Пакунки MDict використовують файли .mdx; супутні файли .mdd і .css є необов’язковими.",
|
||||
"Dictionary name": "Назва словника",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Це аудіо не можна відтворити тут — словник використовує застарілий формат. Спробуйте словник з аудіо Opus, MP3 або WAV.",
|
||||
"File uploaded: {{title}}": "Файл завантажено: {{title}}",
|
||||
"File downloaded: {{title}}": "Файл завантажено: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Видалено хмарну копію файлу: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Не вдалося завантажити файл: {{title}}",
|
||||
"Failed to download file: {{title}}": "Не вдалося завантажити файл: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Не вдалося видалити копію файлу в хмарі: {{title}}",
|
||||
"{{percentage}}% used": "Використано {{percentage}}%",
|
||||
"Set PIN…": "Установити PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Вимагати 4-значний PIN для відкриття Readest",
|
||||
"Change PIN…": "Змінити PIN…",
|
||||
"Disable PIN…": "Вимкнути PIN…",
|
||||
"Sync passphrase ready": "Парольну фразу синхронізації готово",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Це остаточно видалить зашифровані облікові дані, які ми синхронізуємо (наприклад, паролі каталогу OPDS), на кожному пристрої. Локальні копії зберігаються. Вам потрібно буде повторно ввести парольну фразу синхронізації або встановити нову. Продовжити?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "Парольну фразу синхронізації забуто — усі зашифровані поля очищено",
|
||||
"Sync passphrase": "Парольна фраза синхронізації",
|
||||
"Set passphrase": "Установити парольну фразу",
|
||||
"Forgot passphrase": "Забули парольну фразу",
|
||||
"Incorrect PIN": "Неправильний PIN",
|
||||
"App locked": "Програму заблоковано",
|
||||
"Enter your PIN": "Введіть свій PIN",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest заблоковано. Введіть свій 4-значний PIN, щоб продовжити.",
|
||||
"PIN code": "PIN-код",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Якщо ви забудете PIN, ви втратите доступ до цього пристрою. Щоб скинути його, доведеться очистити дані програми.",
|
||||
"Passphrase must be at least 8 characters": "Парольна фраза повинна містити щонайменше 8 символів",
|
||||
"Passphrases do not match": "Парольні фрази не збігаються",
|
||||
"Set sync passphrase": "Установити парольну фразу синхронізації",
|
||||
"Enter sync passphrase": "Уведіть парольну фразу синхронізації",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Парольна фраза синхронізації шифрує ваші конфіденційні поля (наприклад, облікові дані каталогу OPDS) перед синхронізацією. Ми ніколи не бачимо цю парольну фразу. Виберіть щось, що ви запам’ятаєте — без неї відновлення неможливе.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Уведіть парольну фразу синхронізації, яку ви встановили на іншому пристрої, щоб розшифрувати синхронізовані облікові дані.",
|
||||
"Confirm passphrase": "Підтвердьте парольну фразу",
|
||||
"Unlock": "Розблокувати",
|
||||
"Set PIN": "Установити PIN",
|
||||
"Change PIN": "Змінити PIN",
|
||||
"Disable PIN": "Вимкнути PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Введіть поточний PIN, а потім виберіть новий 4-значний PIN.",
|
||||
"Enter your current PIN to disable the app lock.": "Введіть поточний PIN, щоб вимкнути блокування програми.",
|
||||
"PIN must be {{length}} digits": "PIN має містити {{length}} цифр",
|
||||
"PINs do not match": "PIN-коди не збігаються",
|
||||
"Current PIN": "Поточний PIN",
|
||||
"New PIN": "Новий PIN",
|
||||
"Confirm new PIN": "Підтвердити новий PIN",
|
||||
"Manage Sync": "Керування синхронізацією",
|
||||
"Imported book files and library metadata": "Імпортовані файли книжок і метадані бібліотеки",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Остання позиція читання, закладки та налаштування для кожної книжки",
|
||||
"Highlights and notes": "Виділення та нотатки",
|
||||
"Fonts": "Шрифти",
|
||||
"Custom font files": "Користувацькі файли шрифтів",
|
||||
"Backgrounds": "Фони",
|
||||
"Custom background textures": "Користувацькі текстури фону",
|
||||
"OPDS catalogs": "Каталоги OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "Збережені URL каталогів та (зашифровані) облікові дані",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "Невірна парольна фраза синхронізації — не вдалося розшифрувати синхронізовані облікові дані",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Дані парольної фрази синхронізації на сервері було скинуто. Перешифрування облікових даних із новою парольною фразою…",
|
||||
"Failed to decrypt synced credentials": "Не вдалося розшифрувати синхронізовані облікові дані",
|
||||
"Imported dictionary bundles and settings": "Імпортовані пакети словників і налаштування",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Виберіть, що синхронізується між вашими пристроями. Вимкнення категорії зупиняє цей пристрій від надсилання або отримання записів цього типу. Те, що вже на сервері, залишається без змін, а повторне ввімкнення відновлює синхронізацію з того місця, де ви зупинилися.",
|
||||
"Data Sync": "Синхронізація даних",
|
||||
"Manage Fonts": "Керування шрифтами",
|
||||
"App settings": "Налаштування застосунку",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Тема, кольори виділень, інтеграції (KOSync, Readwise, Hardcover) і порядок словників",
|
||||
"Required while Dictionaries sync is enabled": "Потрібне, доки увімкнено синхронізацію Словників",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Скидання через {{hours}} год {{minutes}} хв",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Виберіть 4-значний PIN-код. Вам потрібно буде вводити його щоразу, коли ви відкриваєте Readest. Відновити забутий PIN-код неможливо. Очищення даних застосунку — єдиний спосіб його скинути.",
|
||||
"Credentials": "Облікові дані",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Токени, імена користувачів і паролі для OPDS, KOReader, Hardcover та Readwise. Якщо вимкнено, облікові дані залишаються лише на цьому пристрої і ніколи не вивантажуються.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Конфіденційні синхронізовані поля шифруються перед вивантаженням. Установіть парольну фразу зараз або пізніше, коли знадобиться шифрування.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Збережено в цьому обліковому записі. Вас запитають про неї під час розшифровування облікових даних.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Прогрес читання на цьому пристрої відрізняється від «{{deviceName}}».",
|
||||
"This device": "Цей пристрій",
|
||||
"Red": "Червоний",
|
||||
"Yellow": "Жовтий",
|
||||
"Green": "Зелений",
|
||||
"Blue": "Синій",
|
||||
"Violet": "Фіолетовий",
|
||||
"Edit color": "Редагувати колір",
|
||||
"Add custom color": "Додати власний колір",
|
||||
"Add label": "Додати мітку",
|
||||
"Choose color": "Вибрати колір",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Підключено до Hardcover. Остання синхронізація {{time}}.",
|
||||
"Integrations": "Інтеграції",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Підключено до Readwise. Остання синхронізація {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Переглядайте та завантажуйте книги з онлайн-каталогів.",
|
||||
"Connected as {{user}}": "Підключено як {{user}}",
|
||||
"Not connected": "Не підключено",
|
||||
"{{count}} catalog_one": "{{count}} каталог",
|
||||
"{{count}} catalog_few": "{{count}} каталоги",
|
||||
"{{count}} catalog_many": "{{count}} каталогів",
|
||||
"{{count}} catalog_other": "{{count}} каталогу",
|
||||
"No catalogs": "Немає каталогів",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Підключіть Readest до зовнішніх сервісів для синхронізації, виділень і каталогів.",
|
||||
"Reading Sync": "Синхронізація читання",
|
||||
"Content Sources": "Джерела вмісту",
|
||||
"Scroll tabs": "Прокрутити вкладки",
|
||||
"Catalog actions": "Дії каталогу",
|
||||
"File Content": "Вміст файлу",
|
||||
"Start your library": "Створіть свою бібліотеку",
|
||||
"Pick a book from your device to add it to your library.": "Виберіть книжку з вашого пристрою, щоб додати її до бібліотеки.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Перетягніть книжку будь-куди у це вікно або виберіть її з комп’ютера.",
|
||||
"Sign in to sync your library": "Увійдіть, щоб синхронізувати бібліотеку"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -102,7 +102,6 @@
|
||||
"Updated": "Cập nhật",
|
||||
"Version {{version}}": "Phiên bản {{version}}",
|
||||
"Vertical Direction": "Hướng dọc",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "Chào mừng đến với thư viện của bạn. Bạn có thể nhập sách vào đây và đọc bất cứ lúc nào.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Writing Mode": "Chế độ viết",
|
||||
"Your Library": "Thư viện của bạn",
|
||||
@@ -297,7 +296,6 @@
|
||||
"No notes match your search": "Không tìm thấy ghi chú nào",
|
||||
"Search notes and excerpts...": "Tìm ghi chú...",
|
||||
"Sign in to Sync": "Đăng nhập",
|
||||
"Synced at {{time}}": "Đã đồng bộ lúc {{time}}",
|
||||
"Never synced": "Chưa từng đồng bộ",
|
||||
"Show Remaining Time": "Hiển thị thời gian còn lại",
|
||||
"{{time}} min left in chapter": "{{time}} phút còn lại trong chương",
|
||||
@@ -457,14 +455,12 @@
|
||||
"Remove from Cloud Only": "Xóa chỉ khỏi Đám mây",
|
||||
"Remove from Device Only": "Xóa chỉ khỏi Thiết bị",
|
||||
"Disconnected": "Mất kết nối",
|
||||
"KOReader Sync Settings": "Cài đặt đồng bộ KOReader",
|
||||
"Sync Strategy": "Chiến lược đồng bộ",
|
||||
"Ask on conflict": "Hỏi khi có xung đột",
|
||||
"Always use latest": "Luôn sử dụng phiên bản mới nhất",
|
||||
"Send changes only": "Chỉ gửi thay đổi",
|
||||
"Receive changes only": "Chỉ nhận thay đổi",
|
||||
"Checksum Method": "Phương pháp kiểm tra",
|
||||
"File Content (recommended)": "Nội dung tệp (được khuyến nghị)",
|
||||
"File Name": "Tên tệp",
|
||||
"Device Name": "Tên thiết bị",
|
||||
"Connect to your KOReader Sync server.": "Kết nối với máy chủ đồng bộ KOReader của bạn.",
|
||||
@@ -475,10 +471,7 @@
|
||||
"Connect": "Kết nối",
|
||||
"KOReader Sync": "Đồng bộ KOReader",
|
||||
"Sync Conflict": "Xung đột đồng bộ",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "Đồng bộ tiến độ đọc từ \"{{deviceName}}\"?",
|
||||
"another device": "thiết bị khác",
|
||||
"Local Progress": "Tiến độ cục bộ",
|
||||
"Remote Progress": "Tiến độ từ xa",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "Trang {{page}} của {{total}} ({{percentage}}%)",
|
||||
"Current position": "Vị trí hiện tại",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "Khoảng trang {{page}} của {{total}} ({{percentage}}%)",
|
||||
@@ -631,7 +624,6 @@
|
||||
"Strikethrough": "Gạch ngang",
|
||||
"Squiggly": "Gạch ngoằn ngoèo",
|
||||
"Outline": "Đường viền",
|
||||
"Save Current Color": "Lưu màu hiện tại",
|
||||
"Quick Colors": "Màu nhanh",
|
||||
"Highlighter": "Bút đánh dấu",
|
||||
"Save Book Cover": "Lưu bìa sách",
|
||||
@@ -781,7 +773,6 @@
|
||||
"Annotate text after selection": "Chú thích văn bản sau khi chọn",
|
||||
"Search text after selection": "Tìm kiếm văn bản sau khi chọn",
|
||||
"Look up text in dictionary after selection": "Tra cứu văn bản trong từ điển sau khi chọn",
|
||||
"Look up text in Wikipedia after selection": "Tra cứu văn bản trong Wikipedia sau khi chọn",
|
||||
"Translate text after selection": "Dịch văn bản sau khi chọn",
|
||||
"Read text aloud after selection": "Đọc to văn bản sau khi chọn",
|
||||
"Proofread text after selection": "Hiệu đính văn bản sau khi chọn",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "Xuất sách thất bại.",
|
||||
"Export Book": "Xuất sách",
|
||||
"Whole word:": "Toàn bộ từ:",
|
||||
"Error": "Lỗi",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "Không thể tải bài viết. Hãy thử tìm kiếm trực tiếp trên {{link}}.",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "Không thể tải từ. Hãy thử tìm kiếm trực tiếp trên {{link}}.",
|
||||
"Date Published": "Ngày xuất bản",
|
||||
"Only for TTS:": "Chỉ dành cho TTS:",
|
||||
"Uploaded": "Đã tải lên",
|
||||
@@ -1027,16 +1015,12 @@
|
||||
"Invalid Readwise access token": "Mã xác thực Readwise không hợp lệ",
|
||||
"Disconnected from Readwise": "Đã ngắt kết nối với Readwise",
|
||||
"Never": "Không bao giờ",
|
||||
"Readwise Settings": "Cài đặt Readwise",
|
||||
"Connected to Readwise": "Đã kết nối với Readwise",
|
||||
"Last synced: {{time}}": "Lần đồng bộ cuối: {{time}}",
|
||||
"Sync Enabled": "Đã bật đồng bộ",
|
||||
"Disconnect": "Ngắt kết nối",
|
||||
"Connect your Readwise account to sync highlights.": "Kết nối tài khoản Readwise của bạn để đồng bộ các phần đánh dấu.",
|
||||
"Get your access token at": "Lấy mã xác thực tại",
|
||||
"Access Token": "Mã xác thực",
|
||||
"Paste your Readwise access token": "Dán mã xác thực Readwise của bạn vào đây",
|
||||
"Config": "Cấu hình",
|
||||
"Readwise Sync": "Đồng bộ Readwise",
|
||||
"Push Highlights": "Đẩy các phần đánh dấu",
|
||||
"Highlights synced to Readwise": "Các phần đánh dấu đã được đồng bộ với Readwise",
|
||||
@@ -1106,7 +1090,6 @@
|
||||
"Copy Selection": "Sao chép vùng chọn",
|
||||
"Translate Selection": "Dịch vùng chọn",
|
||||
"Dictionary Lookup": "Tra từ điển",
|
||||
"Wikipedia Lookup": "Tra cứu Wikipedia",
|
||||
"Read Aloud Selection": "Đọc to vùng chọn",
|
||||
"Proofread Selection": "Kiểm tra vùng chọn",
|
||||
"Open Settings": "Mở cài đặt",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "Kéo để tìm kiếm",
|
||||
"Punctuation Delay": "Độ trễ dấu câu",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "Vui lòng xác nhận rằng kết nối OPDS này sẽ được chuyển tiếp qua máy chủ Readest trên ứng dụng web trước khi tiếp tục.",
|
||||
"Custom Headers": "Tiêu đề tùy chỉnh",
|
||||
"Custom Headers (optional)": "Tiêu đề tùy chỉnh (tùy chọn)",
|
||||
"Add one header per line using \"Header-Name: value\".": "Thêm một tiêu đề mỗi dòng sử dụng \"Header-Name: value\".",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "Tôi hiểu rằng kết nối OPDS này sẽ được chuyển tiếp qua máy chủ Readest trên ứng dụng web. Nếu tôi không tin tưởng Readest với các thông tin đăng nhập hoặc tiêu đề này, tôi nên sử dụng ứng dụng gốc.",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "Không thể kết nối với Hardcover. Vui lòng kiểm tra kết nối mạng của bạn.",
|
||||
"Invalid Hardcover API token": "Token API Hardcover không hợp lệ",
|
||||
"Disconnected from Hardcover": "Đã ngắt kết nối khỏi Hardcover",
|
||||
"Hardcover Settings": "Cài đặt Hardcover",
|
||||
"Connected to Hardcover": "Đã kết nối với Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "Kết nối tài khoản Hardcover của bạn để đồng bộ tiến trình đọc và ghi chú.",
|
||||
"Get your API token from hardcover.app → Settings → API.": "Lấy token API của bạn từ hardcover.app → Cài đặt → API.",
|
||||
"API Token": "Token API",
|
||||
"Paste your Hardcover API token": "Dán token API Hardcover của bạn",
|
||||
"Hardcover sync enabled for this book": "Đồng bộ Hardcover đã được bật cho cuốn sách này",
|
||||
"Hardcover sync disabled for this book": "Đồng bộ Hardcover đã được tắt cho cuốn sách này",
|
||||
"Hardcover Sync": "Đồng bộ Hardcover",
|
||||
"Enable for This Book": "Bật cho cuốn sách này",
|
||||
"Push Notes": "Gửi ghi chú",
|
||||
"Enable Hardcover sync for this book first.": "Bật đồng bộ Hardcover cho cuốn sách này trước.",
|
||||
"No annotations or excerpts to sync for this book.": "Không có chú thích hoặc trích đoạn nào để đồng bộ cho cuốn sách này.",
|
||||
"Configure Hardcover in Settings first.": "Cấu hình Hardcover trong Cài đặt trước.",
|
||||
"No new Hardcover note changes to sync.": "Không có thay đổi ghi chú Hardcover mới để đồng bộ.",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "Tách gạch nối",
|
||||
"Apply Theme Colors to PDF": "Áp dụng màu chủ đề cho PDF",
|
||||
"Name": "Tên",
|
||||
"Unavailable": "Không khả dụng",
|
||||
"Remove": "Xóa",
|
||||
"Edit OPDS Catalog": "Chỉnh sửa danh mục OPDS",
|
||||
"Save Changes": "Lưu thay đổi",
|
||||
"Use Book Layout": "Sử dụng bố cục sách"
|
||||
"Use Book Layout": "Sử dụng bố cục sách",
|
||||
"End of this section. Continue to the next.": "Kết thúc phần này. Tiếp tục đến phần tiếp theo.",
|
||||
"Auto-download": "Tự động tải xuống",
|
||||
"Auto-download new items": "Tự động tải xuống mục mới",
|
||||
"Automatically download new publications when the app syncs": "Tự động tải xuống các ấn phẩm mới khi ứng dụng đồng bộ hóa",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "Đã tải xuống {{count}} mục mới từ OPDS",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "Không thể đồng bộ {{count}} danh mục OPDS",
|
||||
"Last synced {{when}}": "Đồng bộ lần cuối {{when}}",
|
||||
"Failed downloads": "Tải xuống thất bại",
|
||||
"No failed downloads": "Không có tải xuống thất bại",
|
||||
"Attempts: {{count}}_other": "Số lần thử: {{count}}",
|
||||
"Skip": "Bỏ qua",
|
||||
"Skip all": "Bỏ qua tất cả",
|
||||
"Retry all": "Thử lại tất cả",
|
||||
"{{count}} failed_other": "{{count}} thất bại",
|
||||
"(none)": "(không có)",
|
||||
"Identifiers": "Định Danh",
|
||||
"Read (Stream)": "Đọc (Stream)",
|
||||
"Failed to start stream": "Không thể bắt đầu stream",
|
||||
"No dictionaries enabled": "Chưa kích hoạt từ điển nào",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "Bật từ điển trong Cài đặt → Ngôn ngữ → Từ điển.",
|
||||
"Wiktionary": "Wiktionary",
|
||||
"Drag to reorder": "Kéo để sắp xếp lại",
|
||||
"Built-in": "Tích hợp",
|
||||
"Bundle is missing on this device. Re-import to use it.": "Gói không có trên thiết bị này. Nhập lại để sử dụng.",
|
||||
"This dictionary format is not supported.": "Định dạng từ điển này không được hỗ trợ.",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "Đã nhập {{count}} từ điển",
|
||||
"Skipped incomplete bundles: {{names}}": "Đã bỏ qua các gói chưa đầy đủ: {{names}}",
|
||||
"Failed to import dictionary: {{message}}": "Không thể nhập từ điển: {{message}}",
|
||||
"Dictionaries": "Từ điển",
|
||||
"Delete Dictionary": "Xoá từ điển",
|
||||
"Importing…": "Đang nhập…",
|
||||
"Import Dictionary": "Nhập từ điển",
|
||||
"No dictionaries available.": "Không có từ điển.",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Gói StarDict cần các tệp .ifo, .idx và .dict.dz (.syn tuỳ chọn).",
|
||||
"Select all the bundle files together when importing.": "Chọn tất cả các tệp của gói cùng lúc khi nhập.",
|
||||
"Manage Dictionaries": "Quản lý từ điển",
|
||||
"Select Dictionary Files": "Chọn tệp từ điển",
|
||||
"Read on Wikipedia →": "Đọc trên Wikipedia →",
|
||||
"This link can't be opened": "Không thể mở liên kết này",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "Liên kết chú thích thiếu thông tin cần thiết. Liên kết gốc có thể đã bị cắt ngắn.",
|
||||
"Go to Readest": "Đến Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "Trình đọc ebook mã nguồn mở cho mọi người, trên mọi thiết bị.",
|
||||
"Open in Readest": "Mở trong Readest",
|
||||
"If Readest didn't open automatically, choose an option below:": "Nếu Readest không tự mở, hãy chọn một tuỳ chọn bên dưới:",
|
||||
"Continue reading where you left off.": "Đọc tiếp từ nơi bạn đã dừng lại.",
|
||||
"Readest logo": "Biểu trưng Readest",
|
||||
"Opening Readest...": "Đang mở Readest…",
|
||||
"Open in Readest app": "Mở trong ứng dụng Readest",
|
||||
"Continue in browser": "Tiếp tục trong trình duyệt",
|
||||
"Don't have Readest?": "Bạn chưa có Readest?",
|
||||
"Book not in your library": "Sách không có trong thư viện của bạn",
|
||||
"Share Book": "Chia sẻ sách",
|
||||
"Could not create share link": "Không thể tạo liên kết chia sẻ",
|
||||
"Link copied": "Đã sao chép liên kết",
|
||||
"Could not copy link": "Không thể sao chép liên kết",
|
||||
"Share revoked": "Đã thu hồi chia sẻ",
|
||||
"Could not revoke share": "Không thể thu hồi chia sẻ",
|
||||
"Uploading book…": "Đang tải lên sách…",
|
||||
"Generating…": "Đang tạo…",
|
||||
"Generate share link": "Tạo liên kết chia sẻ",
|
||||
"Share URL": "URL chia sẻ",
|
||||
"Copy link": "Sao chép liên kết",
|
||||
"Copied": "Đã sao chép",
|
||||
"Share via…": "Chia sẻ qua…",
|
||||
"Expires {{date}}": "Hết hạn vào {{date}}",
|
||||
"Revoking…": "Đang thu hồi…",
|
||||
"Revoke share": "Thu hồi chia sẻ",
|
||||
"Sign in to share books": "Đăng nhập để chia sẻ sách",
|
||||
"Expiring soon": "Sắp hết hạn",
|
||||
"Missing share token": "Thiếu mã chia sẻ",
|
||||
"Could not add to your library": "Không thể thêm vào thư viện của bạn",
|
||||
"This share link is no longer available": "Liên kết chia sẻ này không còn khả dụng",
|
||||
"The original link may have expired or been revoked.": "Liên kết gốc có thể đã hết hạn hoặc bị thu hồi.",
|
||||
"Get Readest": "Tải Readest",
|
||||
"Loading shared book…": "Đang tải sách được chia sẻ…",
|
||||
"Adding…": "Đang thêm…",
|
||||
"Add to my library": "Thêm vào thư viện của tôi",
|
||||
"Could not load your shares": "Không thể tải danh sách chia sẻ của bạn",
|
||||
"Revoked": "Đã thu hồi",
|
||||
"Expired": "Đã hết hạn",
|
||||
"Shared books": "Sách đã chia sẻ",
|
||||
"You haven't shared any books yet": "Bạn chưa chia sẻ cuốn sách nào",
|
||||
"Open a book and tap Share to send it to a friend.": "Mở một cuốn sách và nhấn Chia sẻ để gửi cho bạn bè.",
|
||||
"{{count}} active_other": "{{count}} đang hoạt động",
|
||||
"{{count}} downloads_other": "{{count}} lượt tải",
|
||||
"starts at saved page": "bắt đầu tại trang đã lưu",
|
||||
"More actions": "Thao tác khác",
|
||||
"Loading…": "Đang tải…",
|
||||
"Load more": "Tải thêm",
|
||||
"Could not load shared book": "Không thể tải sách được chia sẻ",
|
||||
"The share link is missing required information.": "Liên kết chia sẻ thiếu thông tin cần thiết.",
|
||||
"Please check your connection and try again.": "Vui lòng kiểm tra kết nối và thử lại.",
|
||||
"Sign in to import shared books": "Đăng nhập để nhập sách được chia sẻ",
|
||||
"Already in your library": "Đã có trong thư viện của bạn",
|
||||
"Added to your library": "Đã thêm vào thư viện của bạn",
|
||||
"Could not import shared book": "Không thể nhập sách được chia sẻ",
|
||||
"Manage Shared Links": "Quản lý liên kết chia sẻ",
|
||||
"Expires in": "Hết hạn sau",
|
||||
"{{count}} days_other": "{{count}} ngày",
|
||||
"Expires in {{count}} days_other": "Hết hạn sau {{count}} ngày",
|
||||
"Expires in {{count}} hours_other": "Hết hạn sau {{count}} giờ",
|
||||
"Open in app": "Mở trong ứng dụng",
|
||||
"Shared with you": "Được chia sẻ với bạn",
|
||||
"Downloading… {{percent}}%": "Đang tải xuống… {{percent}}%",
|
||||
"Import progress": "Tiến độ nhập",
|
||||
"Share reading progress": "Chia sẻ tiến độ đọc",
|
||||
"Includes your reading progress": "Bao gồm tiến độ đọc của bạn",
|
||||
"Synced {{time}}": "Đã đồng bộ {{time}}",
|
||||
"Sync Info": "Thông tin đồng bộ",
|
||||
"Last Synced": "Đồng bộ lần cuối",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "Gói DICT cần một tệp .index và một tệp .dict.dz.",
|
||||
"Slob bundles need a .slob file.": "Gói Slob cần một tệp .slob.",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "Mẫu URL phải bắt đầu bằng http(s):// và chứa %WORD%.",
|
||||
"Web": "Web",
|
||||
"Add Web Search": "Thêm tìm kiếm web",
|
||||
"Edit Web Search": "Sửa tìm kiếm web",
|
||||
"e.g. Google": "vd. Google",
|
||||
"URL Template": "Mẫu URL",
|
||||
"Use %WORD% where the looked-up word should appear.": "Dùng %WORD% tại vị trí mà từ tra cứu sẽ xuất hiện.",
|
||||
"Open the search result in your browser:": "Mở kết quả tìm kiếm trong trình duyệt của bạn:",
|
||||
"Open in {{name}}": "Mở trong {{name}}",
|
||||
"Book Fingerprint": "Dấu vân tay sách",
|
||||
"Search the web": "Tìm kiếm trên web",
|
||||
"App deeplink (readest://)": "Liên kết sâu của ứng dụng (readest://)",
|
||||
"Universal web link (https://)": "Liên kết web phổ quát (https://)",
|
||||
"Name cannot be empty.": "Tên không được để trống.",
|
||||
"Replaced {{count}} existing dictionary_other": "Đã thay thế {{count}} từ điển hiện có",
|
||||
"Cancel Edit": "Hủy chỉnh sửa",
|
||||
"Edit Dictionary": "Chỉnh sửa từ điển",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Gói MDict sử dụng tệp .mdx; các tệp .mdd và .css đi kèm là tùy chọn.",
|
||||
"Dictionary name": "Tên từ điển",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Không thể phát âm thanh này tại đây — từ điển dùng định dạng đã lỗi thời. Hãy thử từ điển có âm thanh Opus, MP3 hoặc WAV.",
|
||||
"File uploaded: {{title}}": "Tệp đã tải lên: {{title}}",
|
||||
"File downloaded: {{title}}": "Tệp đã tải về: {{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "Đã xóa bản sao đám mây của tệp: {{title}}",
|
||||
"Failed to upload file: {{title}}": "Không thể tải lên tệp: {{title}}",
|
||||
"Failed to download file: {{title}}": "Không thể tải về tệp: {{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "Không thể xóa bản sao đám mây của tệp: {{title}}",
|
||||
"{{percentage}}% used": "Đã dùng {{percentage}}%",
|
||||
"Set PIN…": "Đặt mã PIN…",
|
||||
"Require a 4-digit PIN to open Readest": "Yêu cầu mã PIN 4 chữ số để mở Readest",
|
||||
"Change PIN…": "Thay đổi mã PIN…",
|
||||
"Disable PIN…": "Tắt mã PIN…",
|
||||
"Sync passphrase ready": "Cụm mật khẩu đồng bộ đã sẵn sàng",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "Điều này sẽ xóa vĩnh viễn các thông tin đăng nhập đã mã hóa mà chúng tôi đồng bộ (ví dụ: mật khẩu danh mục OPDS) trên mọi thiết bị. Các bản sao cục bộ được giữ lại. Bạn sẽ cần nhập lại cụm mật khẩu đồng bộ hoặc đặt cụm mới. Tiếp tụ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 đã mã hóa đã được xóa",
|
||||
"Sync passphrase": "Cụm mật khẩu đồng bộ",
|
||||
"Set passphrase": "Đặt cụm mật khẩu",
|
||||
"Forgot passphrase": "Quên cụm mật khẩu",
|
||||
"Incorrect PIN": "Mã PIN không đúng",
|
||||
"App locked": "Ứng dụng đã khóa",
|
||||
"Enter your PIN": "Nhập mã PIN của bạn",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest đã bị khóa. Nhập mã PIN 4 chữ số của bạn để tiếp tục.",
|
||||
"PIN code": "Mã PIN",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "Quên mã PIN sẽ khiến bạn bị khóa khỏi thiết bị này. Bạn sẽ cần xóa dữ liệu của ứng dụng để đặt lại.",
|
||||
"Passphrase must be at least 8 characters": "Cụm mật khẩu phải có ít nhất 8 ký tự",
|
||||
"Passphrases do not match": "Các cụm mật khẩu không khớp",
|
||||
"Set sync passphrase": "Đặt cụm mật khẩu đồng bộ",
|
||||
"Enter sync passphrase": "Nhập cụm mật khẩu đồng bộ",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "Cụm mật khẩu đồng bộ mã hóa các trường nhạy cảm của bạn (như thông tin đăng nhập danh mục OPDS) trước khi đồng bộ. Chúng tôi không bao giờ thấy cụm mật khẩu này. Chọn một cụm dễ nhớ — không thể khôi phục nếu thiếu nó.",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "Nhập cụm mật khẩu đồng bộ mà bạn đã đặt trên thiết bị khác để giải mã thông tin đăng nhập đã đồng bộ.",
|
||||
"Confirm passphrase": "Xác nhận cụm mật khẩu",
|
||||
"Unlock": "Mở khóa",
|
||||
"Set PIN": "Đặt mã PIN",
|
||||
"Change PIN": "Thay đổi mã PIN",
|
||||
"Disable PIN": "Tắt mã PIN",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "Nhập mã PIN hiện tại của bạn, sau đó chọn mã PIN 4 chữ số mới.",
|
||||
"Enter your current PIN to disable the app lock.": "Nhập mã PIN hiện tại của bạn để tắt khóa ứng dụng.",
|
||||
"PIN must be {{length}} digits": "Mã PIN phải có {{length}} chữ số",
|
||||
"PINs do not match": "Mã PIN không khớp",
|
||||
"Current PIN": "Mã PIN hiện tại",
|
||||
"New PIN": "Mã PIN mới",
|
||||
"Confirm new PIN": "Xác nhận mã PIN mới",
|
||||
"Manage Sync": "Quản lý đồng bộ",
|
||||
"Imported book files and library metadata": "Tệp sách đã nhập và siêu dữ liệu thư viện",
|
||||
"Last-read position, bookmarks, and per-book preferences": "Vị trí đọc cuối, dấu trang và tuỳ chọn theo từng sách",
|
||||
"Highlights and notes": "Tô sáng và ghi chú",
|
||||
"Fonts": "Phông chữ",
|
||||
"Custom font files": "Tệp phông chữ tuỳ chỉnh",
|
||||
"Backgrounds": "Hình nền",
|
||||
"Custom background textures": "Họa tiết nền tuỳ chỉnh",
|
||||
"OPDS catalogs": "Danh mục OPDS",
|
||||
"Saved catalog URLs and (encrypted) credentials": "URL danh mục đã lưu và thông tin đăng nhập (đã mã hoá)",
|
||||
"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 đăng nhập đã đồng bộ",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "Dữ liệu cụm mật khẩu đồng bộ trên máy chủ đã được đặt lại. Đang mã hoá lại thông tin đăng nhập của bạn bằng cụm mật khẩu mới…",
|
||||
"Failed to decrypt synced credentials": "Không thể giải mã thông tin đăng nhập đã đồng bộ",
|
||||
"Imported dictionary bundles and settings": "Gói từ điển đã nhập và cài đặt",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "Chọn những gì sẽ đồng bộ giữa các thiết bị của bạn. Tắt một danh mục sẽ ngăn thiết bị này gửi hoặc nhận các mục thuộc loại đó. Bất kỳ dữ liệu nào đã có trên máy chủ vẫn được giữ nguyên, bật lại sẽ tiếp tục từ nơi bạn đã dừng.",
|
||||
"Data Sync": "Đồng bộ dữ liệu",
|
||||
"Manage Fonts": "Quản lý phông chữ",
|
||||
"App settings": "Cài đặt ứng dụng",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "Chủ đề, màu tô sáng, tích hợp (KOSync, Readwise, Hardcover) và thứ tự từ điển",
|
||||
"Required while Dictionaries sync is enabled": "Bắt buộc khi đồng bộ Từ điển đang bật",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Đặt lại sau {{hours}} g {{minutes}} ph",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Chọn mã PIN 4 chữ số. Bạn sẽ cần nhập mã mỗi khi mở Readest. Không có cách nào để khôi phục mã PIN đã quên. Xóa dữ liệu ứng dụng là cách duy nhất để đặt lại mã.",
|
||||
"Credentials": "Thông tin xác thực",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Mã thông báo, tên người dùng và mật khẩu cho OPDS, KOReader, Hardcover và Readwise. Khi bị tắt, thông tin xác thực chỉ ở trên thiết bị này và không bao giờ được tải lên.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Các trường đồng bộ nhạy cảm được mã hóa trước khi tải lên. Đặt cụm mật khẩu ngay bây giờ hoặc sau khi cần mã hóa.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Đã lưu vào tài khoản này. Bạn sẽ được nhắc nhập khi cần giải mã thông tin xác thực.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Tiến trình đọc trên thiết bị này khác với \"{{deviceName}}\".",
|
||||
"This device": "Thiết bị này",
|
||||
"Red": "Đỏ",
|
||||
"Yellow": "Vàng",
|
||||
"Green": "Xanh lá",
|
||||
"Blue": "Xanh dương",
|
||||
"Violet": "Tím",
|
||||
"Edit color": "Chỉnh sửa màu",
|
||||
"Add custom color": "Thêm màu tùy chỉnh",
|
||||
"Add label": "Thêm nhãn",
|
||||
"Choose color": "Chọn màu",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "Đã kết nối với Hardcover. Đồng bộ lần cuối {{time}}.",
|
||||
"Integrations": "Tích hợp",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "Đã kết nối với Readwise. Đồng bộ lần cuối {{time}}.",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "Duyệt và tải xuống sách từ các danh mục trực tuyến.",
|
||||
"Connected as {{user}}": "Đã kết nối với tư cách {{user}}",
|
||||
"Not connected": "Chưa kết nối",
|
||||
"{{count}} catalog_other": "{{count}} danh mục",
|
||||
"No catalogs": "Không có danh mục",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "Kết nối Readest với các dịch vụ bên ngoài để đồng bộ, đánh dấu và danh mục.",
|
||||
"Reading Sync": "Đồng bộ Đọc",
|
||||
"Content Sources": "Nguồn Nội dung",
|
||||
"Scroll tabs": "Cuộn thẻ",
|
||||
"Catalog actions": "Hành động danh mục",
|
||||
"File Content": "Nội dung tệp",
|
||||
"Start your library": "Bắt đầu thư viện của bạn",
|
||||
"Pick a book from your device to add it to your library.": "Chọn một cuốn sách từ thiết bị để thêm vào thư viện của bạn.",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "Thả một cuốn sách vào bất kỳ đâu trên cửa sổ này, hoặc chọn một cuốn từ máy tính của bạn.",
|
||||
"Sign in to sync your library": "Đăng nhập để đồng bộ thư viện của bạn"
|
||||
}
|
||||
|
||||
@@ -103,7 +103,6 @@
|
||||
"Updated": "更新日期",
|
||||
"Version {{version}}": "版本 {{version}}",
|
||||
"Vertical Direction": "竖排",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "书库空空如也,您可以导入您的书籍并随时阅读。",
|
||||
"Wikipedia": "维基百科",
|
||||
"Writing Mode": "排版模式",
|
||||
"Your Library": "书库",
|
||||
@@ -298,7 +297,6 @@
|
||||
"No notes match your search": "未找到匹配的笔记",
|
||||
"Search notes and excerpts...": "搜索笔记...",
|
||||
"Sign in to Sync": "登录后同步",
|
||||
"Synced at {{time}}": "同步于:{{time}}",
|
||||
"Never synced": "从未同步",
|
||||
"Show Remaining Time": "显示剩余时间",
|
||||
"{{time}} min left in chapter": "本章剩余 {{time}} 分钟",
|
||||
@@ -458,14 +456,12 @@
|
||||
"Remove from Cloud Only": "仅从云端移除",
|
||||
"Remove from Device Only": "仅从设备中移除",
|
||||
"Disconnected": "已断开连接",
|
||||
"KOReader Sync Settings": "KOReader 同步设置",
|
||||
"Sync Strategy": "同步策略",
|
||||
"Ask on conflict": "发生冲突时询问",
|
||||
"Always use latest": "始终使用最新",
|
||||
"Send changes only": "仅发送更改",
|
||||
"Receive changes only": "仅接收更改",
|
||||
"Checksum Method": "校验和方法",
|
||||
"File Content (recommended)": "文件内容(推荐)",
|
||||
"File Name": "文件名",
|
||||
"Device Name": "设备名称",
|
||||
"Connect to your KOReader Sync server.": "连接到您的 KOReader 同步服务器。",
|
||||
@@ -476,10 +472,7 @@
|
||||
"Connect": "连接",
|
||||
"KOReader Sync": "KOReader 同步",
|
||||
"Sync Conflict": "同步冲突",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "从 \"{{deviceName}}\" 同步阅读进度?",
|
||||
"another device": "另一台设备",
|
||||
"Local Progress": "本地进度",
|
||||
"Remote Progress": "远程进度",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "第 {{page}} 页,共 {{total}} 页 ({{percentage}}%)",
|
||||
"Current position": "当前位置",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "大约第 {{page}} 页,共 {{total}} 页 ({{percentage}}%)",
|
||||
@@ -632,7 +625,6 @@
|
||||
"Strikethrough": "删除线",
|
||||
"Squiggly": "波浪线",
|
||||
"Outline": "轮廓",
|
||||
"Save Current Color": "保存当前颜色",
|
||||
"Quick Colors": "快速颜色",
|
||||
"Highlighter": "荧光笔",
|
||||
"Save Book Cover": "保存书籍封面",
|
||||
@@ -752,7 +744,7 @@
|
||||
"Search in OPDS Catalog...": "在 OPDS 目录中搜索...",
|
||||
"Please log in to use advanced TTS features": "请登录以使用高级 TTS 功能",
|
||||
"Word limit of 30 words exceeded.": "已超过 30 个词的限制。",
|
||||
"Proofread": "校对",
|
||||
"Proofread": "文字校对",
|
||||
"Current selection": "当前选中内容",
|
||||
"All occurrences in this book": "本书中的所有出现位置",
|
||||
"All occurrences in your library": "整个书库中的所有出现位置",
|
||||
@@ -765,7 +757,7 @@
|
||||
"Library": "书库",
|
||||
"Yes": "是",
|
||||
"No": "否",
|
||||
"Proofread Replacement Rules": "校对替换规则",
|
||||
"Proofread Replacement Rules": "文字校对替换规则",
|
||||
"Selected Text Rules": "选中文本规则",
|
||||
"No selected text replacement rules": "暂无选中文本的替换规则",
|
||||
"Book Specific Rules": "书籍范围规则",
|
||||
@@ -782,10 +774,9 @@
|
||||
"Annotate text after selection": "注释选中文本",
|
||||
"Search text after selection": "搜索选中文本",
|
||||
"Look up text in dictionary after selection": "在字典中查找选中文本",
|
||||
"Look up text in Wikipedia after selection": "在维基百科中查找选中文本",
|
||||
"Translate text after selection": "翻译选中文本",
|
||||
"Read text aloud after selection": "朗读选中文本",
|
||||
"Proofread text after selection": "校对选中文本",
|
||||
"Proofread text after selection": "文字校对选中文本",
|
||||
"{{activeCount}} active, {{pendingCount}} pending": "{{activeCount}} 进行中,{{pendingCount}} 等待中",
|
||||
"{{failedCount}} failed": "{{failedCount}} 失败",
|
||||
"Waiting...": "等待中...",
|
||||
@@ -830,9 +821,6 @@
|
||||
"Export Book": "导出书籍",
|
||||
"Whole word:": "全词匹配:",
|
||||
"Only for TTS:": "仅用于TTS:",
|
||||
"Error": "错误",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "无法加载文章。请直接在 {{link}} 上搜索。",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "无法加载词汇。请直接在 {{link}} 上搜索。",
|
||||
"Date Published": "出版日期",
|
||||
"Uploaded": "已上传",
|
||||
"Downloaded": "已下载",
|
||||
@@ -1028,24 +1016,20 @@
|
||||
"Invalid Readwise access token": "无效的 Readwise 访问令牌",
|
||||
"Disconnected from Readwise": "已断开与 Readwise 的连接",
|
||||
"Never": "从不",
|
||||
"Readwise Settings": "Readwise 设置",
|
||||
"Connected to Readwise": "已连接到 Readwise",
|
||||
"Last synced: {{time}}": "上次同步时间:{{time}}",
|
||||
"Sync Enabled": "同步已启用",
|
||||
"Disconnect": "断开连接",
|
||||
"Connect your Readwise account to sync highlights.": "连接您的 Readwise 账户以同步高亮内容。",
|
||||
"Get your access token at": "获取您的访问令牌:",
|
||||
"Access Token": "访问令牌",
|
||||
"Paste your Readwise access token": "粘贴您的 Readwise 访问令牌",
|
||||
"Config": "配置",
|
||||
"Readwise Sync": "Readwise 同步",
|
||||
"Push Highlights": "推送高亮内容",
|
||||
"Highlights synced to Readwise": "高亮内容已同步到 Readwise",
|
||||
"Readwise sync failed: no internet connection": "Readwise 同步失败:无网络连接",
|
||||
"Readwise sync failed: {{error}}": "Readwise 同步失败:{{error}}",
|
||||
"System Screen Brightness": "系统屏幕亮度",
|
||||
"Page:": "页面:",
|
||||
"Page: {{number}}": "页面: {{number}}",
|
||||
"Page:": "页码:",
|
||||
"Page: {{number}}": "页码: {{number}}",
|
||||
"Annotation page number": "批注页码",
|
||||
"Translating...": "翻译中...",
|
||||
"Show Battery Percentage": "显示电量百分比",
|
||||
@@ -1106,9 +1090,8 @@
|
||||
"Copy Selection": "复制选中内容",
|
||||
"Translate Selection": "翻译选中内容",
|
||||
"Dictionary Lookup": "词典查询",
|
||||
"Wikipedia Lookup": "维基百科查询",
|
||||
"Read Aloud Selection": "朗读选中内容",
|
||||
"Proofread Selection": "校对选中内容",
|
||||
"Proofread Selection": "文字校对选中内容",
|
||||
"Open Settings": "打开设置",
|
||||
"Open Command Palette": "打开命令面板",
|
||||
"Show Keyboard Shortcuts": "显示键盘快捷键",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "拖动以定位",
|
||||
"Punctuation Delay": "标点符号停顿",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "继续前请确认此 OPDS 连接将通过网页应用中的 Readest 服务器进行代理。",
|
||||
"Custom Headers": "自定义标头",
|
||||
"Custom Headers (optional)": "自定义标头(可选)",
|
||||
"Add one header per line using \"Header-Name: value\".": "每行添加一个标头,格式为 \"Header-Name: value\"。",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "我了解此 OPDS 连接将通过网页应用中的 Readest 服务器进行代理。如果我不信任 Readest 处理这些凭据或标头,我应该使用原生应用。",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "无法连接到 Hardcover。请检查您的网络连接。",
|
||||
"Invalid Hardcover API token": "无效的 Hardcover API 令牌",
|
||||
"Disconnected from Hardcover": "已断开与 Hardcover 的连接",
|
||||
"Hardcover Settings": "Hardcover 设置",
|
||||
"Connected to Hardcover": "已连接到 Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "连接您的 Hardcover 账户以同步阅读进度和笔记。",
|
||||
"Get your API token from hardcover.app → Settings → API.": "从 hardcover.app → 设置 → API 获取您的 API 令牌。",
|
||||
"API Token": "API 令牌",
|
||||
"Paste your Hardcover API token": "粘贴您的 Hardcover API 令牌",
|
||||
"Hardcover sync enabled for this book": "已为此书启用 Hardcover 同步",
|
||||
"Hardcover sync disabled for this book": "已为此书禁用 Hardcover 同步",
|
||||
"Hardcover Sync": "Hardcover 同步",
|
||||
"Enable for This Book": "为此书启用",
|
||||
"Push Notes": "推送笔记",
|
||||
"Enable Hardcover sync for this book first.": "请先为此书启用 Hardcover 同步。",
|
||||
"No annotations or excerpts to sync for this book.": "此书没有可同步的注释或摘录。",
|
||||
"Configure Hardcover in Settings first.": "请先在设置中配置 Hardcover。",
|
||||
"No new Hardcover note changes to sync.": "没有新的 Hardcover 笔记更改需要同步。",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "拆分连字符",
|
||||
"Apply Theme Colors to PDF": "将主题颜色应用于 PDF",
|
||||
"Name": "名称",
|
||||
"Unavailable": "不可用",
|
||||
"Remove": "移除",
|
||||
"Edit OPDS Catalog": "编辑 OPDS 目录",
|
||||
"Save Changes": "保存更改",
|
||||
"Use Book Layout": "使用书籍排版"
|
||||
"Use Book Layout": "使用书籍排版",
|
||||
"End of this section. Continue to the next.": "本节结束。继续到下一节。",
|
||||
"Auto-download": "自动下载",
|
||||
"Auto-download new items": "自动下载新内容",
|
||||
"Automatically download new publications when the app syncs": "应用同步时自动下载新出版物",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "已从 OPDS 下载 {{count}} 个新内容",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "同步 {{count}} 个 OPDS 目录失败",
|
||||
"Last synced {{when}}": "上次同步 {{when}}",
|
||||
"Failed downloads": "失败的下载",
|
||||
"No failed downloads": "没有失败的下载",
|
||||
"Attempts: {{count}}_other": "尝试次数:{{count}}",
|
||||
"Skip": "跳过",
|
||||
"Skip all": "全部跳过",
|
||||
"Retry all": "全部重试",
|
||||
"{{count}} failed_other": "{{count}} 个失败",
|
||||
"(none)": "(无)",
|
||||
"Identifiers": "标识符",
|
||||
"Read (Stream)": "阅读(流式)",
|
||||
"Failed to start stream": "启动流式传输失败",
|
||||
"No dictionaries enabled": "未启用任何词典",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "在 设置 → 语言 → 词典 中启用词典。",
|
||||
"Wiktionary": "维基词典",
|
||||
"Drag to reorder": "拖动以重新排序",
|
||||
"Built-in": "内置",
|
||||
"Bundle is missing on this device. Re-import to use it.": "此设备上缺少词典文件。请重新导入以使用。",
|
||||
"This dictionary format is not supported.": "不支持此词典格式。",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "已导入 {{count}} 个词典",
|
||||
"Skipped incomplete bundles: {{names}}": "已跳过不完整的词典包:{{names}}",
|
||||
"Failed to import dictionary: {{message}}": "导入词典失败:{{message}}",
|
||||
"Dictionaries": "词典",
|
||||
"Delete Dictionary": "删除词典",
|
||||
"Importing…": "正在导入…",
|
||||
"Import Dictionary": "导入词典",
|
||||
"No dictionaries available.": "没有可用的词典。",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict 词典包需要 .ifo、.idx 和 .dict.dz 文件(.syn 可选)。",
|
||||
"Select all the bundle files together when importing.": "导入时请同时选择词典包内的所有文件。",
|
||||
"Manage Dictionaries": "管理词典",
|
||||
"Select Dictionary Files": "选择词典文件",
|
||||
"Read on Wikipedia →": "在维基百科上阅读 →",
|
||||
"This link can't be opened": "无法打开此链接",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "批注链接缺少必要信息,原链接可能被截断了。",
|
||||
"Go to Readest": "前往 Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "面向所有人、适配所有设备的开源电子书阅读器。",
|
||||
"Open in Readest": "在 Readest 中打开",
|
||||
"If Readest didn't open automatically, choose an option below:": "如果 Readest 未自动打开,请从下方选择:",
|
||||
"Continue reading where you left off.": "从上次中断的地方继续阅读。",
|
||||
"Readest logo": "Readest 标志",
|
||||
"Opening Readest...": "正在打开 Readest…",
|
||||
"Open in Readest app": "在 Readest 应用中打开",
|
||||
"Continue in browser": "在浏览器中继续",
|
||||
"Don't have Readest?": "还没有 Readest?",
|
||||
"Book not in your library": "书库中没有这本书",
|
||||
"Share Book": "分享书籍",
|
||||
"Could not create share link": "无法创建分享链接",
|
||||
"Link copied": "链接已复制",
|
||||
"Could not copy link": "无法复制链接",
|
||||
"Share revoked": "已撤销分享",
|
||||
"Could not revoke share": "无法撤销分享",
|
||||
"Uploading book…": "正在上传书籍…",
|
||||
"Generating…": "正在生成…",
|
||||
"Generate share link": "生成分享链接",
|
||||
"Share URL": "分享 URL",
|
||||
"Copy link": "复制链接",
|
||||
"Copied": "已复制",
|
||||
"Share via…": "通过…分享",
|
||||
"Expires {{date}}": "到期日 {{date}}",
|
||||
"Revoking…": "正在撤销…",
|
||||
"Revoke share": "撤销分享",
|
||||
"Sign in to share books": "登录以分享书籍",
|
||||
"Expiring soon": "即将到期",
|
||||
"Missing share token": "缺少分享令牌",
|
||||
"Could not add to your library": "无法添加到你的书库",
|
||||
"This share link is no longer available": "此分享链接已不可用",
|
||||
"The original link may have expired or been revoked.": "原始链接可能已过期或被撤销。",
|
||||
"Get Readest": "获取 Readest",
|
||||
"Loading shared book…": "正在加载共享书籍…",
|
||||
"Adding…": "正在添加…",
|
||||
"Add to my library": "加入我的书库",
|
||||
"Could not load your shares": "无法加载你的分享",
|
||||
"Revoked": "已撤销",
|
||||
"Expired": "已过期",
|
||||
"Shared books": "已分享的书籍",
|
||||
"You haven't shared any books yet": "你还没有分享过任何书籍",
|
||||
"Open a book and tap Share to send it to a friend.": "打开一本书,点按\"分享\"发送给朋友。",
|
||||
"{{count}} active_other": "{{count}} 个活动中",
|
||||
"{{count}} downloads_other": "{{count}} 次下载",
|
||||
"starts at saved page": "从保存的页面开始",
|
||||
"More actions": "更多操作",
|
||||
"Loading…": "加载中…",
|
||||
"Load more": "加载更多",
|
||||
"Could not load shared book": "无法加载共享书籍",
|
||||
"The share link is missing required information.": "分享链接缺少必要信息。",
|
||||
"Please check your connection and try again.": "请检查你的网络连接后重试。",
|
||||
"Sign in to import shared books": "登录以导入共享书籍",
|
||||
"Already in your library": "已在你的书库中",
|
||||
"Added to your library": "已加入你的书库",
|
||||
"Could not import shared book": "无法导入共享书籍",
|
||||
"Manage Shared Links": "管理分享链接",
|
||||
"Expires in": "有效期",
|
||||
"{{count}} days_other": "{{count}} 天",
|
||||
"Expires in {{count}} days_other": "{{count}} 天后到期",
|
||||
"Expires in {{count}} hours_other": "{{count}} 小时后到期",
|
||||
"Open in app": "在应用中打开",
|
||||
"Shared with you": "与你分享",
|
||||
"Downloading… {{percent}}%": "下载中… {{percent}}%",
|
||||
"Import progress": "导入进度",
|
||||
"Share reading progress": "分享阅读进度",
|
||||
"Includes your reading progress": "包含你的阅读进度",
|
||||
"Synced {{time}}": "{{time}}已同步",
|
||||
"Sync Info": "同步信息",
|
||||
"Last Synced": "上一次同步",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT 词典包需要一个 .index 文件和一个 .dict.dz 文件。",
|
||||
"Slob bundles need a .slob file.": "Slob 词典包需要一个 .slob 文件。",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL 模板必须以 http(s):// 开头并包含 %WORD%。",
|
||||
"Web": "网络",
|
||||
"Add Web Search": "添加网络搜索",
|
||||
"Edit Web Search": "编辑网络搜索",
|
||||
"e.g. Google": "例如 Google",
|
||||
"URL Template": "URL 模板",
|
||||
"Use %WORD% where the looked-up word should appear.": "在查询词应出现的位置使用 %WORD%。",
|
||||
"Open the search result in your browser:": "在浏览器中打开搜索结果:",
|
||||
"Open in {{name}}": "在 {{name}} 中打开",
|
||||
"Book Fingerprint": "书籍指纹",
|
||||
"Search the web": "网络搜索",
|
||||
"App deeplink (readest://)": "应用深度链接 (readest://)",
|
||||
"Universal web link (https://)": "通用网页链接 (https://)",
|
||||
"Name cannot be empty.": "名称不能为空。",
|
||||
"Replaced {{count}} existing dictionary_other": "已替换 {{count}} 个现有词典",
|
||||
"Cancel Edit": "取消编辑",
|
||||
"Edit Dictionary": "编辑词典",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict 包使用 .mdx 文件;附带的 .mdd 和 .css 文件可选。",
|
||||
"Dictionary name": "词典名称",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "此处无法播放该音频 — 此词典使用过时格式。请尝试使用 Opus、MP3 或 WAV 音频的词典。",
|
||||
"File uploaded: {{title}}": "文件已上传:{{title}}",
|
||||
"File downloaded: {{title}}": "文件已下载:{{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "已删除文件云副本:{{title}}",
|
||||
"Failed to upload file: {{title}}": "上传文件失败:{{title}}",
|
||||
"Failed to download file: {{title}}": "下载文件失败:{{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "未能删除文件云副本:{{title}}",
|
||||
"{{percentage}}% used": "已使用 {{percentage}}%",
|
||||
"Set PIN…": "设置 PIN 码…",
|
||||
"Require a 4-digit PIN to open Readest": "打开 Readest 时需要输入 4 位 PIN 码",
|
||||
"Change PIN…": "更改 PIN 码…",
|
||||
"Disable PIN…": "停用 PIN 码…",
|
||||
"Sync passphrase ready": "同步密语已就绪",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "这将在每台设备上永久删除我们同步的加密凭据(例如 OPDS 目录密码)。本地副本会保留。您需要重新输入同步密语或设置新的密语。是否继续?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "已忘记同步密语 — 所有加密字段已清除",
|
||||
"Sync passphrase": "同步密语",
|
||||
"Set passphrase": "设置密语",
|
||||
"Forgot passphrase": "忘记密语",
|
||||
"Incorrect PIN": "PIN 码错误",
|
||||
"App locked": "应用已锁定",
|
||||
"Enter your PIN": "请输入 PIN 码",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest 已锁定。请输入 4 位 PIN 码以继续。",
|
||||
"PIN code": "PIN 码",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "忘记 PIN 码将使您无法在此设备上使用 Readest。您需要清除应用数据才能重置。",
|
||||
"Passphrase must be at least 8 characters": "密语至少需要 8 个字符",
|
||||
"Passphrases do not match": "两次输入的密语不一致",
|
||||
"Set sync passphrase": "设置同步密语",
|
||||
"Enter sync passphrase": "输入同步密语",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "同步密语会在您的敏感字段(例如 OPDS 目录凭据)同步之前对其加密。我们从不查看此密语。请选择易记的内容 — 一旦遗失将无法恢复。",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "请输入您在其他设备上设置的同步密语,以解密已同步的凭据。",
|
||||
"Confirm passphrase": "确认密语",
|
||||
"Unlock": "解锁",
|
||||
"Set PIN": "设置 PIN 码",
|
||||
"Change PIN": "更改 PIN 码",
|
||||
"Disable PIN": "停用 PIN 码",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "请输入当前 PIN 码,然后选择新的 4 位 PIN 码。",
|
||||
"Enter your current PIN to disable the app lock.": "请输入当前 PIN 码以停用应用锁。",
|
||||
"PIN must be {{length}} digits": "PIN 码必须为 {{length}} 位",
|
||||
"PINs do not match": "PIN 码不匹配",
|
||||
"Current PIN": "当前 PIN 码",
|
||||
"New PIN": "新 PIN 码",
|
||||
"Confirm new PIN": "确认新 PIN 码",
|
||||
"Manage Sync": "管理同步",
|
||||
"Imported book files and library metadata": "导入的书籍文件和书库元数据",
|
||||
"Last-read position, bookmarks, and per-book preferences": "最近阅读位置、书签和单本书籍的偏好设置",
|
||||
"Highlights and notes": "高亮和笔记",
|
||||
"Fonts": "字体",
|
||||
"Custom font files": "自定义字体文件",
|
||||
"Backgrounds": "背景",
|
||||
"Custom background textures": "自定义背景纹理",
|
||||
"OPDS catalogs": "OPDS 目录",
|
||||
"Saved catalog URLs and (encrypted) credentials": "已保存的目录链接和(加密的)凭据",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "同步密码错误——无法解密已同步的凭据",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "服务器上的同步密码数据已被重置。正在使用新密码重新加密你的凭据……",
|
||||
"Failed to decrypt synced credentials": "无法解密已同步的凭据",
|
||||
"Imported dictionary bundles and settings": "导入的词典包和设置",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "选择哪些内容在你的设备间同步。停用某个类别后,此设备将停止发送和接收该类的记录。服务器上已有的内容不受影响,重新启用后会从你停下的位置继续同步。",
|
||||
"Data Sync": "数据同步",
|
||||
"Manage Fonts": "管理字体",
|
||||
"App settings": "应用设置",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "主题、高亮颜色、第三方集成(KOSync、Readwise、Hardcover)以及词典顺序",
|
||||
"Required while Dictionaries sync is enabled": "启用词典同步时必需",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} 小时 {{minutes}} 分钟后重置",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "请设置一个 4 位数字 PIN 码。每次打开 Readest 时都需要输入。忘记的 PIN 码无法找回,清除应用数据是重置它的唯一方法。",
|
||||
"Credentials": "凭据",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover 和 Readwise 的令牌、用户名和密码。关闭时,凭据仅保留在此设备上,永远不会上传。",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "敏感的同步字段在上传前会被加密。立即设置密码短语,或稍后在需要加密时再设置。",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "已保存到此账户。需要解密凭据时会提示您输入。",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "此设备上的阅读进度与“{{deviceName}}”不同。",
|
||||
"This device": "此设备",
|
||||
"Red": "红色",
|
||||
"Yellow": "黄色",
|
||||
"Green": "绿色",
|
||||
"Blue": "蓝色",
|
||||
"Violet": "紫色",
|
||||
"Edit color": "编辑颜色",
|
||||
"Add custom color": "添加自定义颜色",
|
||||
"Add label": "添加标签",
|
||||
"Choose color": "选择颜色",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "已连接到 Hardcover。上次同步 {{time}}。",
|
||||
"Integrations": "集成",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "已连接到 Readwise。上次同步 {{time}}。",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "浏览并下载在线目录中的图书。",
|
||||
"Connected as {{user}}": "已以 {{user}} 身份连接",
|
||||
"Not connected": "未连接",
|
||||
"{{count}} catalog_other": "{{count}} 个目录",
|
||||
"No catalogs": "无目录",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "将 Readest 连接到外部服务以进行同步、高亮和获取目录。",
|
||||
"Reading Sync": "阅读同步",
|
||||
"Content Sources": "内容来源",
|
||||
"Scroll tabs": "滚动选项卡",
|
||||
"Catalog actions": "目录操作",
|
||||
"File Content": "文件内容",
|
||||
"Start your library": "开启你的书库",
|
||||
"Pick a book from your device to add it to your library.": "从设备中挑一本书加入书库吧。",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "把书拖到窗口任意位置,或从电脑中挑选一本。",
|
||||
"Sign in to sync your library": "登录以同步书库"
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
"Updated": "更新日期",
|
||||
"Version {{version}}": "版本 {{version}}",
|
||||
"Vertical Direction": "豎排",
|
||||
"Welcome to your library. You can import your books here and read them anytime.": "書庫空空如也,您可以導入您的書籍並隨時閱讀。",
|
||||
"Wikipedia": "維基百科",
|
||||
"Writing Mode": "排版模式",
|
||||
"Your Library": "書庫",
|
||||
@@ -297,7 +296,6 @@
|
||||
"No notes match your search": "找不到符合的筆記",
|
||||
"Search notes and excerpts...": "搜尋筆記...",
|
||||
"Sign in to Sync": "登入以同步",
|
||||
"Synced at {{time}}": "同步於:{{time}}",
|
||||
"Never synced": "從未同步",
|
||||
"Show Remaining Time": "顯示剩餘時間",
|
||||
"{{time}} min left in chapter": "本章剩餘 {{time}} 分鐘",
|
||||
@@ -457,14 +455,12 @@
|
||||
"Remove from Cloud Only": "僅從雲端移除",
|
||||
"Remove from Device Only": "僅從設備中移除",
|
||||
"Disconnected": "已斷開連接",
|
||||
"KOReader Sync Settings": "KOReader 同步設置",
|
||||
"Sync Strategy": "同步策略",
|
||||
"Ask on conflict": "發生衝突時詢問",
|
||||
"Always use latest": "始終使用最新",
|
||||
"Send changes only": "僅發送更改",
|
||||
"Receive changes only": "僅接收更改",
|
||||
"Checksum Method": "校驗和方法",
|
||||
"File Content (recommended)": "文件內容(推薦)",
|
||||
"File Name": "文件名",
|
||||
"Device Name": "設備名稱",
|
||||
"Connect to your KOReader Sync server.": "連接到您的 KOReader 同步伺服器。",
|
||||
@@ -475,10 +471,7 @@
|
||||
"Connect": "連接",
|
||||
"KOReader Sync": "KOReader 同步",
|
||||
"Sync Conflict": "同步衝突",
|
||||
"Sync reading progress from \"{{deviceName}}\"?": "從 \"{{deviceName}}\" 同步閱讀進度?",
|
||||
"another device": "另一個設備",
|
||||
"Local Progress": "本地進度",
|
||||
"Remote Progress": "遠程進度",
|
||||
"Page {{page}} of {{total}} ({{percentage}}%)": "第 {{page}} 頁,共 {{total}} 頁 ({{percentage}}%)",
|
||||
"Current position": "當前位置",
|
||||
"Approximately page {{page}} of {{total}} ({{percentage}}%)": "大約第 {{page}} 頁,共 {{total}} 頁 ({{percentage}}%)",
|
||||
@@ -631,7 +624,6 @@
|
||||
"Strikethrough": "刪除線",
|
||||
"Squiggly": "波浪線",
|
||||
"Outline": "輪廓",
|
||||
"Save Current Color": "儲存目前顏色",
|
||||
"Quick Colors": "快速顏色",
|
||||
"Highlighter": "螢光筆",
|
||||
"Save Book Cover": "保存書籍封面",
|
||||
@@ -751,7 +743,7 @@
|
||||
"Search in OPDS Catalog...": "在 OPDS 目錄中搜尋...",
|
||||
"Please log in to use advanced TTS features": "請登入以使用進階 TTS 功能",
|
||||
"Word limit of 30 words exceeded.": "已超過 30 個詞的限制。",
|
||||
"Proofread": "校對",
|
||||
"Proofread": "文字校對",
|
||||
"Current selection": "目前選取內容",
|
||||
"All occurrences in this book": "本書中的所有出現位置",
|
||||
"All occurrences in your library": "整個書庫中的所有出現位置",
|
||||
@@ -764,7 +756,7 @@
|
||||
"Library": "書庫",
|
||||
"Yes": "是",
|
||||
"No": "否",
|
||||
"Proofread Replacement Rules": "校對取代規則",
|
||||
"Proofread Replacement Rules": "文字校對取代規則",
|
||||
"Selected Text Rules": "已選取文字規則",
|
||||
"No selected text replacement rules": "沒有已選取文字的取代規則",
|
||||
"Book Specific Rules": "書籍層級規則",
|
||||
@@ -781,10 +773,9 @@
|
||||
"Annotate text after selection": "註解選取後的文字",
|
||||
"Search text after selection": "搜尋選取後的文字",
|
||||
"Look up text in dictionary after selection": "在字典中查找選取後的文字",
|
||||
"Look up text in Wikipedia after selection": "在維基百科中查找選取後的文字",
|
||||
"Translate text after selection": "翻譯選取後的文字",
|
||||
"Read text aloud after selection": "朗讀選取後的文字",
|
||||
"Proofread text after selection": "校對選取後的文字",
|
||||
"Proofread text after selection": "文字校對選取後的文字",
|
||||
"{{activeCount}} active, {{pendingCount}} pending": "{{activeCount}} 進行中,{{pendingCount}} 等待中",
|
||||
"{{failedCount}} failed": "{{failedCount}} 失敗",
|
||||
"Waiting...": "等待中...",
|
||||
@@ -828,9 +819,6 @@
|
||||
"Failed to export the book.": "書籍匯出失敗。",
|
||||
"Export Book": "匯出書籍",
|
||||
"Whole word:": "全詞匹配:",
|
||||
"Error": "錯誤",
|
||||
"Unable to load the article. Try searching directly on {{link}}.": "無法載入文章。請直接在 {{link}} 上搜尋。",
|
||||
"Unable to load the word. Try searching directly on {{link}}.": "無法載入詞彙。請直接在 {{link}} 上搜尋。",
|
||||
"Date Published": "出版日期",
|
||||
"Only for TTS:": "僅用於TTS:",
|
||||
"Uploaded": "已上傳",
|
||||
@@ -1027,24 +1015,20 @@
|
||||
"Invalid Readwise access token": "無效的 Readwise 存取權杖",
|
||||
"Disconnected from Readwise": "已斷開與 Readwise 的連線",
|
||||
"Never": "從不",
|
||||
"Readwise Settings": "Readwise 設定",
|
||||
"Connected to Readwise": "已連接到 Readwise",
|
||||
"Last synced: {{time}}": "上次同步時間:{{time}}",
|
||||
"Sync Enabled": "同步已啟用",
|
||||
"Disconnect": "斷開連線",
|
||||
"Connect your Readwise account to sync highlights.": "連接您的 Readwise 帳戶以同步高亮內容。",
|
||||
"Get your access token at": "獲取您的存取權杖:",
|
||||
"Access Token": "存取權杖",
|
||||
"Paste your Readwise access token": "貼上您的 Readwise 存取權杖",
|
||||
"Config": "配置",
|
||||
"Readwise Sync": "Readwise 同步",
|
||||
"Push Highlights": "推送高亮內容",
|
||||
"Highlights synced to Readwise": "高亮內容已同步到 Readwise",
|
||||
"Readwise sync failed: no internet connection": "Readwise 同步失敗:無網路連線",
|
||||
"Readwise sync failed: {{error}}": "Readwise 同步失敗:{{error}}",
|
||||
"System Screen Brightness": "系統螢幕亮度",
|
||||
"Page:": "頁面:",
|
||||
"Page: {{number}}": "頁面: {{number}}",
|
||||
"Page:": "頁碼:",
|
||||
"Page: {{number}}": "頁碼: {{number}}",
|
||||
"Annotation page number": "註解頁碼",
|
||||
"Translating...": "翻譯中...",
|
||||
"Show Battery Percentage": "顯示電池百分比",
|
||||
@@ -1106,9 +1090,8 @@
|
||||
"Copy Selection": "複製選取內容",
|
||||
"Translate Selection": "翻譯選取內容",
|
||||
"Dictionary Lookup": "字典查詢",
|
||||
"Wikipedia Lookup": "維基百科查詢",
|
||||
"Read Aloud Selection": "朗讀選取內容",
|
||||
"Proofread Selection": "校對選取內容",
|
||||
"Proofread Selection": "文字校對選取內容",
|
||||
"Open Settings": "開啟設定",
|
||||
"Open Command Palette": "開啟指令面板",
|
||||
"Show Keyboard Shortcuts": "顯示鍵盤快捷鍵",
|
||||
@@ -1142,25 +1125,18 @@
|
||||
"Drag to seek": "拖曳以定位",
|
||||
"Punctuation Delay": "標點符號停頓",
|
||||
"Please confirm that this OPDS connection will be proxied through Readest servers on the web app before continuing.": "繼續前請確認此 OPDS 連線將透過網頁應用程式中的 Readest 伺服器進行代理。",
|
||||
"Custom Headers": "自訂標頭",
|
||||
"Custom Headers (optional)": "自訂標頭(選填)",
|
||||
"Add one header per line using \"Header-Name: value\".": "每行新增一個標頭,格式為 \"Header-Name: value\"。",
|
||||
"I understand this OPDS connection will be proxied through Readest servers on the web app. If I do not trust Readest with these credentials or headers, I should use the native app instead.": "我了解此 OPDS 連線將透過網頁應用程式中的 Readest 伺服器進行代理。若我不信任 Readest 處理這些憑證或標頭,我應該使用原生應用程式。",
|
||||
"Unable to connect to Hardcover. Please check your network connection.": "無法連線到 Hardcover。請檢查您的網路連線。",
|
||||
"Invalid Hardcover API token": "無效的 Hardcover API 權杖",
|
||||
"Disconnected from Hardcover": "已中斷與 Hardcover 的連線",
|
||||
"Hardcover Settings": "Hardcover 設定",
|
||||
"Connected to Hardcover": "已連線到 Hardcover",
|
||||
"Connect your Hardcover account to sync reading progress and notes.": "連結您的 Hardcover 帳戶以同步閱讀進度和筆記。",
|
||||
"Get your API token from hardcover.app → Settings → API.": "從 hardcover.app → 設定 → API 取得您的 API 權杖。",
|
||||
"API Token": "API 權杖",
|
||||
"Paste your Hardcover API token": "貼上您的 Hardcover API 權杖",
|
||||
"Hardcover sync enabled for this book": "已為此書啟用 Hardcover 同步",
|
||||
"Hardcover sync disabled for this book": "已為此書停用 Hardcover 同步",
|
||||
"Hardcover Sync": "Hardcover 同步",
|
||||
"Enable for This Book": "為此書啟用",
|
||||
"Push Notes": "推送筆記",
|
||||
"Enable Hardcover sync for this book first.": "請先為此書啟用 Hardcover 同步。",
|
||||
"No annotations or excerpts to sync for this book.": "此書沒有可同步的註釋或摘錄。",
|
||||
"Configure Hardcover in Settings first.": "請先在設定中配置 Hardcover。",
|
||||
"No new Hardcover note changes to sync.": "沒有新的 Hardcover 筆記變更需要同步。",
|
||||
@@ -1174,9 +1150,242 @@
|
||||
"Split Hyphens": "拆分連字號",
|
||||
"Apply Theme Colors to PDF": "將主題顏色套用至 PDF",
|
||||
"Name": "名稱",
|
||||
"Unavailable": "無法使用",
|
||||
"Remove": "移除",
|
||||
"Edit OPDS Catalog": "編輯 OPDS 目錄",
|
||||
"Save Changes": "儲存變更",
|
||||
"Use Book Layout": "使用書籍排版"
|
||||
"Use Book Layout": "使用書籍排版",
|
||||
"End of this section. Continue to the next.": "本節結束。繼續到下一節。",
|
||||
"Auto-download": "自動下載",
|
||||
"Auto-download new items": "自動下載新項目",
|
||||
"Automatically download new publications when the app syncs": "應用同步時自動下載新出版物",
|
||||
"{{count}} new item(s) downloaded from OPDS_other": "已從 OPDS 下載 {{count}} 個新項目",
|
||||
"Failed to sync {{count}} OPDS catalog(s)_other": "同步 {{count}} 個 OPDS 目錄失敗",
|
||||
"Last synced {{when}}": "上次同步 {{when}}",
|
||||
"Failed downloads": "失敗的下載",
|
||||
"No failed downloads": "沒有失敗的下載",
|
||||
"Attempts: {{count}}_other": "嘗試次數:{{count}}",
|
||||
"Skip": "跳過",
|
||||
"Skip all": "全部跳過",
|
||||
"Retry all": "全部重試",
|
||||
"{{count}} failed_other": "{{count}} 個失敗",
|
||||
"(none)": "(無)",
|
||||
"Identifiers": "識別碼",
|
||||
"Read (Stream)": "閱讀(串流)",
|
||||
"Failed to start stream": "無法啟動串流",
|
||||
"No dictionaries enabled": "未啟用任何詞典",
|
||||
"Enable a dictionary in Settings → Language → Dictionaries.": "在 設定 → 語言 → 詞典 中啟用詞典。",
|
||||
"Wiktionary": "維基詞典",
|
||||
"Drag to reorder": "拖曳以重新排序",
|
||||
"Built-in": "內建",
|
||||
"Bundle is missing on this device. Re-import to use it.": "此裝置上缺少詞典檔案。請重新匯入以使用。",
|
||||
"This dictionary format is not supported.": "不支援此詞典格式。",
|
||||
"MDict": "MDict",
|
||||
"StarDict": "StarDict",
|
||||
"Imported {{count}} dictionary_other": "已匯入 {{count}} 個詞典",
|
||||
"Skipped incomplete bundles: {{names}}": "已略過不完整的詞典套件:{{names}}",
|
||||
"Failed to import dictionary: {{message}}": "匯入詞典失敗:{{message}}",
|
||||
"Dictionaries": "詞典",
|
||||
"Delete Dictionary": "刪除詞典",
|
||||
"Importing…": "正在匯入…",
|
||||
"Import Dictionary": "匯入詞典",
|
||||
"No dictionaries available.": "沒有可用的詞典。",
|
||||
"StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict 詞典套件需要 .ifo、.idx 和 .dict.dz 檔案(.syn 選用)。",
|
||||
"Select all the bundle files together when importing.": "匯入時請同時選擇詞典套件內的所有檔案。",
|
||||
"Manage Dictionaries": "管理詞典",
|
||||
"Select Dictionary Files": "選擇詞典檔案",
|
||||
"Read on Wikipedia →": "在維基百科上閱讀 →",
|
||||
"This link can't be opened": "無法開啟此連結",
|
||||
"The annotation link is missing required information. The original link may have been truncated.": "批註連結缺少必要資訊,原始連結可能已被截斷。",
|
||||
"Go to Readest": "前往 Readest",
|
||||
"Open-source ebook reader for everyone, on every device.": "為所有人、所有裝置打造的開源電子書閱讀器。",
|
||||
"Open in Readest": "在 Readest 中開啟",
|
||||
"If Readest didn't open automatically, choose an option below:": "若 Readest 未自動開啟,請從下方選擇:",
|
||||
"Continue reading where you left off.": "從上次離開的地方繼續閱讀。",
|
||||
"Readest logo": "Readest 標誌",
|
||||
"Opening Readest...": "正在開啟 Readest…",
|
||||
"Open in Readest app": "在 Readest 應用程式中開啟",
|
||||
"Continue in browser": "在瀏覽器中繼續",
|
||||
"Don't have Readest?": "還沒有 Readest?",
|
||||
"Book not in your library": "書庫中沒有這本書",
|
||||
"Share Book": "分享書籍",
|
||||
"Could not create share link": "無法建立分享連結",
|
||||
"Link copied": "已複製連結",
|
||||
"Could not copy link": "無法複製連結",
|
||||
"Share revoked": "已撤銷分享",
|
||||
"Could not revoke share": "無法撤銷分享",
|
||||
"Uploading book…": "正在上傳書籍…",
|
||||
"Generating…": "正在產生…",
|
||||
"Generate share link": "產生分享連結",
|
||||
"Share URL": "分享 URL",
|
||||
"Copy link": "複製連結",
|
||||
"Copied": "已複製",
|
||||
"Share via…": "透過…分享",
|
||||
"Expires {{date}}": "到期日 {{date}}",
|
||||
"Revoking…": "正在撤銷…",
|
||||
"Revoke share": "撤銷分享",
|
||||
"Sign in to share books": "登入以分享書籍",
|
||||
"Expiring soon": "即將到期",
|
||||
"Missing share token": "缺少分享權杖",
|
||||
"Could not add to your library": "無法加入您的書庫",
|
||||
"This share link is no longer available": "此分享連結已不可用",
|
||||
"The original link may have expired or been revoked.": "原始連結可能已過期或被撤銷。",
|
||||
"Get Readest": "取得 Readest",
|
||||
"Loading shared book…": "正在載入分享書籍…",
|
||||
"Adding…": "正在新增…",
|
||||
"Add to my library": "加入我的書庫",
|
||||
"Could not load your shares": "無法載入您的分享",
|
||||
"Revoked": "已撤銷",
|
||||
"Expired": "已過期",
|
||||
"Shared books": "已分享的書籍",
|
||||
"You haven't shared any books yet": "您尚未分享任何書籍",
|
||||
"Open a book and tap Share to send it to a friend.": "開啟一本書,點按「分享」傳送給朋友。",
|
||||
"{{count}} active_other": "{{count}} 個有效",
|
||||
"{{count}} downloads_other": "{{count}} 次下載",
|
||||
"starts at saved page": "從保存的頁面開始",
|
||||
"More actions": "更多操作",
|
||||
"Loading…": "載入中…",
|
||||
"Load more": "載入更多",
|
||||
"Could not load shared book": "無法載入分享書籍",
|
||||
"The share link is missing required information.": "分享連結缺少必要資訊。",
|
||||
"Please check your connection and try again.": "請檢查您的網路連線後再試一次。",
|
||||
"Sign in to import shared books": "登入以匯入分享書籍",
|
||||
"Already in your library": "已在您的書庫中",
|
||||
"Added to your library": "已加入您的書庫",
|
||||
"Could not import shared book": "無法匯入分享書籍",
|
||||
"Manage Shared Links": "管理分享連結",
|
||||
"Expires in": "有效期",
|
||||
"{{count}} days_other": "{{count}} 天",
|
||||
"Expires in {{count}} days_other": "{{count}} 天後到期",
|
||||
"Expires in {{count}} hours_other": "{{count}} 小時後到期",
|
||||
"Open in app": "在應用中開啟",
|
||||
"Shared with you": "與您分享",
|
||||
"Downloading… {{percent}}%": "下載中… {{percent}}%",
|
||||
"Import progress": "匯入進度",
|
||||
"Share reading progress": "分享閱讀進度",
|
||||
"Includes your reading progress": "包含你的閱讀進度",
|
||||
"Synced {{time}}": "{{time}}已同步",
|
||||
"Sync Info": "同步資訊",
|
||||
"Last Synced": "上一次同步",
|
||||
"DICT": "DICT",
|
||||
"Slob": "Slob",
|
||||
"DICT bundles need a .index file and a .dict.dz file.": "DICT 字典套件需要一個 .index 檔案和一個 .dict.dz 檔案。",
|
||||
"Slob bundles need a .slob file.": "Slob 字典套件需要一個 .slob 檔案。",
|
||||
"URL template must start with http(s):// and contain %WORD%.": "URL 範本必須以 http(s):// 開頭並包含 %WORD%。",
|
||||
"Web": "網路",
|
||||
"Add Web Search": "新增網路搜尋",
|
||||
"Edit Web Search": "編輯網路搜尋",
|
||||
"e.g. Google": "例如 Google",
|
||||
"URL Template": "URL 範本",
|
||||
"Use %WORD% where the looked-up word should appear.": "在查詢字詞應出現的位置使用 %WORD%。",
|
||||
"Open the search result in your browser:": "在瀏覽器中開啟搜尋結果:",
|
||||
"Open in {{name}}": "在 {{name}} 中開啟",
|
||||
"Book Fingerprint": "書籍指紋",
|
||||
"Search the web": "網路搜尋",
|
||||
"App deeplink (readest://)": "應用程式深層連結 (readest://)",
|
||||
"Universal web link (https://)": "通用網頁連結 (https://)",
|
||||
"Name cannot be empty.": "名稱不能為空。",
|
||||
"Replaced {{count}} existing dictionary_other": "已替換 {{count}} 個現有辭典",
|
||||
"Cancel Edit": "取消編輯",
|
||||
"Edit Dictionary": "編輯辭典",
|
||||
"MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict 套件使用 .mdx 檔案;附帶的 .mdd 與 .css 檔案為選用。",
|
||||
"Dictionary name": "辭典名稱",
|
||||
"This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "無法在此播放此音訊 — 此辭典使用過時格式。請改用提供 Opus、MP3 或 WAV 音訊的辭典。",
|
||||
"File uploaded: {{title}}": "檔案已上傳:{{title}}",
|
||||
"File downloaded: {{title}}": "檔案已下載:{{title}}",
|
||||
"Deleted cloud copy of the file: {{title}}": "已刪除檔案的雲端副本:{{title}}",
|
||||
"Failed to upload file: {{title}}": "檔案上傳失敗:{{title}}",
|
||||
"Failed to download file: {{title}}": "檔案下載失敗:{{title}}",
|
||||
"Failed to delete cloud copy of the file: {{title}}": "未能刪除檔案的雲端副本:{{title}}",
|
||||
"{{percentage}}% used": "已使用 {{percentage}}%",
|
||||
"Set PIN…": "設定 PIN 碼…",
|
||||
"Require a 4-digit PIN to open Readest": "開啟 Readest 時需要輸入 4 位 PIN 碼",
|
||||
"Change PIN…": "變更 PIN 碼…",
|
||||
"Disable PIN…": "停用 PIN 碼…",
|
||||
"Sync passphrase ready": "同步密語已就緒",
|
||||
"This permanently deletes the encrypted credentials we sync (e.g., OPDS catalog passwords) on every device. Local copies are preserved. You will need to re-enter the sync passphrase or set a new one. Continue?": "這將在每台裝置上永久刪除我們同步的加密憑證(例如 OPDS 目錄密碼)。本機副本會保留。您需要重新輸入同步密語或設定新的密語。是否繼續?",
|
||||
"Sync passphrase forgotten — all encrypted fields cleared": "已忘記同步密語 — 所有加密欄位已清除",
|
||||
"Sync passphrase": "同步密語",
|
||||
"Set passphrase": "設定密語",
|
||||
"Forgot passphrase": "忘記密語",
|
||||
"Incorrect PIN": "PIN 碼錯誤",
|
||||
"App locked": "應用程式已鎖定",
|
||||
"Enter your PIN": "請輸入 PIN 碼",
|
||||
"Readest is locked. Enter your 4-digit PIN to continue.": "Readest 已鎖定。請輸入 4 位 PIN 碼以繼續。",
|
||||
"PIN code": "PIN 碼",
|
||||
"Forgetting your PIN locks you out of this device. You'll need to clear the app's data to reset it.": "忘記 PIN 碼將使您無法在此裝置上使用 Readest。您需要清除應用程式資料才能重設。",
|
||||
"Passphrase must be at least 8 characters": "密語至少需要 8 個字元",
|
||||
"Passphrases do not match": "兩次輸入的密語不一致",
|
||||
"Set sync passphrase": "設定同步密語",
|
||||
"Enter sync passphrase": "輸入同步密語",
|
||||
"A sync passphrase encrypts your sensitive fields (like OPDS catalog credentials) before they sync. We never see this passphrase. Pick something memorable — there is no recovery without it.": "同步密語會在您的敏感欄位(例如 OPDS 目錄憑證)同步之前對其加密。我們從不查看此密語。請選擇易記的內容 — 一旦遺失將無法復原。",
|
||||
"Enter the sync passphrase you set on another device to decrypt your synced credentials.": "請輸入您在其他裝置上設定的同步密語,以解密已同步的憑證。",
|
||||
"Confirm passphrase": "確認密語",
|
||||
"Unlock": "解鎖",
|
||||
"Set PIN": "設定 PIN 碼",
|
||||
"Change PIN": "變更 PIN 碼",
|
||||
"Disable PIN": "停用 PIN 碼",
|
||||
"Enter your current PIN, then choose a new 4-digit PIN.": "請輸入目前 PIN 碼,然後選擇新的 4 位 PIN 碼。",
|
||||
"Enter your current PIN to disable the app lock.": "請輸入目前 PIN 碼以停用應用程式鎖定。",
|
||||
"PIN must be {{length}} digits": "PIN 碼必須為 {{length}} 位",
|
||||
"PINs do not match": "PIN 碼不相符",
|
||||
"Current PIN": "目前 PIN 碼",
|
||||
"New PIN": "新 PIN 碼",
|
||||
"Confirm new PIN": "確認新 PIN 碼",
|
||||
"Manage Sync": "管理同步",
|
||||
"Imported book files and library metadata": "已匯入的書籍檔案與書庫中繼資料",
|
||||
"Last-read position, bookmarks, and per-book preferences": "最近閱讀位置、書籤與單本書籍的偏好設定",
|
||||
"Highlights and notes": "螢光標記與筆記",
|
||||
"Fonts": "字型",
|
||||
"Custom font files": "自訂字型檔案",
|
||||
"Backgrounds": "背景",
|
||||
"Custom background textures": "自訂背景紋理",
|
||||
"OPDS catalogs": "OPDS 目錄",
|
||||
"Saved catalog URLs and (encrypted) credentials": "已儲存的目錄網址與(已加密的)認證資訊",
|
||||
"Wrong sync passphrase — synced credentials could not be decrypted": "同步密碼錯誤——無法解密已同步的認證資訊",
|
||||
"Sync passphrase data on the server was reset. Re-encrypting your credentials under the new passphrase…": "伺服器上的同步密碼資料已重設。正在以新密碼重新加密你的認證資訊……",
|
||||
"Failed to decrypt synced credentials": "無法解密已同步的認證資訊",
|
||||
"Imported dictionary bundles and settings": "已匯入的字典包與設定",
|
||||
"Choose what syncs across your devices. Disabling a category stops this device from sending or receiving rows of that kind. Anything already on the server is left alone, re-enabling resumes from where you stopped.": "選擇要在你的裝置間同步哪些內容。停用某個類別後,此裝置將停止傳送或接收該類的記錄。伺服器上已有的內容不會被更動,重新啟用後會從你停下的位置繼續同步。",
|
||||
"Data Sync": "資料同步",
|
||||
"Manage Fonts": "管理字型",
|
||||
"App settings": "應用程式設定",
|
||||
"Theme, highlight colours, integrations (KOSync, Readwise, Hardcover), and dictionary order": "主題、螢光標記顏色、第三方整合(KOSync、Readwise、Hardcover)以及詞典順序",
|
||||
"Required while Dictionaries sync is enabled": "啟用詞典同步時必須",
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} 小時 {{minutes}} 分鐘後重設",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "請設定一組 4 位數的 PIN 碼。每次開啟 Readest 時都需要輸入。遺忘的 PIN 碼無法復原,清除應用程式資料是重設它的唯一方法。",
|
||||
"Credentials": "憑證",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover 與 Readwise 的權杖、使用者名稱與密碼。停用時,憑證僅留在此裝置上,永不上傳。",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "敏感的同步欄位會在上傳前加密。立即設定密碼短語,或稍後在需要加密時再設定。",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "已儲存到此帳號。需要解密憑證時會提示您輸入。",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "此裝置上的閱讀進度與「{{deviceName}}」不同。",
|
||||
"This device": "此裝置",
|
||||
"Red": "紅色",
|
||||
"Yellow": "黃色",
|
||||
"Green": "綠色",
|
||||
"Blue": "藍色",
|
||||
"Violet": "紫色",
|
||||
"Edit color": "編輯顏色",
|
||||
"Add custom color": "新增自訂顏色",
|
||||
"Add label": "新增標籤",
|
||||
"Choose color": "選擇顏色",
|
||||
"Connected to Hardcover. Last synced {{time}}.": "已連線至 Hardcover。上次同步 {{time}}。",
|
||||
"Integrations": "整合",
|
||||
"Hardcover": "Hardcover",
|
||||
"Connected to Readwise. Last synced {{time}}.": "已連線至 Readwise。上次同步 {{time}}。",
|
||||
"Readwise": "Readwise",
|
||||
"Browse and download books from online catalogs.": "瀏覽並下載線上目錄中的書籍。",
|
||||
"Connected as {{user}}": "已以 {{user}} 身分連線",
|
||||
"Not connected": "未連線",
|
||||
"{{count}} catalog_other": "{{count}} 個目錄",
|
||||
"No catalogs": "無目錄",
|
||||
"Connect Readest to external services for sync, highlights, and catalogs.": "將 Readest 連線至外部服務以進行同步、標示與取得目錄。",
|
||||
"Reading Sync": "閱讀同步",
|
||||
"Content Sources": "內容來源",
|
||||
"Scroll tabs": "捲動分頁",
|
||||
"Catalog actions": "目錄操作",
|
||||
"File Content": "檔案內容",
|
||||
"Start your library": "開啟你的書庫",
|
||||
"Pick a book from your device to add it to your library.": "從裝置中挑一本書加入書庫吧。",
|
||||
"Drop a book anywhere on this window, or pick one from your computer.": "把書拖到視窗任一處,或從電腦中挑選一本。",
|
||||
"Sign in to sync your library": "登入以同步書庫"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
{
|
||||
"releases": {
|
||||
"0.11.1": {
|
||||
"date": "2026-05-11",
|
||||
"notes": [
|
||||
"Dictionaries: You can now import your own StarDict and MDict dictionaries",
|
||||
"Sync: Your custom dictionaries, custom fonts, background textures and OPDS catalogs now sync across devices",
|
||||
"KOReader Sync: Browse your full Readest Library from inside KOReader, with improved sync diagnostics",
|
||||
"OPDS: Stream books over OPDS-PSE and optionally auto-download new titles from feeds",
|
||||
"Sharing: Create share links for books, jump directly to book via deep links in exported annotations",
|
||||
"Library: Added an optional 4-digit PIN lock at app launch to keep your library private",
|
||||
"Library: You can now drag entire folders to import books",
|
||||
"Reading: Added support for inline CJK ruby annotations (warichu/Gezhu), improved footnote detection",
|
||||
"Speed Reading: Reading position now resumes correctly across devices and inside long sections",
|
||||
"Fixes: Many fixes across PDFs, MOBIs, EPUBs, TTS, scrolling, and accessibility"
|
||||
]
|
||||
},
|
||||
"0.10.6": {
|
||||
"date": "2026-04-13",
|
||||
"notes": [
|
||||
|
||||
@@ -134,22 +134,6 @@ if (/^\d+$/.test(arg)) {
|
||||
console.error('\n--- Rebasing onto origin/main ---');
|
||||
execSync('git rebase origin/main', { stdio: gitStdio, cwd: worktreePath });
|
||||
|
||||
// Symlink shared directories into the new worktree, pointing at the bare repo's
|
||||
// git common dir so all worktrees share the same settings without duplication.
|
||||
const gitCommonDir = execSync('git rev-parse --git-common-dir', {
|
||||
encoding: 'utf8',
|
||||
cwd: repoRoot,
|
||||
}).trim();
|
||||
for (const dir of ['.claude', '.local-settings']) {
|
||||
const sharedDir = path.resolve(repoRoot, gitCommonDir, dir);
|
||||
const newDir = path.join(worktreePath, dir);
|
||||
fs.mkdirSync(sharedDir, { recursive: true });
|
||||
if (!fs.existsSync(newDir)) {
|
||||
// 'junction' works without elevated privileges on Windows; ignored on Unix
|
||||
fs.symlinkSync(sharedDir, newDir, 'junction');
|
||||
}
|
||||
}
|
||||
|
||||
// Repoint submodule URLs to local .git/modules/ clones to avoid remote fetches.
|
||||
// Submodules without a local cache fall back to the remote URL.
|
||||
console.error('\n--- Initializing submodules (using local objects) ---');
|
||||
@@ -250,7 +234,7 @@ if (fs.existsSync(androidGenDir)) {
|
||||
stdio: gitStdio,
|
||||
cwd: dstAppDir,
|
||||
});
|
||||
execSync(`git checkout ${appRelPath}/src-tauri/gen/android`, {
|
||||
execSync(`git checkout ${appRelPath}/src-tauri/gen/android ${appRelPath}/src-tauri/icons`, {
|
||||
stdio: gitStdio,
|
||||
cwd: worktreePath,
|
||||
});
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": 1,
|
||||
"skills": {
|
||||
"impeccable": {
|
||||
"source": "pbakaus/impeccable",
|
||||
"sourceType": "github",
|
||||
"skillPath": "skill/SKILL.md",
|
||||
"computedHash": "8cdf2e788eaca3af7d02026ef9cec55b506100a00d130f938e3fb1ad669c0ad0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ crate-type = ["staticlib", "cdylib", "lib"]
|
||||
cargo-clippy = []
|
||||
# Enable WebDriver plugin for E2E testing (use with `tauri build --debug --features webdriver`)
|
||||
webdriver = ["tauri-plugin-webdriver"]
|
||||
devtools = ["tauri/devtools"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2", features = [] }
|
||||
@@ -80,4 +81,4 @@ tauri-plugin-window-state = "2"
|
||||
discord-rich-presence = "1.0.0"
|
||||
|
||||
[target.'cfg(target_os = "android")'.dependencies]
|
||||
rsproperties = "0.3"
|
||||
libc = "0.2"
|
||||
|
||||
@@ -4,5 +4,16 @@
|
||||
<dict>
|
||||
<key>LSSupportsOpeningDocumentsInPlace</key>
|
||||
<true/>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.bilingify.readest</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>readest</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
},
|
||||
{
|
||||
"path": "**/last-book-cover.png"
|
||||
},
|
||||
{
|
||||
"path": "$TEMP/**/*"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -135,7 +138,9 @@
|
||||
"core:window:default",
|
||||
"core:window:allow-close",
|
||||
"core:window:allow-center",
|
||||
"core:window:allow-show",
|
||||
"core:window:allow-minimize",
|
||||
"core:window:allow-unminimize",
|
||||
"core:window:allow-maximize",
|
||||
"core:window:allow-unmaximize",
|
||||
"core:window:allow-set-size",
|
||||
|
||||
@@ -107,12 +107,22 @@
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="https" />
|
||||
<data android:scheme="http" />
|
||||
<data android:host="web.readest.com" />
|
||||
|
||||
|
||||
|
||||
|
||||
</intent-filter>
|
||||
<intent-filter >
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="readest" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</intent-filter>
|
||||
<!-- DEEP LINK PLUGIN. AUTO-GENERATED. DO NOT REMOVE. -->
|
||||
</activity>
|
||||
|
||||
@@ -4,7 +4,10 @@ version = "0.1.0"
|
||||
authors = [ "You" ]
|
||||
description = "a bridge between tauri app and native OS functionality"
|
||||
edition = "2021"
|
||||
rust-version = "1.77.2"
|
||||
# `keyring-core` v1 and the per-platform store crates require Rust
|
||||
# 1.85 (apple-native) / 1.88 (windows-native, dbus-secret-service).
|
||||
# Bumping the floor here so cargo lets them compile.
|
||||
rust-version = "1.88"
|
||||
exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"]
|
||||
links = "tauri-plugin-native-bridge"
|
||||
|
||||
@@ -20,3 +23,23 @@ schemars = "0.8"
|
||||
|
||||
[target.'cfg(any(target_os = "macos", windows, target_os = "linux"))'.dependencies]
|
||||
font-enumeration = "0.9.0"
|
||||
# OS-keychain backed secret storage for the sync passphrase. The
|
||||
# `keyring` crate v4 was demoted to a sample CLI app; the library
|
||||
# moved to `keyring-core` v1 plus a separate per-platform credential
|
||||
# store crate. We register the right store at plugin init time
|
||||
# (see `desktop.rs`). iOS / Android take a different path entirely:
|
||||
# Swift's Security framework + Android's EncryptedSharedPreferences,
|
||||
# dispatched via mobile.rs.
|
||||
keyring-core = "1"
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
apple-native-keyring-store = { version = "1", features = ["keychain"] }
|
||||
|
||||
[target.'cfg(target_os = "windows")'.dependencies]
|
||||
windows-native-keyring-store = "1"
|
||||
|
||||
[target.'cfg(target_os = "linux")'.dependencies]
|
||||
# `vendored` statically links libdbus + openssl so we don't depend on
|
||||
# the host distribution's versions, mirroring the previous
|
||||
# `sync-secret-service` feature on keyring v3.
|
||||
dbus-secret-service-keyring-store = { version = "1", features = ["crypto-rust", "vendored"] }
|
||||
|
||||
@@ -49,6 +49,11 @@ dependencies {
|
||||
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||
implementation("androidx.browser:browser:1.8.0")
|
||||
implementation("com.google.android.material:material:1.7.0")
|
||||
// EncryptedSharedPreferences (sync passphrase keychain backing).
|
||||
// Stays on the 1.1.0-alpha line because the stable 1.0.x release
|
||||
// doesn't support modern API targets cleanly; alpha is widely used
|
||||
// in production and the API is stable.
|
||||
implementation("androidx.security:security-crypto:1.1.0-alpha06")
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.5")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
|
||||
|
||||
+90
@@ -792,4 +792,94 @@ class NativeBridgePlugin(private val activity: Activity): Plugin(activity) {
|
||||
trigger(eventName, payload)
|
||||
}
|
||||
}
|
||||
|
||||
// ── Sync passphrase keychain ──────────────────────────────────────
|
||||
// Backed by EncryptedSharedPreferences, which derives an AES-GCM
|
||||
// master key from AndroidKeystore and stores the value-of-keys map
|
||||
// in a private SharedPreferences file. The TS-side CryptoSession
|
||||
// reads/writes via these commands so the user's sync passphrase
|
||||
// persists across app launches.
|
||||
|
||||
private val syncPrefsName = "readest_sync_passphrase_v1"
|
||||
private val syncPrefsKey = "passphrase"
|
||||
|
||||
private fun openSyncPrefs(): android.content.SharedPreferences {
|
||||
val masterKey = androidx.security.crypto.MasterKey.Builder(activity)
|
||||
.setKeyScheme(androidx.security.crypto.MasterKey.KeyScheme.AES256_GCM)
|
||||
.build()
|
||||
return androidx.security.crypto.EncryptedSharedPreferences.create(
|
||||
activity,
|
||||
syncPrefsName,
|
||||
masterKey,
|
||||
androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
|
||||
androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
|
||||
)
|
||||
}
|
||||
|
||||
@Command
|
||||
fun set_sync_passphrase(invoke: Invoke) {
|
||||
val args = invoke.parseArgs(SyncPassphraseSetArgs::class.java)
|
||||
val ret = JSObject()
|
||||
try {
|
||||
val prefs = openSyncPrefs()
|
||||
prefs.edit().putString(syncPrefsKey, args.passphrase).apply()
|
||||
ret.put("success", true)
|
||||
} catch (e: Exception) {
|
||||
Log.e("NativeBridgePlugin", "set_sync_passphrase failed", e)
|
||||
ret.put("success", false)
|
||||
ret.put("error", e.message ?: "unknown")
|
||||
}
|
||||
invoke.resolve(ret)
|
||||
}
|
||||
|
||||
@Command
|
||||
fun get_sync_passphrase(invoke: Invoke) {
|
||||
val ret = JSObject()
|
||||
try {
|
||||
val prefs = openSyncPrefs()
|
||||
val value = prefs.getString(syncPrefsKey, null)
|
||||
if (value != null) ret.put("passphrase", value)
|
||||
} catch (e: Exception) {
|
||||
Log.e("NativeBridgePlugin", "get_sync_passphrase failed", e)
|
||||
ret.put("error", e.message ?: "unknown")
|
||||
}
|
||||
invoke.resolve(ret)
|
||||
}
|
||||
|
||||
@Command
|
||||
fun clear_sync_passphrase(invoke: Invoke) {
|
||||
val ret = JSObject()
|
||||
try {
|
||||
val prefs = openSyncPrefs()
|
||||
prefs.edit().remove(syncPrefsKey).apply()
|
||||
ret.put("success", true)
|
||||
} catch (e: Exception) {
|
||||
Log.e("NativeBridgePlugin", "clear_sync_passphrase failed", e)
|
||||
ret.put("success", false)
|
||||
ret.put("error", e.message ?: "unknown")
|
||||
}
|
||||
invoke.resolve(ret)
|
||||
}
|
||||
|
||||
@Command
|
||||
fun is_sync_keychain_available(invoke: Invoke) {
|
||||
val ret = JSObject()
|
||||
try {
|
||||
// Probe by opening the prefs file. Failure surfaces as
|
||||
// available=false with the underlying error string so the
|
||||
// TS layer can fall back to the ephemeral store.
|
||||
openSyncPrefs()
|
||||
ret.put("available", true)
|
||||
} catch (e: Exception) {
|
||||
Log.e("NativeBridgePlugin", "is_sync_keychain_available failed", e)
|
||||
ret.put("available", false)
|
||||
ret.put("error", e.message ?: "unknown")
|
||||
}
|
||||
invoke.resolve(ret)
|
||||
}
|
||||
}
|
||||
|
||||
@app.tauri.annotation.InvokeArg
|
||||
class SyncPassphraseSetArgs {
|
||||
lateinit var passphrase: String
|
||||
}
|
||||
|
||||
+82
@@ -921,6 +921,88 @@ class NativeBridgePlugin: Plugin {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Sync passphrase keychain ──────────────────────────────────────────
|
||||
// Backed by the iOS Security framework Keychain. The TS-side
|
||||
// CryptoSession reads/writes via these commands so the user's sync
|
||||
// passphrase persists across app launches.
|
||||
|
||||
private static let syncKeychainService = "com.bilingify.readest.sync-passphrase"
|
||||
private static let syncKeychainAccount = "default"
|
||||
|
||||
private func syncKeychainBaseQuery() -> [String: Any] {
|
||||
return [
|
||||
kSecClass as String: kSecClassGenericPassword,
|
||||
kSecAttrService as String: NativeBridgePlugin.syncKeychainService,
|
||||
kSecAttrAccount as String: NativeBridgePlugin.syncKeychainAccount
|
||||
]
|
||||
}
|
||||
|
||||
@objc public func set_sync_passphrase(_ invoke: Invoke) {
|
||||
do {
|
||||
let args = try invoke.parseArgs(SyncPassphraseSetArgs.self)
|
||||
guard let data = args.passphrase.data(using: .utf8) else {
|
||||
invoke.resolve(["success": false, "error": "encoding"])
|
||||
return
|
||||
}
|
||||
var query = syncKeychainBaseQuery()
|
||||
query[kSecValueData as String] = data
|
||||
// Replace any existing entry. Delete-then-add keeps the
|
||||
// accessibility class consistent across SDK versions.
|
||||
SecItemDelete(query as CFDictionary)
|
||||
let status = SecItemAdd(query as CFDictionary, nil)
|
||||
if status == errSecSuccess {
|
||||
invoke.resolve(["success": true])
|
||||
} else {
|
||||
invoke.resolve(["success": false, "error": "OSStatus \(status)"])
|
||||
}
|
||||
} catch {
|
||||
invoke.resolve(["success": false, "error": "\(error)"])
|
||||
}
|
||||
}
|
||||
|
||||
@objc public func get_sync_passphrase(_ invoke: Invoke) {
|
||||
var query = syncKeychainBaseQuery()
|
||||
query[kSecReturnData as String] = true
|
||||
query[kSecMatchLimit as String] = kSecMatchLimitOne
|
||||
var item: CFTypeRef?
|
||||
let status = SecItemCopyMatching(query as CFDictionary, &item)
|
||||
if status == errSecSuccess, let data = item as? Data, let s = String(data: data, encoding: .utf8) {
|
||||
invoke.resolve(["passphrase": s])
|
||||
} else if status == errSecItemNotFound {
|
||||
// No entry: empty response. The TS layer treats this as "prompt".
|
||||
invoke.resolve([:])
|
||||
} else {
|
||||
invoke.resolve(["error": "OSStatus \(status)"])
|
||||
}
|
||||
}
|
||||
|
||||
@objc public func clear_sync_passphrase(_ invoke: Invoke) {
|
||||
let status = SecItemDelete(syncKeychainBaseQuery() as CFDictionary)
|
||||
if status == errSecSuccess || status == errSecItemNotFound {
|
||||
invoke.resolve(["success": true])
|
||||
} else {
|
||||
invoke.resolve(["success": false, "error": "OSStatus \(status)"])
|
||||
}
|
||||
}
|
||||
|
||||
@objc public func is_sync_keychain_available(_ invoke: Invoke) {
|
||||
// The Keychain is always available on iOS; report true and let the
|
||||
// TS layer trust it. We probe SecItemCopyMatching anyway so a
|
||||
// future sandbox restriction surfaces an explicit error.
|
||||
var query = syncKeychainBaseQuery()
|
||||
query[kSecMatchLimit as String] = kSecMatchLimitOne
|
||||
let status = SecItemCopyMatching(query as CFDictionary, nil)
|
||||
if status == errSecSuccess || status == errSecItemNotFound {
|
||||
invoke.resolve(["available": true])
|
||||
} else {
|
||||
invoke.resolve(["available": false, "error": "OSStatus \(status)"])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SyncPassphraseSetArgs: Decodable {
|
||||
let passphrase: String
|
||||
}
|
||||
|
||||
@_cdecl("init_plugin_native_bridge")
|
||||
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
[[permission]]
|
||||
identifier = "allow-clear-sync-passphrase"
|
||||
description = "Enables the clear_sync_passphrase command without any pre-configured scope."
|
||||
commands.allow = ["clear_sync_passphrase"]
|
||||
|
||||
[[permission]]
|
||||
identifier = "deny-clear-sync-passphrase"
|
||||
description = "Denies the clear_sync_passphrase command without any pre-configured scope."
|
||||
commands.deny = ["clear_sync_passphrase"]
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
[[permission]]
|
||||
identifier = "allow-get-sync-passphrase"
|
||||
description = "Enables the get_sync_passphrase command without any pre-configured scope."
|
||||
commands.allow = ["get_sync_passphrase"]
|
||||
|
||||
[[permission]]
|
||||
identifier = "deny-get-sync-passphrase"
|
||||
description = "Denies the get_sync_passphrase command without any pre-configured scope."
|
||||
commands.deny = ["get_sync_passphrase"]
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
[[permission]]
|
||||
identifier = "allow-is-sync-keychain-available"
|
||||
description = "Enables the is_sync_keychain_available command without any pre-configured scope."
|
||||
commands.allow = ["is_sync_keychain_available"]
|
||||
|
||||
[[permission]]
|
||||
identifier = "deny-is-sync-keychain-available"
|
||||
description = "Denies the is_sync_keychain_available command without any pre-configured scope."
|
||||
commands.deny = ["is_sync_keychain_available"]
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
[[permission]]
|
||||
identifier = "allow-set-sync-passphrase"
|
||||
description = "Enables the set_sync_passphrase command without any pre-configured scope."
|
||||
commands.allow = ["set_sync_passphrase"]
|
||||
|
||||
[[permission]]
|
||||
identifier = "deny-set-sync-passphrase"
|
||||
description = "Denies the set_sync_passphrase command without any pre-configured scope."
|
||||
commands.deny = ["set_sync_passphrase"]
|
||||
+108
@@ -34,6 +34,10 @@ Default permissions for the plugin
|
||||
- `allow-request-permissions`
|
||||
- `allow-checkPermissions`
|
||||
- `allow-requestPermissions`
|
||||
- `allow-set-sync-passphrase`
|
||||
- `allow-get-sync-passphrase`
|
||||
- `allow-clear-sync-passphrase`
|
||||
- `allow-is-sync-keychain-available`
|
||||
|
||||
## Permission Table
|
||||
|
||||
@@ -177,6 +181,32 @@ Denies the check_permissions command without any pre-configured scope.
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-clear-sync-passphrase`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Enables the clear_sync_passphrase command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:deny-clear-sync-passphrase`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Denies the clear_sync_passphrase command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-copy-uri-to-path`
|
||||
|
||||
</td>
|
||||
@@ -333,6 +363,32 @@ Denies the get_storefront_region_code command without any pre-configured scope.
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-get-sync-passphrase`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Enables the get_sync_passphrase command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:deny-get-sync-passphrase`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Denies the get_sync_passphrase command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-get-sys-fonts-list`
|
||||
|
||||
</td>
|
||||
@@ -567,6 +623,32 @@ Denies the intercept_keys command without any pre-configured scope.
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-is-sync-keychain-available`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Enables the is_sync_keychain_available command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:deny-is-sync-keychain-available`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Denies the is_sync_keychain_available command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-lock-screen-orientation`
|
||||
|
||||
</td>
|
||||
@@ -827,6 +909,32 @@ Denies the set_screen_brightness command without any pre-configured scope.
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-set-sync-passphrase`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Enables the set_sync_passphrase command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:deny-set-sync-passphrase`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Denies the set_sync_passphrase command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`native-bridge:allow-set-system-ui-visibility`
|
||||
|
||||
</td>
|
||||
|
||||
@@ -31,4 +31,8 @@ permissions = [
|
||||
"allow-request-permissions",
|
||||
"allow-checkPermissions",
|
||||
"allow-requestPermissions",
|
||||
"allow-set-sync-passphrase",
|
||||
"allow-get-sync-passphrase",
|
||||
"allow-clear-sync-passphrase",
|
||||
"allow-is-sync-keychain-available",
|
||||
]
|
||||
|
||||
+50
-2
@@ -354,6 +354,18 @@
|
||||
"const": "deny-check-permissions",
|
||||
"markdownDescription": "Denies the check_permissions command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the clear_sync_passphrase command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "allow-clear-sync-passphrase",
|
||||
"markdownDescription": "Enables the clear_sync_passphrase command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Denies the clear_sync_passphrase command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "deny-clear-sync-passphrase",
|
||||
"markdownDescription": "Denies the clear_sync_passphrase command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the copy_uri_to_path command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
@@ -426,6 +438,18 @@
|
||||
"const": "deny-get-storefront-region-code",
|
||||
"markdownDescription": "Denies the get_storefront_region_code command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the get_sync_passphrase command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "allow-get-sync-passphrase",
|
||||
"markdownDescription": "Enables the get_sync_passphrase command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Denies the get_sync_passphrase command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "deny-get-sync-passphrase",
|
||||
"markdownDescription": "Denies the get_sync_passphrase command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the get_sys_fonts_list command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
@@ -534,6 +558,18 @@
|
||||
"const": "deny-intercept-keys",
|
||||
"markdownDescription": "Denies the intercept_keys command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the is_sync_keychain_available command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "allow-is-sync-keychain-available",
|
||||
"markdownDescription": "Enables the is_sync_keychain_available command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Denies the is_sync_keychain_available command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "deny-is-sync-keychain-available",
|
||||
"markdownDescription": "Denies the is_sync_keychain_available command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the lock_screen_orientation command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
@@ -654,6 +690,18 @@
|
||||
"const": "deny-set-screen-brightness",
|
||||
"markdownDescription": "Denies the set_screen_brightness command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the set_sync_passphrase command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "allow-set-sync-passphrase",
|
||||
"markdownDescription": "Enables the set_sync_passphrase command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Denies the set_sync_passphrase command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"const": "deny-set-sync-passphrase",
|
||||
"markdownDescription": "Denies the set_sync_passphrase command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Enables the set_system_ui_visibility command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
@@ -679,10 +727,10 @@
|
||||
"markdownDescription": "Denies the use_background_audio command without any pre-configured scope."
|
||||
},
|
||||
{
|
||||
"description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-get-storefront-region-code`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`",
|
||||
"description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-get-storefront-region-code`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`\n- `allow-set-sync-passphrase`\n- `allow-get-sync-passphrase`\n- `allow-clear-sync-passphrase`\n- `allow-is-sync-keychain-available`",
|
||||
"type": "string",
|
||||
"const": "default",
|
||||
"markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-get-storefront-region-code`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`"
|
||||
"markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-auth-with-safari`\n- `allow-auth-with-custom-tab`\n- `allow-copy-uri-to-path`\n- `allow-use-background-audio`\n- `allow-install-package`\n- `allow-set-system-ui-visibility`\n- `allow-get-status-bar-height`\n- `allow-get-sys-fonts-list`\n- `allow-intercept-keys`\n- `allow-lock-screen-orientation`\n- `allow-iap-is-available`\n- `allow-iap-initialize`\n- `allow-iap-fetch-products`\n- `allow-iap-purchase-product`\n- `allow-iap-restore-purchases`\n- `allow-get-system-color-scheme`\n- `allow-get-safe-area-insets`\n- `allow-get-screen-brightness`\n- `allow-set-screen-brightness`\n- `allow-get-external-sdcard-path`\n- `allow-open-external-url`\n- `allow-select-directory`\n- `allow-get-storefront-region-code`\n- `allow-request-manage-storage-permission`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-checkPermissions`\n- `allow-requestPermissions`\n- `allow-set-sync-passphrase`\n- `allow-get-sync-passphrase`\n- `allow-clear-sync-passphrase`\n- `allow-is-sync-keychain-available`"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -199,3 +199,32 @@ pub(crate) async fn request_manage_storage_permission<R: Runtime>(
|
||||
) -> Result<RequestManageStoragePermissionResponse> {
|
||||
app.native_bridge().request_manage_storage_permission()
|
||||
}
|
||||
|
||||
#[command]
|
||||
pub(crate) async fn set_sync_passphrase<R: Runtime>(
|
||||
app: AppHandle<R>,
|
||||
payload: SetSyncPassphraseRequest,
|
||||
) -> Result<SyncPassphraseResponse> {
|
||||
app.native_bridge().set_sync_passphrase(payload)
|
||||
}
|
||||
|
||||
#[command]
|
||||
pub(crate) async fn get_sync_passphrase<R: Runtime>(
|
||||
app: AppHandle<R>,
|
||||
) -> Result<GetSyncPassphraseResponse> {
|
||||
app.native_bridge().get_sync_passphrase()
|
||||
}
|
||||
|
||||
#[command]
|
||||
pub(crate) async fn clear_sync_passphrase<R: Runtime>(
|
||||
app: AppHandle<R>,
|
||||
) -> Result<SyncPassphraseResponse> {
|
||||
app.native_bridge().clear_sync_passphrase()
|
||||
}
|
||||
|
||||
#[command]
|
||||
pub(crate) async fn is_sync_keychain_available<R: Runtime>(
|
||||
app: AppHandle<R>,
|
||||
) -> Result<SyncKeychainAvailableResponse> {
|
||||
app.native_bridge().is_sync_keychain_available()
|
||||
}
|
||||
|
||||
@@ -8,9 +8,42 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
|
||||
app: &AppHandle<R>,
|
||||
_api: PluginApi<R, C>,
|
||||
) -> crate::Result<NativeBridge<R>> {
|
||||
// keyring v4 split the library into `keyring-core` plus a
|
||||
// per-platform credential-store crate. The default store is a
|
||||
// process-wide global that must be installed before the first
|
||||
// `Entry::new` call. `set_default_store` is idempotent — calling
|
||||
// it again on plugin re-init just replaces the previous handle.
|
||||
// We log and swallow errors so a misconfigured keychain doesn't
|
||||
// block plugin init; downstream calls then fail with NoDefaultStore
|
||||
// and the TS layer falls back to the ephemeral store.
|
||||
install_default_keyring_store();
|
||||
Ok(NativeBridge(app.clone()))
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
fn install_default_keyring_store() {
|
||||
match apple_native_keyring_store::keychain::Store::new() {
|
||||
Ok(store) => keyring_core::set_default_store(store),
|
||||
Err(err) => eprintln!("[native-bridge] keychain store init failed: {err}"),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
fn install_default_keyring_store() {
|
||||
match windows_native_keyring_store::Store::new() {
|
||||
Ok(store) => keyring_core::set_default_store(store),
|
||||
Err(err) => eprintln!("[native-bridge] credential manager init failed: {err}"),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
fn install_default_keyring_store() {
|
||||
match dbus_secret_service_keyring_store::Store::new() {
|
||||
Ok(store) => keyring_core::set_default_store(store),
|
||||
Err(err) => eprintln!("[native-bridge] secret service init failed: {err}"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Access to the native-bridge APIs.
|
||||
pub struct NativeBridge<R: Runtime>(AppHandle<R>);
|
||||
|
||||
@@ -146,4 +179,86 @@ impl<R: Runtime> NativeBridge<R> {
|
||||
) -> crate::Result<RequestManageStoragePermissionResponse> {
|
||||
Err(crate::Error::UnsupportedPlatformError)
|
||||
}
|
||||
|
||||
// ── Sync passphrase keychain ────────────────────────────────────────
|
||||
//
|
||||
// Uses `keyring-core` v1 with a platform-specific credential store
|
||||
// installed in `init()` above:
|
||||
// * macOS → Security framework Keychain (apple-native-keyring-store)
|
||||
// * Windows → Credential Manager (windows-native-keyring-store)
|
||||
// * Linux → Secret Service (dbus-secret-service-keyring-store)
|
||||
//
|
||||
// `service` and `user` form the keychain item identity. Service is
|
||||
// the bundle id; user is a stable string ("default") so multiple
|
||||
// Readest installs on the same machine could coexist with distinct
|
||||
// user values if ever needed.
|
||||
|
||||
pub fn set_sync_passphrase(
|
||||
&self,
|
||||
payload: SetSyncPassphraseRequest,
|
||||
) -> crate::Result<SyncPassphraseResponse> {
|
||||
match keyring_entry().and_then(|e| e.set_password(&payload.passphrase)) {
|
||||
Ok(()) => Ok(SyncPassphraseResponse {
|
||||
success: true,
|
||||
error: None,
|
||||
}),
|
||||
Err(err) => Ok(SyncPassphraseResponse {
|
||||
success: false,
|
||||
error: Some(err.to_string()),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_sync_passphrase(&self) -> crate::Result<GetSyncPassphraseResponse> {
|
||||
match keyring_entry().and_then(|e| e.get_password()) {
|
||||
Ok(passphrase) => Ok(GetSyncPassphraseResponse {
|
||||
passphrase: Some(passphrase),
|
||||
error: None,
|
||||
}),
|
||||
Err(keyring_core::Error::NoEntry) => Ok(GetSyncPassphraseResponse {
|
||||
passphrase: None,
|
||||
error: None,
|
||||
}),
|
||||
Err(err) => Ok(GetSyncPassphraseResponse {
|
||||
passphrase: None,
|
||||
error: Some(err.to_string()),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn clear_sync_passphrase(&self) -> crate::Result<SyncPassphraseResponse> {
|
||||
match keyring_entry().and_then(|e| e.delete_credential()) {
|
||||
Ok(()) | Err(keyring_core::Error::NoEntry) => Ok(SyncPassphraseResponse {
|
||||
success: true,
|
||||
error: None,
|
||||
}),
|
||||
Err(err) => Ok(SyncPassphraseResponse {
|
||||
success: false,
|
||||
error: Some(err.to_string()),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_sync_keychain_available(&self) -> crate::Result<SyncKeychainAvailableResponse> {
|
||||
// Best-effort probe: open an entry handle. Surface the error
|
||||
// string instead of throwing so the TS layer can fall back
|
||||
// to the ephemeral store gracefully.
|
||||
match keyring_entry() {
|
||||
Ok(_) => Ok(SyncKeychainAvailableResponse {
|
||||
available: true,
|
||||
error: None,
|
||||
}),
|
||||
Err(err) => Ok(SyncKeychainAvailableResponse {
|
||||
available: false,
|
||||
error: Some(err.to_string()),
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const KEYRING_SERVICE: &str = "Readest Safe Storage";
|
||||
const KEYRING_USER: &str = "default";
|
||||
|
||||
fn keyring_entry() -> std::result::Result<keyring_core::Entry, keyring_core::Error> {
|
||||
keyring_core::Entry::new(KEYRING_SERVICE, KEYRING_USER)
|
||||
}
|
||||
|
||||
@@ -79,6 +79,10 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
||||
commands::select_directory,
|
||||
commands::get_storefront_region_code,
|
||||
commands::request_manage_storage_permission,
|
||||
commands::set_sync_passphrase,
|
||||
commands::get_sync_passphrase,
|
||||
commands::clear_sync_passphrase,
|
||||
commands::is_sync_keychain_available,
|
||||
])
|
||||
.setup(|app, api| {
|
||||
#[cfg(mobile)]
|
||||
|
||||
@@ -241,3 +241,38 @@ impl<R: Runtime> NativeBridge<R> {
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Runtime> NativeBridge<R> {
|
||||
pub fn set_sync_passphrase(
|
||||
&self,
|
||||
payload: SetSyncPassphraseRequest,
|
||||
) -> crate::Result<SyncPassphraseResponse> {
|
||||
self.0
|
||||
.run_mobile_plugin("set_sync_passphrase", payload)
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Runtime> NativeBridge<R> {
|
||||
pub fn get_sync_passphrase(&self) -> crate::Result<GetSyncPassphraseResponse> {
|
||||
self.0
|
||||
.run_mobile_plugin("get_sync_passphrase", ())
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Runtime> NativeBridge<R> {
|
||||
pub fn clear_sync_passphrase(&self) -> crate::Result<SyncPassphraseResponse> {
|
||||
self.0
|
||||
.run_mobile_plugin("clear_sync_passphrase", ())
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Runtime> NativeBridge<R> {
|
||||
pub fn is_sync_keychain_available(&self) -> crate::Result<SyncKeychainAvailableResponse> {
|
||||
self.0
|
||||
.run_mobile_plugin("is_sync_keychain_available", ())
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,3 +237,39 @@ pub struct GetStorefrontRegionCodeResponse {
|
||||
pub region_code: Option<String>,
|
||||
pub error: Option<String>,
|
||||
}
|
||||
|
||||
// ── Sync passphrase keychain ────────────────────────────────────────────
|
||||
//
|
||||
// Persist the sync passphrase across app launches via the OS keychain
|
||||
// so native users don't re-enter it every session. The replica-sync
|
||||
// CryptoSession (TS side) reads/writes via these commands; web users
|
||||
// keep using the in-memory ephemeral store.
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct SetSyncPassphraseRequest {
|
||||
pub passphrase: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct SyncPassphraseResponse {
|
||||
pub success: bool,
|
||||
pub error: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct GetSyncPassphraseResponse {
|
||||
/// Present iff a passphrase is stored. Absent (and `error: None`)
|
||||
/// means "no entry on this device" — caller should prompt.
|
||||
pub passphrase: Option<String>,
|
||||
pub error: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct SyncKeychainAvailableResponse {
|
||||
pub available: bool,
|
||||
pub error: Option<String>,
|
||||
}
|
||||
|
||||
@@ -46,9 +46,21 @@ const EINK_MODELS: &[&str] = &[
|
||||
];
|
||||
|
||||
fn get_system_property(prop: &str) -> Option<String> {
|
||||
rsproperties::get::<String>(prop)
|
||||
.ok()
|
||||
.filter(|s| !s.is_empty())
|
||||
use std::ffi::CString;
|
||||
let name = CString::new(prop).ok()?;
|
||||
let mut buf = [0u8; libc::PROP_VALUE_MAX as usize];
|
||||
// SAFETY: __system_property_get writes at most PROP_VALUE_MAX bytes (including the
|
||||
// trailing NUL) into the provided buffer and returns the number of bytes written
|
||||
// excluding the NUL. `name` is a valid NUL-terminated C string for the duration
|
||||
// of the call.
|
||||
let len = unsafe {
|
||||
libc::__system_property_get(name.as_ptr(), buf.as_mut_ptr() as *mut libc::c_char)
|
||||
};
|
||||
if len <= 0 {
|
||||
return None;
|
||||
}
|
||||
let value = std::str::from_utf8(&buf[..len as usize]).ok()?;
|
||||
(!value.is_empty()).then(|| value.to_owned())
|
||||
}
|
||||
|
||||
/// Check if the current Android device is an e-ink device.
|
||||
|
||||
@@ -28,6 +28,8 @@ mod discord_rpc;
|
||||
#[cfg(target_os = "macos")]
|
||||
mod macos;
|
||||
mod transfer_file;
|
||||
#[cfg(target_os = "windows")]
|
||||
use tauri::webview::ScrollBarStyle;
|
||||
use tauri::{command, Emitter, WebviewUrl, WebviewWindowBuilder, Window};
|
||||
#[cfg(target_os = "android")]
|
||||
use tauri_plugin_native_bridge::register_select_directory_callback;
|
||||
@@ -195,10 +197,9 @@ pub fn run() {
|
||||
let builder = builder.plugin(
|
||||
tauri_plugin_single_instance::Builder::new()
|
||||
.callback(move |app, argv, cwd| {
|
||||
let _ = app
|
||||
.get_webview_window("main")
|
||||
.expect("no main window")
|
||||
.set_focus();
|
||||
if let Some(window) = app.get_webview_window("main") {
|
||||
let _ = window.set_focus();
|
||||
}
|
||||
let files = get_files_from_argv(argv.clone());
|
||||
if !files.is_empty() {
|
||||
allow_file_in_scopes(app, files.clone());
|
||||
@@ -375,7 +376,9 @@ pub fn run() {
|
||||
true
|
||||
});
|
||||
|
||||
#[cfg(desktop)]
|
||||
#[cfg(target_os = "macos")]
|
||||
let win_builder = win_builder.inner_size(1280.0, 800.0).resizable(true);
|
||||
#[cfg(all(not(target_os = "macos"), desktop))]
|
||||
let win_builder = win_builder.inner_size(800.0, 600.0).resizable(true);
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
@@ -394,7 +397,9 @@ pub fn run() {
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
builder = builder.transparent(false);
|
||||
builder = builder
|
||||
.transparent(false)
|
||||
.scroll_bar_style(ScrollBarStyle::FluentOverlay);
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
@@ -406,10 +411,29 @@ pub fn run() {
|
||||
builder
|
||||
};
|
||||
|
||||
win_builder.build().unwrap();
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
{
|
||||
win_builder.build().unwrap();
|
||||
}
|
||||
// let win = win_builder.build().unwrap();
|
||||
// win.open_devtools();
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
{
|
||||
let window = win_builder.build().unwrap();
|
||||
// On macOS, closing a window (via Cmd+W or the red traffic light) should
|
||||
// not quit the app — only Cmd+Q should. Hide the window instead so the
|
||||
// app keeps running in the dock, and restore it when the user reopens
|
||||
// the app from the dock.
|
||||
let window_for_close = window.clone();
|
||||
window.on_window_event(move |event| {
|
||||
if let tauri::WindowEvent::CloseRequested { api, .. } = event {
|
||||
api.prevent_close();
|
||||
let _ = window_for_close.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
macos::menu::setup_macos_menu(app.handle())?;
|
||||
|
||||
@@ -423,18 +447,34 @@ pub fn run() {
|
||||
#[allow(unused_variables)]
|
||||
|app_handle, event| {
|
||||
#[cfg(target_os = "macos")]
|
||||
if let tauri::RunEvent::Opened { urls } = event {
|
||||
let files = urls
|
||||
.into_iter()
|
||||
.filter_map(|url| url.to_file_path().ok())
|
||||
.collect::<Vec<_>>();
|
||||
match event {
|
||||
tauri::RunEvent::Opened { urls } => {
|
||||
let files = urls
|
||||
.into_iter()
|
||||
.filter_map(|url| url.to_file_path().ok())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let app_handler_clone = app_handle.clone();
|
||||
allow_file_in_scopes(app_handle, files.clone());
|
||||
app_handle.listen("window-ready", move |_| {
|
||||
println!("Window is ready, proceeding to handle files.");
|
||||
set_window_open_with_files(&app_handler_clone, files.clone());
|
||||
});
|
||||
let app_handler_clone = app_handle.clone();
|
||||
allow_file_in_scopes(app_handle, files.clone());
|
||||
app_handle.listen("window-ready", move |_| {
|
||||
println!("Window is ready, proceeding to handle files.");
|
||||
set_window_open_with_files(&app_handler_clone, files.clone());
|
||||
});
|
||||
}
|
||||
// When the user reopens the app from the dock after closing all
|
||||
// windows, re-show the main window instead of leaving the dock
|
||||
// icon inert.
|
||||
tauri::RunEvent::Reopen {
|
||||
has_visible_windows: false,
|
||||
..
|
||||
} => {
|
||||
if let Some(window) = app_handle.get_webview_window("main") {
|
||||
let _ = window.show();
|
||||
let _ = window.set_focus();
|
||||
let _ = window.unminimize();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -158,7 +158,10 @@
|
||||
]
|
||||
},
|
||||
"deep-link": {
|
||||
"mobile": [{ "host": "web.readest.com" }],
|
||||
"mobile": [
|
||||
{ "scheme": ["https"], "host": "web.readest.com", "appLink": true },
|
||||
{ "scheme": ["readest"], "appLink": false }
|
||||
],
|
||||
"desktop": {
|
||||
"schemes": ["readest"]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import LibraryEmptyState from '@/app/library/components/LibraryEmptyState';
|
||||
|
||||
vi.mock('@/hooks/useTranslation', () => ({
|
||||
useTranslation: () => (key: string, options?: Record<string, string | number>) => {
|
||||
if (!options) return key;
|
||||
return key.replace(/{{(\w+)}}/g, (_match, name) => String(options[name] ?? ''));
|
||||
},
|
||||
}));
|
||||
|
||||
const useAuthMock = vi.fn();
|
||||
vi.mock('@/context/AuthContext', () => ({
|
||||
useAuth: () => useAuthMock(),
|
||||
}));
|
||||
|
||||
const navigateToLoginMock = vi.fn();
|
||||
const routerStub = { push: vi.fn(), replace: vi.fn(), back: vi.fn() };
|
||||
vi.mock('@/hooks/useAppRouter', () => ({
|
||||
useAppRouter: () => routerStub,
|
||||
}));
|
||||
vi.mock('@/utils/nav', () => ({
|
||||
navigateToLogin: (...args: unknown[]) => navigateToLoginMock(...args),
|
||||
}));
|
||||
|
||||
const useEnvMock = vi.fn();
|
||||
vi.mock('@/context/EnvContext', () => ({
|
||||
useEnv: () => useEnvMock(),
|
||||
}));
|
||||
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
useAuthMock.mockReset();
|
||||
navigateToLoginMock.mockReset();
|
||||
useEnvMock.mockReset();
|
||||
});
|
||||
|
||||
describe('LibraryEmptyState', () => {
|
||||
it('renders title, desktop description, and both CTAs when logged out on desktop', () => {
|
||||
useEnvMock.mockReturnValue({ appService: { isMobile: false } });
|
||||
useAuthMock.mockReturnValue({ user: null });
|
||||
render(<LibraryEmptyState onImport={vi.fn()} />);
|
||||
|
||||
expect(screen.getByRole('heading', { name: 'Start your library' })).toBeTruthy();
|
||||
expect(screen.getByText(/drop a book anywhere on this window/i)).toBeTruthy();
|
||||
expect(screen.getByRole('button', { name: 'Import Books' })).toBeTruthy();
|
||||
expect(screen.getByRole('button', { name: 'Sign in to sync your library' })).toBeTruthy();
|
||||
});
|
||||
|
||||
it('renders mobile description (no drag-drop language) when appService.isMobile', () => {
|
||||
useEnvMock.mockReturnValue({ appService: { isMobile: true } });
|
||||
useAuthMock.mockReturnValue({ user: null });
|
||||
render(<LibraryEmptyState onImport={vi.fn()} />);
|
||||
|
||||
expect(screen.getByText(/pick a book from your device/i)).toBeTruthy();
|
||||
expect(screen.queryByText(/drop a book anywhere on this window/i)).toBeNull();
|
||||
});
|
||||
|
||||
it('hides the sync button when the user is logged in', () => {
|
||||
useEnvMock.mockReturnValue({ appService: { isMobile: false } });
|
||||
useAuthMock.mockReturnValue({ user: { id: 'stub-user' } });
|
||||
render(<LibraryEmptyState onImport={vi.fn()} />);
|
||||
|
||||
expect(screen.getByRole('button', { name: 'Import Books' })).toBeTruthy();
|
||||
expect(screen.queryByRole('button', { name: 'Sign in to sync your library' })).toBeNull();
|
||||
});
|
||||
|
||||
it('calls onImport when the Import Books button is clicked', () => {
|
||||
useEnvMock.mockReturnValue({ appService: { isMobile: false } });
|
||||
useAuthMock.mockReturnValue({ user: null });
|
||||
const handleImport = vi.fn();
|
||||
render(<LibraryEmptyState onImport={handleImport} />);
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: 'Import Books' }));
|
||||
|
||||
expect(handleImport).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
@@ -52,7 +52,7 @@ import {
|
||||
MIME,
|
||||
validateOPDSURL,
|
||||
} from '@/app/opds/utils/opdsUtils';
|
||||
import type { OPDSLink } from '@/types/opds';
|
||||
import type { OPDSBaseLink } from '@/types/opds';
|
||||
import { fetchWithAuth } from '@/app/opds/utils/opdsReq';
|
||||
|
||||
const mockFetchWithAuth = vi.mocked(fetchWithAuth);
|
||||
@@ -195,70 +195,63 @@ describe('opdsUtils', () => {
|
||||
|
||||
describe('isSearchLink', () => {
|
||||
it('should return true for a search link with OPENSEARCH type', () => {
|
||||
const link: OPDSLink = {
|
||||
rel: 'search',
|
||||
const link: OPDSBaseLink = {
|
||||
rel: ['search'],
|
||||
href: '/search',
|
||||
type: MIME.OPENSEARCH,
|
||||
properties: {},
|
||||
};
|
||||
expect(isSearchLink(link)).toBe(true);
|
||||
});
|
||||
|
||||
it('should return true for a search link with ATOM type', () => {
|
||||
const link: OPDSLink = {
|
||||
rel: 'search',
|
||||
const link: OPDSBaseLink = {
|
||||
rel: ['search'],
|
||||
href: '/search',
|
||||
type: MIME.ATOM,
|
||||
properties: {},
|
||||
};
|
||||
expect(isSearchLink(link)).toBe(true);
|
||||
});
|
||||
|
||||
it('should return true when rel is an array containing "search"', () => {
|
||||
const link: OPDSLink = {
|
||||
const link: OPDSBaseLink = {
|
||||
rel: ['self', 'search'],
|
||||
href: '/search',
|
||||
type: MIME.OPENSEARCH,
|
||||
properties: {},
|
||||
};
|
||||
expect(isSearchLink(link)).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false when rel does not include "search"', () => {
|
||||
const link: OPDSLink = {
|
||||
rel: 'self',
|
||||
const link: OPDSBaseLink = {
|
||||
rel: ['self'],
|
||||
href: '/search',
|
||||
type: MIME.OPENSEARCH,
|
||||
properties: {},
|
||||
};
|
||||
expect(isSearchLink(link)).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false when type is not OPENSEARCH or ATOM', () => {
|
||||
const link: OPDSLink = {
|
||||
rel: 'search',
|
||||
const link: OPDSBaseLink = {
|
||||
rel: ['search'],
|
||||
href: '/search',
|
||||
type: 'text/html',
|
||||
properties: {},
|
||||
};
|
||||
expect(isSearchLink(link)).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false when rel is undefined', () => {
|
||||
const link: OPDSLink = {
|
||||
const link: OPDSBaseLink = {
|
||||
href: '/search',
|
||||
type: MIME.OPENSEARCH,
|
||||
properties: {},
|
||||
};
|
||||
expect(isSearchLink(link)).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false when rel is an empty array', () => {
|
||||
const link: OPDSLink = {
|
||||
const link: OPDSBaseLink = {
|
||||
rel: [],
|
||||
href: '/search',
|
||||
type: MIME.ATOM,
|
||||
properties: {},
|
||||
};
|
||||
expect(isSearchLink(link)).toBe(false);
|
||||
});
|
||||
|
||||
@@ -0,0 +1,448 @@
|
||||
/**
|
||||
* DictionarySheet tests — the mobile / narrow-viewport bottom sheet that
|
||||
* replaces DictionaryPopup for `< sm` viewports.
|
||||
*
|
||||
* Lookups go through real providers backed by the on-disk dict fixtures in
|
||||
* `src/__tests__/fixtures/data/dicts/`. The registry module is mocked per
|
||||
* test so we can hand the sheet a controlled provider list (real StarDict /
|
||||
* DICT instances + a couple of tiny in-test providers for navigation and
|
||||
* abort assertions).
|
||||
*/
|
||||
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
||||
import { render, screen, cleanup, fireEvent, waitFor, act } from '@testing-library/react';
|
||||
import type { ReactNode } from 'react';
|
||||
|
||||
import type { DictionaryProvider, DictionaryLookupOutcome } from '@/services/dictionaries/types';
|
||||
import { BUILTIN_WEB_SEARCH_IDS } from '@/services/dictionaries/types';
|
||||
import type { ImportedDictionary } from '@/services/dictionaries/types';
|
||||
import type { BaseDir } from '@/types/system';
|
||||
import { createStarDictProvider } from '@/services/dictionaries/providers/starDictProvider';
|
||||
import { createDictProvider } from '@/services/dictionaries/providers/dictProvider';
|
||||
import { useCustomDictionaryStore } from '@/store/customDictionaryStore';
|
||||
|
||||
import {
|
||||
IFO_FIXTURE_NAME,
|
||||
IDX_FIXTURE_NAME,
|
||||
DICT_FIXTURE_NAME,
|
||||
readIfoFile,
|
||||
readIdxFile,
|
||||
readDictFile as readStarDictFile,
|
||||
} from '../../../services/dictionaries/_stardictFixtures';
|
||||
import {
|
||||
INDEX_FIXTURE_NAME,
|
||||
DICT_FIXTURE_NAME as DICTD_FIXTURE_NAME,
|
||||
readIndexFile,
|
||||
readDictFile as readDictdFile,
|
||||
} from '../../../services/dictionaries/_dictFixtures';
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Mocks
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// Replace Dialog with a thin shell so the sheet's internals are testable
|
||||
// without dragging in theme/device/responsive/haptics dependencies.
|
||||
vi.mock('@/components/Dialog', () => ({
|
||||
default: ({
|
||||
children,
|
||||
header,
|
||||
isOpen,
|
||||
onClose,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
header?: ReactNode;
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
snapHeight?: number;
|
||||
contentClassName?: string;
|
||||
dismissible?: boolean;
|
||||
}) =>
|
||||
isOpen ? (
|
||||
<div role='dialog' data-testid='dialog'>
|
||||
<div data-testid='dialog-header'>{header}</div>
|
||||
<div data-testid='dialog-body'>{children}</div>
|
||||
<button data-testid='dialog-overlay-close' onClick={onClose} aria-label='backdrop' />
|
||||
</div>
|
||||
) : null,
|
||||
}));
|
||||
|
||||
vi.mock('@/hooks/useTranslation', () => ({
|
||||
useTranslation: () => (s: string) => s,
|
||||
}));
|
||||
|
||||
const mockOpenUrl = vi.fn().mockResolvedValue(undefined);
|
||||
vi.mock('@tauri-apps/plugin-opener', () => ({
|
||||
openUrl: (...args: unknown[]) => mockOpenUrl(...args),
|
||||
}));
|
||||
|
||||
vi.mock('@/services/environment', async () => {
|
||||
const actual =
|
||||
await vi.importActual<typeof import('@/services/environment')>('@/services/environment');
|
||||
return {
|
||||
...actual,
|
||||
isTauriAppPlatform: () => false,
|
||||
};
|
||||
});
|
||||
|
||||
// Mock the registry: every test pushes its own providers onto this list.
|
||||
const providersForNextRender: DictionaryProvider[] = [];
|
||||
vi.mock('@/services/dictionaries/registry', () => ({
|
||||
getEnabledProviders: () => [...providersForNextRender],
|
||||
__resetRegistryForTests: vi.fn(),
|
||||
evictProvider: vi.fn(),
|
||||
}));
|
||||
|
||||
// EnvProvider needs an appService; provide one with the file API the
|
||||
// (unmocked) StarDict provider uses for fixture reads.
|
||||
vi.mock('@/context/EnvContext', () => ({
|
||||
useEnv: () => ({
|
||||
envConfig: { getAppService: vi.fn().mockResolvedValue(null) },
|
||||
appService: { openFile: vi.fn() },
|
||||
}),
|
||||
}));
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Fixture-backed real providers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const realStarDictDict: ImportedDictionary = {
|
||||
id: 'stardict:cmudict',
|
||||
kind: 'stardict',
|
||||
name: 'CMU American English spelling',
|
||||
bundleDir: 'cmudict-bundle',
|
||||
files: { ifo: IFO_FIXTURE_NAME, idx: IDX_FIXTURE_NAME, dict: DICT_FIXTURE_NAME },
|
||||
addedAt: 1,
|
||||
};
|
||||
|
||||
const realDictdDict: ImportedDictionary = {
|
||||
id: 'dict:freedict-eng-nld',
|
||||
kind: 'dict',
|
||||
name: 'FreeDict English-Dutch',
|
||||
bundleDir: 'freedict-eng-nld-bundle',
|
||||
files: { dict: DICTD_FIXTURE_NAME, index: INDEX_FIXTURE_NAME },
|
||||
addedAt: 2,
|
||||
};
|
||||
|
||||
const makeStarDictFs = () => ({
|
||||
openFile: async (p: string, _base: BaseDir) => {
|
||||
const base = p.split('/').pop()!;
|
||||
if (base === IFO_FIXTURE_NAME) return readIfoFile();
|
||||
if (base === IDX_FIXTURE_NAME) return readIdxFile();
|
||||
if (base === DICT_FIXTURE_NAME) return readStarDictFile();
|
||||
throw new Error(`Unknown stardict fixture: ${base}`);
|
||||
},
|
||||
});
|
||||
|
||||
const makeDictdFs = () => ({
|
||||
openFile: async (p: string, _base: BaseDir) => {
|
||||
const base = p.split('/').pop()!;
|
||||
if (base === INDEX_FIXTURE_NAME) return readIndexFile();
|
||||
if (base === DICTD_FIXTURE_NAME) return readDictdFile();
|
||||
throw new Error(`Unknown dictd fixture: ${base}`);
|
||||
},
|
||||
});
|
||||
|
||||
const buildRealStarDictProvider = (): DictionaryProvider =>
|
||||
createStarDictProvider({ dict: realStarDictDict, fs: makeStarDictFs() });
|
||||
|
||||
const buildRealDictdProvider = (): DictionaryProvider =>
|
||||
createDictProvider({ dict: realDictdDict, fs: makeDictdFs() });
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// In-test providers — small fakes for behaviors that real fixture data
|
||||
// can't easily exercise (in-content navigation, slow lookups for abort).
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const buildNavProvider = (nextWord: string): DictionaryProvider => ({
|
||||
id: 'nav-test',
|
||||
kind: 'stardict',
|
||||
label: 'Nav Test',
|
||||
async lookup(word, ctx) {
|
||||
const a = document.createElement('a');
|
||||
a.href = '#';
|
||||
a.textContent = `→ ${nextWord}`;
|
||||
a.setAttribute('rel', 'mw:WikiLink');
|
||||
a.setAttribute('data-testid', 'nav-link');
|
||||
a.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
ctx.onNavigate?.(nextWord);
|
||||
});
|
||||
ctx.container.append(document.createTextNode(`current: ${word} `));
|
||||
ctx.container.append(a);
|
||||
return { ok: true, headword: word, sourceLabel: 'Nav Test' };
|
||||
},
|
||||
});
|
||||
|
||||
const buildSlowProvider = (abortObserver: { aborted: boolean }): DictionaryProvider => ({
|
||||
id: 'slow',
|
||||
kind: 'stardict',
|
||||
label: 'Slow',
|
||||
async lookup(_word, ctx): Promise<DictionaryLookupOutcome> {
|
||||
return new Promise<DictionaryLookupOutcome>((resolve) => {
|
||||
ctx.signal.addEventListener('abort', () => {
|
||||
abortObserver.aborted = true;
|
||||
resolve({ ok: false, reason: 'error', message: 'aborted' });
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const buildEmptyProvider = (id: string, label: string): DictionaryProvider => ({
|
||||
id,
|
||||
kind: 'stardict',
|
||||
label,
|
||||
async lookup() {
|
||||
return { ok: false, reason: 'empty' };
|
||||
},
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Sheet harness
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
import DictionarySheet from '@/app/reader/components/annotator/DictionarySheet';
|
||||
|
||||
const renderSheet = (
|
||||
props: Partial<{
|
||||
word: string;
|
||||
lang: string;
|
||||
onDismiss: () => void;
|
||||
onManage: () => void;
|
||||
}> = {},
|
||||
) =>
|
||||
render(
|
||||
<DictionarySheet
|
||||
word={props.word ?? 'hello'}
|
||||
lang={props.lang}
|
||||
onDismiss={props.onDismiss ?? (() => {})}
|
||||
onManage={props.onManage}
|
||||
/>,
|
||||
);
|
||||
|
||||
const resetStoreToEmpty = () => {
|
||||
useCustomDictionaryStore.setState({
|
||||
dictionaries: [],
|
||||
settings: {
|
||||
providerOrder: [],
|
||||
providerEnabled: {},
|
||||
webSearches: [],
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
providersForNextRender.length = 0;
|
||||
mockOpenUrl.mockClear();
|
||||
resetStoreToEmpty();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Tests
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
describe('DictionarySheet — header', () => {
|
||||
it('renders the looked-up word and a manage button; no back button at history length 1', async () => {
|
||||
providersForNextRender.push(buildRealStarDictProvider());
|
||||
renderSheet({ word: 'hello', onManage: vi.fn() });
|
||||
|
||||
expect((await screen.findByTestId('dict-title')).textContent).toBe('hello');
|
||||
expect(screen.getByLabelText('Manage Dictionaries')).toBeTruthy();
|
||||
expect(screen.queryByLabelText('Back')).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('DictionarySheet — concurrent lookup', () => {
|
||||
it('fans out lookups across every enabled definition provider', async () => {
|
||||
const stardict = buildRealStarDictProvider();
|
||||
const dictd = buildRealDictdProvider();
|
||||
const stardictSpy = vi.spyOn(stardict, 'lookup');
|
||||
const dictdSpy = vi.spyOn(dictd, 'lookup');
|
||||
providersForNextRender.push(stardict, dictd);
|
||||
|
||||
renderSheet({ word: 'hello' });
|
||||
|
||||
await waitFor(() => {
|
||||
expect(stardictSpy).toHaveBeenCalledWith('hello', expect.any(Object));
|
||||
expect(dictdSpy).toHaveBeenCalledWith('hello', expect.any(Object));
|
||||
});
|
||||
});
|
||||
|
||||
it('renders the cmudict card after the lookup settles', async () => {
|
||||
providersForNextRender.push(buildRealStarDictProvider());
|
||||
renderSheet({ word: 'hello' });
|
||||
|
||||
await screen.findByText('CMU American English spelling');
|
||||
});
|
||||
|
||||
it('hides cards from providers that return empty', async () => {
|
||||
providersForNextRender.push(
|
||||
buildRealStarDictProvider(),
|
||||
buildEmptyProvider('empty:1', 'Empty One'),
|
||||
buildEmptyProvider('empty:2', 'Empty Two'),
|
||||
);
|
||||
renderSheet({ word: 'hello' });
|
||||
|
||||
// The cmudict card eventually appears.
|
||||
await screen.findByText('CMU American English spelling');
|
||||
// The two empty providers never render a card.
|
||||
expect(screen.queryByText('Empty One')).toBeNull();
|
||||
expect(screen.queryByText('Empty Two')).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('DictionarySheet — expand / collapse', () => {
|
||||
it('toggles aria-expanded when a card is tapped', async () => {
|
||||
providersForNextRender.push(buildRealStarDictProvider());
|
||||
renderSheet({ word: 'hello' });
|
||||
|
||||
// Wait for the lookup to finish (source label visible).
|
||||
await screen.findByText('CMU American English spelling');
|
||||
const card = screen.getByTestId('dict-card');
|
||||
// With ≤ 3 results the sheet defaults to expanded.
|
||||
await waitFor(() => expect(card.getAttribute('aria-expanded')).toBe('true'));
|
||||
|
||||
fireEvent.click(card);
|
||||
expect(card.getAttribute('aria-expanded')).toBe('false');
|
||||
|
||||
fireEvent.click(card);
|
||||
expect(card.getAttribute('aria-expanded')).toBe('true');
|
||||
});
|
||||
|
||||
it('defaults to collapsed when more than 3 providers have results', async () => {
|
||||
// Four providers, all with content → > 3 → default-collapsed.
|
||||
const providers: DictionaryProvider[] = [];
|
||||
for (let i = 0; i < 4; i++) {
|
||||
providers.push({
|
||||
id: `pseudo:${i}`,
|
||||
kind: 'stardict',
|
||||
label: `Pseudo ${i}`,
|
||||
async lookup(word, ctx) {
|
||||
ctx.container.append(document.createTextNode(`def for ${word} #${i}`));
|
||||
return { ok: true, headword: word, sourceLabel: `Pseudo ${i}` };
|
||||
},
|
||||
});
|
||||
}
|
||||
providersForNextRender.push(...providers);
|
||||
renderSheet({ word: 'hello' });
|
||||
|
||||
await screen.findByText('Pseudo 0');
|
||||
const cards = screen.getAllByTestId('dict-card');
|
||||
expect(cards).toHaveLength(4);
|
||||
for (const card of cards) {
|
||||
expect(card.getAttribute('aria-expanded')).toBe('false');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('DictionarySheet — in-content navigation', () => {
|
||||
it('pushes onto the history stack when a provider link triggers onNavigate; back button appears', async () => {
|
||||
providersForNextRender.push(buildNavProvider('world'));
|
||||
renderSheet({ word: 'hello' });
|
||||
|
||||
expect((await screen.findByTestId('dict-title')).textContent).toBe('hello');
|
||||
expect(screen.queryByLabelText('Back')).toBeNull();
|
||||
|
||||
const navLink = await screen.findByTestId('nav-link');
|
||||
await act(async () => {
|
||||
fireEvent.click(navLink);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(screen.getByTestId('dict-title').textContent).toBe('world');
|
||||
});
|
||||
expect(screen.getByLabelText('Back')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('back button pops the history stack and restores the previous word', async () => {
|
||||
providersForNextRender.push(buildNavProvider('world'));
|
||||
renderSheet({ word: 'hello' });
|
||||
|
||||
const navLink = await screen.findByTestId('nav-link');
|
||||
await act(async () => {
|
||||
fireEvent.click(navLink);
|
||||
});
|
||||
await waitFor(() => expect(screen.getByTestId('dict-title').textContent).toBe('world'));
|
||||
|
||||
fireEvent.click(screen.getByLabelText('Back'));
|
||||
await waitFor(() => expect(screen.getByTestId('dict-title').textContent).toBe('hello'));
|
||||
expect(screen.queryByLabelText('Back')).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('DictionarySheet — web search row', () => {
|
||||
it('renders a link with the resolved URL and target="_blank" on the web build', async () => {
|
||||
// Real built-in Google web-search provider, via the registry mock.
|
||||
const googleEntry: DictionaryProvider = {
|
||||
id: BUILTIN_WEB_SEARCH_IDS.google,
|
||||
kind: 'web',
|
||||
label: 'Google',
|
||||
async lookup() {
|
||||
return { ok: true };
|
||||
},
|
||||
};
|
||||
// Enable the google entry in the store so the sheet can resolve its
|
||||
// urlTemplate from BUILTIN_WEB_SEARCHES.
|
||||
useCustomDictionaryStore.setState({
|
||||
dictionaries: [],
|
||||
settings: {
|
||||
providerOrder: [BUILTIN_WEB_SEARCH_IDS.google],
|
||||
providerEnabled: { [BUILTIN_WEB_SEARCH_IDS.google]: true },
|
||||
webSearches: [],
|
||||
},
|
||||
});
|
||||
providersForNextRender.push(googleEntry);
|
||||
|
||||
renderSheet({ word: 'hello world' });
|
||||
|
||||
// The test setup mocks `isTauriAppPlatform: () => false`, so we
|
||||
// exercise the web-build path: anchor with href + target="_blank",
|
||||
// openUrl untouched.
|
||||
const link = (await screen.findByRole('link', { name: /Google/i })) as HTMLAnchorElement;
|
||||
expect(link.getAttribute('target')).toBe('_blank');
|
||||
expect(link.getAttribute('rel')).toContain('noopener');
|
||||
const url = link.getAttribute('href') ?? '';
|
||||
expect(url.startsWith('https://www.google.com/search')).toBe(true);
|
||||
expect(url).toContain(encodeURIComponent('hello world'));
|
||||
|
||||
fireEvent.click(link);
|
||||
expect(mockOpenUrl).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('DictionarySheet — empty state', () => {
|
||||
it('renders "No dictionaries enabled" + manage gear when zero providers are configured', async () => {
|
||||
// providersForNextRender stays empty.
|
||||
const onManage = vi.fn();
|
||||
renderSheet({ word: 'hello', onManage });
|
||||
|
||||
expect(await screen.findByText('No dictionaries enabled')).toBeTruthy();
|
||||
const gear = screen.getByLabelText('Manage Dictionaries');
|
||||
fireEvent.click(gear);
|
||||
expect(onManage).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('DictionarySheet — abort on unmount', () => {
|
||||
it('aborts in-flight provider lookups when the sheet unmounts', async () => {
|
||||
const observer = { aborted: false };
|
||||
providersForNextRender.push(buildSlowProvider(observer));
|
||||
|
||||
const { unmount } = renderSheet({ word: 'hello' });
|
||||
|
||||
// Wait until the lookup has been kicked off (the provider hasn't
|
||||
// resolved yet — it's pending on its abort listener).
|
||||
await waitFor(() => {
|
||||
// Skeleton card rendered while loading.
|
||||
expect(screen.queryByTestId('dict-card-skeleton')).toBeTruthy();
|
||||
});
|
||||
|
||||
unmount();
|
||||
|
||||
await waitFor(() => {
|
||||
expect(observer.aborted).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,4 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { describe, it, expect, vi } from 'vitest';
|
||||
import type { TOCItem } from '@/libs/document';
|
||||
|
||||
/**
|
||||
@@ -41,6 +41,39 @@ const flattenTOC = (items: TOCItem[], expandedItems: Set<string>, depth = 0): TO
|
||||
return result;
|
||||
};
|
||||
|
||||
// Helpers mirrored from TOCView.tsx for the initial-scroll-target logic.
|
||||
// These drive the Virtuoso `initialTopMostItemIndex` prop, which avoids the
|
||||
// race where a setTimeout-based scrollToIndex fires before Virtuoso has
|
||||
// finished its first layout pass.
|
||||
const findParentPath = (items: TOCItem[], href: string, path: TOCItem[] = []): TOCItem[] => {
|
||||
for (const item of items) {
|
||||
const newPath = [...path, item];
|
||||
if (item.href === href) return path;
|
||||
if (item.subitems) {
|
||||
const found = findParentPath(item.subitems, href, newPath);
|
||||
if (found.length > 0) return found;
|
||||
}
|
||||
}
|
||||
return [];
|
||||
};
|
||||
|
||||
const computeExpandedSet = (toc: TOCItem[], href: string | undefined): Set<string> => {
|
||||
const topLevel = toc.filter((item) => item.subitems?.length).map(getItemIdentifier);
|
||||
const parents = href ? findParentPath(toc, href).map(getItemIdentifier).filter(Boolean) : [];
|
||||
return new Set([...topLevel, ...parents]);
|
||||
};
|
||||
|
||||
const getInitialScrollTarget = (
|
||||
toc: TOCItem[],
|
||||
href: string | undefined,
|
||||
): { index: number; expanded: Set<string> } => {
|
||||
const expanded = computeExpandedSet(toc, href);
|
||||
if (!href) return { index: 0, expanded };
|
||||
const flat = flattenTOC(toc, expanded);
|
||||
const idx = flat.findIndex((item) => item.href === href);
|
||||
return { index: idx > 0 ? idx : 0, expanded };
|
||||
};
|
||||
|
||||
describe('TOC sidebar initialization', () => {
|
||||
const nestedTOC: TOCItem[] = [
|
||||
{
|
||||
@@ -112,3 +145,352 @@ describe('TOC sidebar initialization', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Regression test for TOC auto-scroll race condition.
|
||||
*
|
||||
* When the TOC opens with an existing book progress, the view must scroll to
|
||||
* the current item. The previous implementation used a 300 ms setTimeout to
|
||||
* trigger `scrollToIndex` after mount. That races with Virtuoso's internal
|
||||
* layout stabilization: under load the timer occasionally fires first, the
|
||||
* TOC scrolls to the target, and then Virtuoso's late layout pass snaps the
|
||||
* list back to the top.
|
||||
*
|
||||
* Fix: compute the initial scroll target synchronously during mount so it
|
||||
* can be fed to Virtuoso's `initialTopMostItemIndex` prop, which Virtuoso
|
||||
* uses to perform the first scroll itself — no setTimeout race.
|
||||
*/
|
||||
describe('TOC initial scroll target', () => {
|
||||
const nestedTOC: TOCItem[] = [
|
||||
{
|
||||
id: 0,
|
||||
label: 'Book',
|
||||
href: undefined,
|
||||
subitems: [
|
||||
{ id: 1, label: 'Chapter 1', href: 'ch1.html' },
|
||||
{ id: 2, label: 'Chapter 2', href: 'ch2.html' },
|
||||
{ id: 3, label: 'Chapter 3', href: 'ch3.html' },
|
||||
],
|
||||
} as unknown as TOCItem,
|
||||
];
|
||||
|
||||
const flatTOC: TOCItem[] = [
|
||||
{ id: 1, label: 'Chapter 1', href: 'ch1.html' } as unknown as TOCItem,
|
||||
{ id: 2, label: 'Chapter 2', href: 'ch2.html' } as unknown as TOCItem,
|
||||
{ id: 3, label: 'Chapter 3', href: 'ch3.html' } as unknown as TOCItem,
|
||||
];
|
||||
|
||||
it('returns index 0 when no current href is provided', () => {
|
||||
const { index, expanded } = getInitialScrollTarget(nestedTOC, undefined);
|
||||
expect(index).toBe(0);
|
||||
// Top-level container is still expanded so the list renders its chapters.
|
||||
expect(expanded.size).toBe(1);
|
||||
});
|
||||
|
||||
it('resolves the current chapter inside a nested TOC with parents expanded', () => {
|
||||
const { index, expanded } = getInitialScrollTarget(nestedTOC, 'ch3.html');
|
||||
// flat order is Book, Ch1, Ch2, Ch3 → current chapter sits at index 3.
|
||||
expect(index).toBe(3);
|
||||
expect(expanded.has(getItemIdentifier(nestedTOC[0]!))).toBe(true);
|
||||
});
|
||||
|
||||
it('resolves the current chapter inside a flat TOC', () => {
|
||||
const { index } = getInitialScrollTarget(flatTOC, 'ch2.html');
|
||||
expect(index).toBe(1);
|
||||
});
|
||||
|
||||
it('falls back to index 0 when the href cannot be found', () => {
|
||||
const { index } = getInitialScrollTarget(nestedTOC, 'missing.html');
|
||||
expect(index).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Regression test for desktop pinned-sidebar auto-scroll failure.
|
||||
*
|
||||
* Setup: with the sidebar pinned, TOCView mounts as soon as bookData is
|
||||
* ready — BEFORE FoliateViewer emits its first relocate event. So at mount
|
||||
* time progress is null and `initialScrollTarget.index` is 0, which means
|
||||
* Virtuoso's `initialTopMostItemIndex` doesn't perform the initial scroll.
|
||||
*
|
||||
* Root cause (confirmed via on-device tracing): when progress finally
|
||||
* arrives, the post-mount progress effect (a) queues `setExpandedItems` to
|
||||
* expand the active section's parents and (b) sets `pendingScrollRef.current
|
||||
* = true`. In the SAME commit the second effect runs against the stale
|
||||
* pre-update `flatItems` (the active section's parent isn't expanded yet),
|
||||
* `findIndex` returns -1, and the old code unconditionally cleared
|
||||
* `pendingScrollRef`. By the time the next render arrives with `flatItems`
|
||||
* containing the active section, the pending flag is gone and the second
|
||||
* effect bails. Toggling the sidebar off-then-on worked around it by
|
||||
* remounting TOCView with progress already set, so Virtuoso's
|
||||
* `initialTopMostItemIndex` handled the first scroll on its own.
|
||||
*
|
||||
* Fix: leave `pendingScrollRef.current = true` when `idx === -1` so the
|
||||
* second effect retries on the next render once `flatItems` reflects the
|
||||
* expanded parents. Defensively also gate the userScrolled bail in the
|
||||
* progress effect on a `initialAutoScrollProcessedRef`, and clear pending
|
||||
* on a real user-driven scroll so a stale pending can't yank the user
|
||||
* later.
|
||||
*/
|
||||
describe('TOC pinned-sidebar initial auto-scroll', () => {
|
||||
type Refs = {
|
||||
userScrolled: boolean;
|
||||
pendingScroll: boolean;
|
||||
initialScrollHandled: boolean;
|
||||
initialAutoScrollProcessed: boolean;
|
||||
};
|
||||
|
||||
type EffectInput = {
|
||||
isSideBarVisible: boolean;
|
||||
sideBarBookKey: string | null;
|
||||
bookKey: string;
|
||||
sectionHref: string | undefined;
|
||||
};
|
||||
|
||||
// Mirrors the post-mount effect in TOCView.tsx BEFORE the fix.
|
||||
// userScrolled alone gates the early return.
|
||||
const runEffectOld = (refs: Refs, input: EffectInput): void => {
|
||||
if (!input.isSideBarVisible || input.sideBarBookKey !== input.bookKey) {
|
||||
refs.userScrolled = false;
|
||||
refs.pendingScroll = false;
|
||||
return;
|
||||
}
|
||||
if (refs.userScrolled) return;
|
||||
if (input.sectionHref) {
|
||||
if (refs.initialScrollHandled) {
|
||||
refs.initialScrollHandled = false;
|
||||
} else {
|
||||
refs.pendingScroll = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Mirrors the post-mount effect in TOCView.tsx AFTER the fix.
|
||||
// The userScrolled gate is qualified by initialAutoScrollProcessed
|
||||
// so spurious OS-init scrolls before the first progress arrives can't
|
||||
// suppress the initial auto-scroll.
|
||||
const runEffectNew = (refs: Refs, input: EffectInput): void => {
|
||||
if (!input.isSideBarVisible || input.sideBarBookKey !== input.bookKey) {
|
||||
refs.userScrolled = false;
|
||||
refs.pendingScroll = false;
|
||||
refs.initialAutoScrollProcessed = false;
|
||||
return;
|
||||
}
|
||||
if (refs.userScrolled && refs.initialAutoScrollProcessed) return;
|
||||
if (input.sectionHref) {
|
||||
if (refs.initialScrollHandled) {
|
||||
refs.initialScrollHandled = false;
|
||||
} else {
|
||||
refs.pendingScroll = true;
|
||||
}
|
||||
refs.initialAutoScrollProcessed = true;
|
||||
}
|
||||
};
|
||||
|
||||
describe('before fix (demonstrates the bug)', () => {
|
||||
it('pinned-sidebar mount + spurious OS-init scroll event suppresses the initial auto-scroll', () => {
|
||||
// Sidebar pinned: mounts before relocate. Progress is null at mount.
|
||||
const refs: Refs = {
|
||||
userScrolled: false,
|
||||
pendingScroll: false,
|
||||
initialScrollHandled: false, // index === 0 at mount, no Virtuoso initial scroll
|
||||
initialAutoScrollProcessed: false,
|
||||
};
|
||||
|
||||
// First effect fire: no progress yet.
|
||||
runEffectOld(refs, {
|
||||
isSideBarVisible: true,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: undefined,
|
||||
});
|
||||
|
||||
// OverlayScrollbars wraps the viewport, scrollTop resets to 0, and
|
||||
// Virtuoso's onScroll handler flips the ref.
|
||||
refs.userScrolled = true;
|
||||
|
||||
// FoliateViewer's first relocate finally fires.
|
||||
runEffectOld(refs, {
|
||||
isSideBarVisible: true,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: 'ch3.html',
|
||||
});
|
||||
|
||||
// BUG: pending scroll is never set, so the TOC stays at the top.
|
||||
expect(refs.pendingScroll).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('after fix', () => {
|
||||
it('schedules pending scroll when progress arrives after mount even if a spurious scroll event was logged', () => {
|
||||
const refs: Refs = {
|
||||
userScrolled: false,
|
||||
pendingScroll: false,
|
||||
initialScrollHandled: false,
|
||||
initialAutoScrollProcessed: false,
|
||||
};
|
||||
|
||||
runEffectNew(refs, {
|
||||
isSideBarVisible: true,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: undefined,
|
||||
});
|
||||
expect(refs.pendingScroll).toBe(false);
|
||||
expect(refs.initialAutoScrollProcessed).toBe(false);
|
||||
|
||||
refs.userScrolled = true;
|
||||
|
||||
runEffectNew(refs, {
|
||||
isSideBarVisible: true,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: 'ch3.html',
|
||||
});
|
||||
|
||||
expect(refs.pendingScroll).toBe(true);
|
||||
expect(refs.initialAutoScrollProcessed).toBe(true);
|
||||
});
|
||||
|
||||
it('still suppresses auto-scroll once the initial progress has been processed and the user scrolled', () => {
|
||||
const refs: Refs = {
|
||||
userScrolled: false,
|
||||
pendingScroll: false,
|
||||
initialScrollHandled: true, // mobile case: mounted with valid progress
|
||||
initialAutoScrollProcessed: false,
|
||||
};
|
||||
|
||||
runEffectNew(refs, {
|
||||
isSideBarVisible: true,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: 'ch3.html',
|
||||
});
|
||||
expect(refs.initialScrollHandled).toBe(false);
|
||||
expect(refs.pendingScroll).toBe(false);
|
||||
expect(refs.initialAutoScrollProcessed).toBe(true);
|
||||
|
||||
refs.userScrolled = true;
|
||||
|
||||
runEffectNew(refs, {
|
||||
isSideBarVisible: true,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: 'ch5.html',
|
||||
});
|
||||
expect(refs.pendingScroll).toBe(false);
|
||||
});
|
||||
|
||||
it('hide-then-show resets the processed flag so re-showing re-runs auto-scroll', () => {
|
||||
const refs: Refs = {
|
||||
userScrolled: true,
|
||||
pendingScroll: false,
|
||||
initialScrollHandled: false,
|
||||
initialAutoScrollProcessed: true,
|
||||
};
|
||||
|
||||
runEffectNew(refs, {
|
||||
isSideBarVisible: false,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: 'ch3.html',
|
||||
});
|
||||
expect(refs.userScrolled).toBe(false);
|
||||
expect(refs.initialAutoScrollProcessed).toBe(false);
|
||||
|
||||
runEffectNew(refs, {
|
||||
isSideBarVisible: true,
|
||||
sideBarBookKey: 'book1',
|
||||
bookKey: 'book1',
|
||||
sectionHref: 'ch3.html',
|
||||
});
|
||||
expect(refs.pendingScroll).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('TOC scroll effect retries when flatItems is stale', () => {
|
||||
type Refs = { pendingScroll: boolean };
|
||||
|
||||
// Mirrors the scroll effect in TOCView.tsx BEFORE the fix: clears
|
||||
// pendingScrollRef unconditionally even when the active section is not
|
||||
// yet in flatItems.
|
||||
const runScrollOld = (
|
||||
refs: Refs,
|
||||
activeHref: string | null,
|
||||
flatItems: { href: string }[],
|
||||
onScroll: (idx: number) => void,
|
||||
): void => {
|
||||
if (!refs.pendingScroll || !activeHref) return;
|
||||
const idx = flatItems.findIndex((f) => f.href === activeHref);
|
||||
if (idx !== -1) onScroll(idx);
|
||||
refs.pendingScroll = false; // bug: cleared even on idx === -1
|
||||
};
|
||||
|
||||
// Mirrors the scroll effect AFTER the fix: leaves pendingScrollRef set
|
||||
// when idx === -1 so the next render with refreshed flatItems retries.
|
||||
const runScrollNew = (
|
||||
refs: Refs,
|
||||
activeHref: string | null,
|
||||
flatItems: { href: string }[],
|
||||
onScroll: (idx: number) => void,
|
||||
): void => {
|
||||
if (!refs.pendingScroll || !activeHref) return;
|
||||
const idx = flatItems.findIndex((f) => f.href === activeHref);
|
||||
if (idx === -1) return; // wait for flatItems to include the section
|
||||
onScroll(idx);
|
||||
refs.pendingScroll = false;
|
||||
};
|
||||
|
||||
describe('before fix (demonstrates the bug)', () => {
|
||||
it('clears pendingScroll on the stale flatItems pass and never recovers', () => {
|
||||
const refs: Refs = { pendingScroll: true };
|
||||
const scroll = vi.fn();
|
||||
|
||||
// Render N: setExpandedItems was just queued by the progress
|
||||
// effect — flatItems still reflects the pre-update state and does
|
||||
// not include the deeply-nested active section.
|
||||
const staleFlat = [{ href: 'parent.html' }];
|
||||
runScrollOld(refs, 'child.html', staleFlat, scroll);
|
||||
expect(scroll).not.toHaveBeenCalled();
|
||||
expect(refs.pendingScroll).toBe(false); // BUG: cleared
|
||||
|
||||
// Render N+1: flatItems now includes the active section, but
|
||||
// pendingScroll has already been cleared.
|
||||
const freshFlat = [{ href: 'parent.html' }, { href: 'child.html' }];
|
||||
runScrollNew(refs, 'child.html', freshFlat, scroll);
|
||||
expect(scroll).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('after fix', () => {
|
||||
it('preserves pendingScroll on stale flatItems and scrolls on the next render', () => {
|
||||
const refs: Refs = { pendingScroll: true };
|
||||
const scroll = vi.fn();
|
||||
|
||||
const staleFlat = [{ href: 'parent.html' }];
|
||||
runScrollNew(refs, 'child.html', staleFlat, scroll);
|
||||
expect(scroll).not.toHaveBeenCalled();
|
||||
expect(refs.pendingScroll).toBe(true); // preserved
|
||||
|
||||
const freshFlat = [{ href: 'parent.html' }, { href: 'child.html' }];
|
||||
runScrollNew(refs, 'child.html', freshFlat, scroll);
|
||||
expect(scroll).toHaveBeenCalledWith(1);
|
||||
expect(refs.pendingScroll).toBe(false);
|
||||
});
|
||||
|
||||
it('clears pendingScroll once the scroll fires so it does not re-trigger', () => {
|
||||
const refs: Refs = { pendingScroll: true };
|
||||
const scroll = vi.fn();
|
||||
const flat = [{ href: 'a.html' }, { href: 'b.html' }];
|
||||
|
||||
runScrollNew(refs, 'b.html', flat, scroll);
|
||||
expect(scroll).toHaveBeenCalledTimes(1);
|
||||
|
||||
// A subsequent flatItems change without a new pending must not scroll again.
|
||||
runScrollNew(refs, 'b.html', flat, scroll);
|
||||
expect(scroll).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
import { describe, test, expect, vi } from 'vitest';
|
||||
import {
|
||||
cancelDeferredAction,
|
||||
createDeferredActionState,
|
||||
flushDeferredAction,
|
||||
runOrDeferAction,
|
||||
} from '@/app/reader/utils/deferredAction';
|
||||
|
||||
describe('deferredAction', () => {
|
||||
test('runs action immediately when shouldDefer is false', () => {
|
||||
const state = createDeferredActionState();
|
||||
const action = vi.fn();
|
||||
|
||||
runOrDeferAction(state, false, action);
|
||||
|
||||
expect(action).toHaveBeenCalledTimes(1);
|
||||
expect(state.pending).toBeNull();
|
||||
});
|
||||
|
||||
test('stores action without running when shouldDefer is true', () => {
|
||||
const state = createDeferredActionState();
|
||||
const action = vi.fn();
|
||||
|
||||
runOrDeferAction(state, true, action);
|
||||
|
||||
expect(action).not.toHaveBeenCalled();
|
||||
expect(state.pending).toBe(action);
|
||||
});
|
||||
|
||||
test('flushDeferredAction runs the latest deferred action exactly once', () => {
|
||||
const state = createDeferredActionState();
|
||||
const action = vi.fn();
|
||||
|
||||
runOrDeferAction(state, true, action);
|
||||
flushDeferredAction(state);
|
||||
|
||||
expect(action).toHaveBeenCalledTimes(1);
|
||||
expect(state.pending).toBeNull();
|
||||
|
||||
flushDeferredAction(state);
|
||||
expect(action).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
test('successive defers replace the pending action so flush runs only the last one', () => {
|
||||
const state = createDeferredActionState();
|
||||
const first = vi.fn();
|
||||
const second = vi.fn();
|
||||
|
||||
runOrDeferAction(state, true, first);
|
||||
runOrDeferAction(state, true, second);
|
||||
flushDeferredAction(state);
|
||||
|
||||
expect(first).not.toHaveBeenCalled();
|
||||
expect(second).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
test('cancelDeferredAction discards a pending action without running it', () => {
|
||||
const state = createDeferredActionState();
|
||||
const action = vi.fn();
|
||||
|
||||
runOrDeferAction(state, true, action);
|
||||
cancelDeferredAction(state);
|
||||
flushDeferredAction(state);
|
||||
|
||||
expect(action).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test('Android long-press scenario: selection-then-touchend runs the action once', () => {
|
||||
// Models the Annotator flow on Android:
|
||||
// 1. touchstart -> androidTouchEnd = false (defer state cleared)
|
||||
// 2. selectionchange -> handleQuickAction (deferred because !androidTouchEnd)
|
||||
// 3. touchend -> androidTouchEnd = true, flushDeferredAction
|
||||
const state = createDeferredActionState();
|
||||
const quickAction = vi.fn();
|
||||
let androidTouchEnd = false;
|
||||
|
||||
// touchstart
|
||||
cancelDeferredAction(state);
|
||||
androidTouchEnd = false;
|
||||
|
||||
// selectionchange triggers the quick action
|
||||
runOrDeferAction(state, !androidTouchEnd, quickAction);
|
||||
expect(quickAction).not.toHaveBeenCalled();
|
||||
|
||||
// touchend: gate opens, pending action fires
|
||||
androidTouchEnd = true;
|
||||
flushDeferredAction(state);
|
||||
expect(quickAction).toHaveBeenCalledTimes(1);
|
||||
|
||||
// A subsequent stray touchend must not re-run the action
|
||||
flushDeferredAction(state);
|
||||
expect(quickAction).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,151 @@
|
||||
import { describe, expect, test, vi, beforeEach, afterEach } from 'vitest';
|
||||
import {
|
||||
SmoothScroller,
|
||||
isLikelyMouseWheel,
|
||||
type SmoothScrollTarget,
|
||||
} from '@/app/reader/utils/smoothWheelScroll';
|
||||
|
||||
describe('isLikelyMouseWheel', () => {
|
||||
test('treats line-mode wheel events as mouse wheel regardless of magnitude', () => {
|
||||
expect(isLikelyMouseWheel({ deltaMode: 1, deltaX: 0, deltaY: 1 })).toBe(true);
|
||||
expect(isLikelyMouseWheel({ deltaMode: 1, deltaX: 0, deltaY: 3 })).toBe(true);
|
||||
});
|
||||
|
||||
test('returns false when there is no vertical motion', () => {
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: 0 })).toBe(false);
|
||||
});
|
||||
|
||||
test('treats two-axis pixel motion as trackpad', () => {
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 8, deltaY: 200 })).toBe(false);
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: -1, deltaY: 100 })).toBe(false);
|
||||
});
|
||||
|
||||
test('treats small per-event pixel deltas as trackpad even on a single axis', () => {
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: 4 })).toBe(false);
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: 49 })).toBe(false);
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: -49 })).toBe(false);
|
||||
});
|
||||
|
||||
test('treats large single-axis pixel deltas as mouse wheel', () => {
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: 100 })).toBe(true);
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: 120 })).toBe(true);
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: -100 })).toBe(true);
|
||||
expect(isLikelyMouseWheel({ deltaMode: 0, deltaX: 0, deltaY: 53 })).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
const flushFrames = async (frames: number, advanceMs = 16) => {
|
||||
for (let i = 0; i < frames; i++) {
|
||||
vi.advanceTimersByTime(advanceMs);
|
||||
await Promise.resolve();
|
||||
}
|
||||
};
|
||||
|
||||
describe('SmoothScroller', () => {
|
||||
let target: SmoothScrollTarget;
|
||||
let now: number;
|
||||
|
||||
beforeEach(() => {
|
||||
vi.useFakeTimers();
|
||||
now = 0;
|
||||
vi.spyOn(performance, 'now').mockImplementation(() => now);
|
||||
let raf = 0;
|
||||
const handles = new Map<number, FrameRequestCallback>();
|
||||
vi.stubGlobal('requestAnimationFrame', ((cb: FrameRequestCallback) => {
|
||||
raf += 1;
|
||||
handles.set(raf, cb);
|
||||
setTimeout(() => {
|
||||
const fn = handles.get(raf);
|
||||
if (fn) {
|
||||
handles.delete(raf);
|
||||
now += 16;
|
||||
fn(now);
|
||||
}
|
||||
}, 16);
|
||||
return raf;
|
||||
}) as typeof requestAnimationFrame);
|
||||
vi.stubGlobal('cancelAnimationFrame', ((id: number) => {
|
||||
handles.delete(id);
|
||||
}) as typeof cancelAnimationFrame);
|
||||
|
||||
let position = 0;
|
||||
target = {
|
||||
get position() {
|
||||
return position;
|
||||
},
|
||||
set position(value: number) {
|
||||
position = value;
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.useRealTimers();
|
||||
vi.restoreAllMocks();
|
||||
vi.unstubAllGlobals();
|
||||
});
|
||||
|
||||
test('moves toward target without overshooting', async () => {
|
||||
const scroller = new SmoothScroller();
|
||||
scroller.scrollBy(target, 200);
|
||||
|
||||
await flushFrames(60);
|
||||
|
||||
expect(target.position).toBeCloseTo(200, 1);
|
||||
});
|
||||
|
||||
test('accumulates new deltas while animating', async () => {
|
||||
const scroller = new SmoothScroller();
|
||||
scroller.scrollBy(target, 100);
|
||||
await flushFrames(2);
|
||||
scroller.scrollBy(target, 100);
|
||||
|
||||
await flushFrames(120);
|
||||
|
||||
expect(target.position).toBeCloseTo(200, 1);
|
||||
});
|
||||
|
||||
test('zero delta is a no-op', () => {
|
||||
const scroller = new SmoothScroller();
|
||||
scroller.scrollBy(target, 0);
|
||||
expect(target.position).toBe(0);
|
||||
});
|
||||
|
||||
test('cancel stops the animation', async () => {
|
||||
const scroller = new SmoothScroller();
|
||||
scroller.scrollBy(target, 500);
|
||||
await flushFrames(2);
|
||||
const mid = target.position;
|
||||
scroller.cancel();
|
||||
await flushFrames(20);
|
||||
expect(target.position).toBe(mid);
|
||||
});
|
||||
|
||||
test('handles negative deltas symmetrically', async () => {
|
||||
const scroller = new SmoothScroller();
|
||||
target.position = 500;
|
||||
scroller.scrollBy(target, -300);
|
||||
await flushFrames(120);
|
||||
expect(target.position).toBeCloseTo(200, 1);
|
||||
});
|
||||
|
||||
test('stops cleanly when target is past a clamping boundary', async () => {
|
||||
const max = 100;
|
||||
let position = 0;
|
||||
const clampingTarget: SmoothScrollTarget = {
|
||||
get position() {
|
||||
return position;
|
||||
},
|
||||
set position(value: number) {
|
||||
position = Math.max(0, Math.min(max, value));
|
||||
},
|
||||
};
|
||||
|
||||
const scroller = new SmoothScroller();
|
||||
scroller.scrollBy(clampingTarget, 5000);
|
||||
|
||||
await flushFrames(200);
|
||||
|
||||
expect(position).toBe(max);
|
||||
});
|
||||
});
|
||||
@@ -38,4 +38,15 @@ describe('BookCover', () => {
|
||||
expect(img).toBeTruthy();
|
||||
expect(img?.getAttribute('loading')).toBe('lazy');
|
||||
});
|
||||
|
||||
it('falls back to metadata.author on the fallback cover when book.author is empty', () => {
|
||||
const book = makeBook({
|
||||
author: '',
|
||||
coverImageUrl: undefined,
|
||||
metadata: { author: 'Edited Author' } as Book['metadata'],
|
||||
});
|
||||
const { container } = render(<BookCover book={book} coverFit='crop' />);
|
||||
const fallback = container.querySelector('.fallback-cover');
|
||||
expect(fallback?.textContent).toContain('Edited Author');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
import { describe, it, expect, vi, afterEach } from 'vitest';
|
||||
import { render, cleanup, fireEvent } from '@testing-library/react';
|
||||
|
||||
import { Book } from '@/types/book';
|
||||
import BookDetailView from '@/components/metadata/BookDetailView';
|
||||
import { DropdownProvider } from '@/context/DropdownContext';
|
||||
|
||||
vi.mock('@/hooks/useTranslation', () => ({
|
||||
useTranslation: () => (s: string) => s,
|
||||
}));
|
||||
|
||||
vi.mock('@/store/settingsStore', () => ({
|
||||
useSettingsStore: () => ({
|
||||
settings: {
|
||||
metadataSeriesCollapsed: true,
|
||||
metadataOthersCollapsed: true,
|
||||
metadataDescriptionCollapsed: true,
|
||||
},
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock('@/context/EnvContext', () => ({
|
||||
useEnv: () => ({ envConfig: {}, appService: null }),
|
||||
}));
|
||||
|
||||
vi.mock('@/helpers/settings', () => ({
|
||||
saveSysSettings: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@/components/BookCover', () => ({
|
||||
__esModule: true,
|
||||
default: () => null,
|
||||
}));
|
||||
|
||||
vi.mock('@/hooks/useResponsiveSize', () => ({
|
||||
useResponsiveSize: (n: number) => n,
|
||||
useDefaultIconSize: () => 20,
|
||||
}));
|
||||
|
||||
vi.mock('next/image', () => ({
|
||||
__esModule: true,
|
||||
default: (props: Record<string, unknown>) => {
|
||||
// biome-ignore lint/a11y/useAltText: test mock
|
||||
return <img {...props} />;
|
||||
},
|
||||
}));
|
||||
|
||||
afterEach(() => cleanup());
|
||||
|
||||
const makeBook = (overrides?: Partial<Book>): Book =>
|
||||
({
|
||||
hash: 'abc123',
|
||||
title: 'Test Book',
|
||||
author: 'Test Author',
|
||||
format: 'EPUB',
|
||||
coverImageUrl: 'https://example.com/cover.jpg',
|
||||
createdAt: Date.now(),
|
||||
updatedAt: Date.now(),
|
||||
downloadedAt: Date.now(),
|
||||
uploadedAt: Date.now(),
|
||||
...overrides,
|
||||
}) as Book;
|
||||
|
||||
const renderView = (extra?: Partial<React.ComponentProps<typeof BookDetailView>>) =>
|
||||
render(
|
||||
<DropdownProvider>
|
||||
<BookDetailView
|
||||
book={makeBook()}
|
||||
metadata={null}
|
||||
fileSize={1024}
|
||||
onDelete={vi.fn()}
|
||||
onDeleteCloudBackup={vi.fn()}
|
||||
onDeleteLocalCopy={vi.fn()}
|
||||
{...extra}
|
||||
/>
|
||||
</DropdownProvider>,
|
||||
);
|
||||
|
||||
describe('BookDetailView delete dropdown layout', () => {
|
||||
it('places dropdown-center on the parent dropdown so the menu stays in flow', () => {
|
||||
const { container } = renderView();
|
||||
const toggle = container.querySelector('button[aria-label="Delete Book Options"]');
|
||||
expect(toggle).toBeTruthy();
|
||||
fireEvent.click(toggle!);
|
||||
|
||||
// The parent <details> should center its absolutely positioned content.
|
||||
const details = container.querySelector('details.dropdown');
|
||||
expect(details).toBeTruthy();
|
||||
expect(details!.className).toContain('dropdown-center');
|
||||
|
||||
// The inner menu must NOT carry dropdown-center (which would force
|
||||
// position: absolute on it and detach the menu from its anchor — the bug
|
||||
// reported in https://github.com/readest/readest/issues/3940 where the
|
||||
// menu shifted to the right when items were clicked).
|
||||
const menu = container.querySelector('.delete-menu');
|
||||
expect(menu).toBeTruthy();
|
||||
expect(menu!.className).not.toContain('dropdown-center');
|
||||
// It should keep position: relative via the !relative override so it
|
||||
// anchors against the centered parent.
|
||||
expect(menu!.className).toContain('!relative');
|
||||
});
|
||||
});
|
||||
@@ -80,15 +80,17 @@ describe('HighlightColorsEditor — user color SketchPicker stability', () => {
|
||||
it('keeps the SketchPicker mounted when the user-color hex updates (so drag is not interrupted)', () => {
|
||||
render(<Harness initialUserColors={[{ hex: '#aabbcc' }]} />);
|
||||
|
||||
// The user color row's ColorInput renders a text input with the hex.
|
||||
// Find it (the predefined palette also renders inputs; the user row's
|
||||
// input is last in the document because it's rendered after the defaults).
|
||||
const hexInputs = screen.getAllByDisplayValue(/^#/);
|
||||
const userHexInput = hexInputs[hexInputs.length - 1]!;
|
||||
expect(userHexInput).toHaveProperty('value', '#aabbcc');
|
||||
// ColorInput swatchOnly renders a circular button per color, all with
|
||||
// aria-label "Edit color". Default palette is rendered first, then the
|
||||
// "add new" swatch in the Custom Colors header (aria-label "Add custom
|
||||
// color"), then the existing user colors. Find the last "Edit color"
|
||||
// button — that's the user color we care about.
|
||||
const editColorButtons = screen.getAllByLabelText('Edit color');
|
||||
const userSwatch = editColorButtons[editColorButtons.length - 1]! as HTMLButtonElement;
|
||||
expect(userSwatch.style.backgroundColor).toBe('rgb(170, 187, 204)');
|
||||
|
||||
// Open the SketchPicker for this user color.
|
||||
fireEvent.click(userHexInput);
|
||||
fireEvent.click(userSwatch);
|
||||
|
||||
const picker = screen.getByTestId('mock-sketch-picker');
|
||||
const initialMountId = picker.getAttribute('data-mount-id');
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
import { describe, it, expect, afterEach, vi } from 'vitest';
|
||||
import { render, screen, cleanup } from '@testing-library/react';
|
||||
|
||||
import PinInput from '@/components/PinInput';
|
||||
|
||||
vi.mock('@/libs/crypto/applock', () => ({
|
||||
PIN_LENGTH: 4,
|
||||
}));
|
||||
|
||||
afterEach(cleanup);
|
||||
|
||||
describe('PinInput', () => {
|
||||
it('focuses the input on mount when autoFocus is true', async () => {
|
||||
render(<PinInput value='' onChange={() => {}} ariaLabel='PIN code' autoFocus />);
|
||||
|
||||
const input = screen.getByLabelText('PIN code');
|
||||
await vi.waitFor(() => expect(document.activeElement).toBe(input));
|
||||
});
|
||||
|
||||
it('focuses the input on mount when stickyFocus is true', async () => {
|
||||
render(<PinInput value='' onChange={() => {}} ariaLabel='PIN code' stickyFocus />);
|
||||
|
||||
const input = screen.getByLabelText('PIN code');
|
||||
await vi.waitFor(() => expect(document.activeElement).toBe(input));
|
||||
});
|
||||
|
||||
it('does not focus the input when neither autoFocus nor stickyFocus is set', () => {
|
||||
render(<PinInput value='' onChange={() => {}} ariaLabel='PIN code' />);
|
||||
|
||||
const input = screen.getByLabelText('PIN code');
|
||||
expect(document.activeElement).not.toBe(input);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,123 @@
|
||||
import { cleanup, render } from '@testing-library/react';
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import ProgressBar from '@/app/reader/components/ProgressBar';
|
||||
import { DEFAULT_VIEW_CONFIG } from '@/services/constants';
|
||||
import type { ViewSettings } from '@/types/book';
|
||||
|
||||
const saveViewSettings = vi.fn();
|
||||
|
||||
let currentViewSettings: ViewSettings;
|
||||
|
||||
vi.mock('@/hooks/useTranslation', () => ({
|
||||
useTranslation: () => (s: string) => s,
|
||||
}));
|
||||
|
||||
vi.mock('@/context/EnvContext', () => ({
|
||||
useEnv: () => ({ envConfig: {}, appService: { isMobile: false, hasSafeAreaInset: false } }),
|
||||
}));
|
||||
|
||||
vi.mock('@/store/readerStore', () => ({
|
||||
useReaderStore: () => ({
|
||||
getProgress: () => null,
|
||||
getViewSettings: () => currentViewSettings,
|
||||
getView: () => ({ renderer: { page: 0, pages: 0 } }),
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock('@/store/bookDataStore', () => ({
|
||||
useBookDataStore: () => ({
|
||||
getBookData: () => ({ isFixedLayout: false }),
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock('@/helpers/settings', () => ({
|
||||
saveViewSettings: (...args: unknown[]) => saveViewSettings(...args),
|
||||
}));
|
||||
|
||||
vi.mock('@/utils/event', () => ({
|
||||
eventDispatcher: { dispatchSync: () => false },
|
||||
}));
|
||||
|
||||
vi.mock('@/app/reader/components/StatusInfo.tsx', () => ({
|
||||
default: () => null,
|
||||
}));
|
||||
|
||||
const baseSettings: ViewSettings = {
|
||||
...DEFAULT_VIEW_CONFIG,
|
||||
} as ViewSettings;
|
||||
|
||||
const renderProgressBar = () =>
|
||||
render(
|
||||
<ProgressBar
|
||||
bookKey='book-1'
|
||||
horizontalGap={0}
|
||||
contentInsets={{ top: 0, right: 0, bottom: 0, left: 0 }}
|
||||
gridInsets={{ top: 0, right: 0, bottom: 0, left: 0 }}
|
||||
/>,
|
||||
);
|
||||
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
saveViewSettings.mockClear();
|
||||
});
|
||||
|
||||
describe('ProgressBar — tap-to-toggle disabled reverts hidden footer', () => {
|
||||
it("resets progressInfoMode to 'all' when the user disables tapToToggleFooter while mode was 'none'", () => {
|
||||
// Simulate a user who tapped the footer to dismiss it (mode='none')
|
||||
// while tapToToggleFooter was on. Now they have it switched off.
|
||||
currentViewSettings = {
|
||||
...baseSettings,
|
||||
tapToToggleFooter: false,
|
||||
progressInfoMode: 'none',
|
||||
} as ViewSettings;
|
||||
|
||||
renderProgressBar();
|
||||
|
||||
// The persisted progressInfoMode should be reset to the default
|
||||
// ('all') so the footer reverts to its default visibility.
|
||||
const persistCalls = saveViewSettings.mock.calls.filter(
|
||||
(args) => args[2] === 'progressInfoMode',
|
||||
);
|
||||
expect(persistCalls.length).toBeGreaterThanOrEqual(1);
|
||||
const lastCall = persistCalls[persistCalls.length - 1]!;
|
||||
expect(lastCall[3]).toBe('all');
|
||||
});
|
||||
|
||||
it("does not overwrite mode when tapToToggleFooter is on (user's cycled state stays)", () => {
|
||||
currentViewSettings = {
|
||||
...baseSettings,
|
||||
tapToToggleFooter: true,
|
||||
progressInfoMode: 'none',
|
||||
} as ViewSettings;
|
||||
|
||||
renderProgressBar();
|
||||
|
||||
// initial save mirrors the existing mode; importantly we never see
|
||||
// a save with 'all' overriding the user's tap-cycled choice.
|
||||
const persistCalls = saveViewSettings.mock.calls.filter(
|
||||
(args) => args[2] === 'progressInfoMode',
|
||||
);
|
||||
expect(persistCalls.every((args) => args[3] === 'none')).toBe(true);
|
||||
});
|
||||
|
||||
it("leaves mode untouched when tapToToggleFooter is off but mode is already 'all'", () => {
|
||||
currentViewSettings = {
|
||||
...baseSettings,
|
||||
tapToToggleFooter: false,
|
||||
progressInfoMode: 'all',
|
||||
} as ViewSettings;
|
||||
|
||||
renderProgressBar();
|
||||
|
||||
const persistCalls = saveViewSettings.mock.calls.filter(
|
||||
(args) => args[2] === 'progressInfoMode',
|
||||
);
|
||||
// Either no save or a save matching the existing 'all' value — never
|
||||
// a transition through some intermediate state.
|
||||
expect(persistCalls.every((args) => args[3] === 'all')).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -8,6 +8,10 @@ vi.mock('@/services/environment', async () => {
|
||||
|
||||
const mockAppService = {
|
||||
init: vi.fn().mockResolvedValue(undefined),
|
||||
// EnvProvider's mount effect calls appService.loadSettings() to seed
|
||||
// replica sync. Returning a settings object without replicaDeviceId
|
||||
// makes init early-exit cleanly (no warn, no real network).
|
||||
loadSettings: vi.fn().mockResolvedValue({}),
|
||||
// Add any other methods from AppService interface
|
||||
};
|
||||
|
||||
@@ -233,4 +237,23 @@ describe('ProofreadPopup Component', () => {
|
||||
expect(mockOnClose).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Manage Replacement Rules Shortcut', () => {
|
||||
it('should not render manage button when onManage is not provided', () => {
|
||||
renderWithProviders(<ProofreadPopup {...defaultProps} />);
|
||||
|
||||
expect(screen.queryByLabelText('Proofread Replacement Rules')).toBeNull();
|
||||
});
|
||||
|
||||
it('should render manage button and invoke onManage when provided', () => {
|
||||
const mockOnManage = vi.fn();
|
||||
renderWithProviders(<ProofreadPopup {...defaultProps} onManage={mockOnManage} />);
|
||||
|
||||
const button = screen.getByLabelText('Proofread Replacement Rules');
|
||||
expect(button).toBeTruthy();
|
||||
|
||||
fireEvent.click(button);
|
||||
expect(mockOnManage).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -61,7 +61,13 @@ vi.mock('@/services/environment', async (importOriginal) => {
|
||||
: {}), // keep all real default fields
|
||||
API_BASE: 'http://localhost',
|
||||
ENABLE_TRANSLATOR: false,
|
||||
getAppService: vi.fn().mockResolvedValue(null),
|
||||
// EnvProvider's mount effect calls appService.loadSettings() to seed
|
||||
// replica sync. Stubbing with loadSettings returning {} (no
|
||||
// replicaDeviceId) makes init early-exit cleanly. Returning null
|
||||
// would crash on `service.loadSettings()` and spam stderr.
|
||||
getAppService: vi.fn().mockResolvedValue({
|
||||
loadSettings: vi.fn().mockResolvedValue({}),
|
||||
}),
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user